Thursday 17 August 2017

Média Móvel De Labview Vi


Calculando a média móvel Este VI calcula e exibe a média móvel, usando um número pré-selecionado. Primeiro, o VI inicializa dois registros de deslocamento. O registro de deslocamento superior é inicializado com um elemento e, continuamente, adiciona o valor anterior com o novo valor. Este registro de deslocamento mantém o total das últimas x medições. Depois de dividir os resultados da função de adicionar com o valor pré-selecionado, o VI calcula o valor médio móvel. O registro de deslocamento inferior contém uma matriz com a dimensão Média. Este registro de deslocamento mantém todos os valores da medida. A função de substituição substitui o novo valor após cada loop. Este VI é muito eficiente e rápido porque usa a função de elemento de substituição dentro do loop while e ele inicializa a matriz antes de entrar no loop. Este VI foi criado no LabVIEW 6.1. Bookmark amp ShareComo crio um n-point running average VI Ive sido programação em linguagens seqüenciais escritas como C por muitos anos agora. Eu tenho usado o LabVIEW nos últimos 4 meses e estou tendo problemas ao escrever um VI médio de execução de n-ponto. Isso realmente me incomoda, porque isso seria realmente trivial em C ou qualquer outra coisa. Mas por algum motivo eu não consigo conceber como eu faria isso no LabVIEW. Eu usei o LabVIEW 5 pela maior parte desse tempo, e acabamos de atualizar para o LabVIEW 8 na semana passada, então eu tenho aprendido. Uau, algumas diferenças bastante grandes entre os dois, mas a essência é a mesma. Eu tenho um subVI de média de execução de 5 pontos escrito que usa um loop run-once while com shift-registres que mantêm seu valor entre as chamadas VI subseqüentes. Isso funciona para o que eu preciso, mas tenho dois problemas que eu gostaria de superar. 1. Eu não posso ter múltiplas instâncias do mesmo subVI no meu programa VI de nível superior porque a maneira como os registros de deslocamento mantêm seu valor entre as chamadas VI subsequentes. Eu tenho que fazer duplicatas do arquivo. vi (ou seja, 5pointrunningaverage. vi, 5pointrunningaverage2.vi) para manter todos os registros de mudanças separados. 2. Eu quero que seja uma média em execução de n-ponto. Atualmente eu tenho que pular no VI e adicionar outro registro de deslocamento para adicionar outro ponto. Muitas vezes, mudo minha taxa de amostragem e, portanto, ser capaz de ter uma janela de média diferente é realmente útil. Então, o VI leva 2 entradas: n - (número inteiro) o número de pontos para o computador supera a média. In - (real) o ponto de dados atual. Outi (ini ini-1. Ini-n-1). Também pensei na possibilidade de precisar de uma terceira entrada que seja instância que possa ajudar a manter as variáveis ​​dentro do subVI separadas e, portanto, não precisar de arquivos duplicados separados. No caso de você se perguntar, estou usando uma média de corrida para tornar os HUDs digitais fáceis de ler. Os dados reais que eu estou gravando no arquivo não estarão passando pela função de média em execução, porque, como você pode ver pela função de saída, haverá uma mudança de fase na saída. Com altas taxas de amostragem, as telas digitais podem se mover muito rapidamente e isso dificulta a leitura. Outras recomendações sobre como tornar os ecrãs digitais fáceis de ler para ajudar as operadoras ao realizar testes. Quanto ao alisamento instantâneo de dados, por assim dizer. Eu já faço os monitores muito grandes se eles são críticos. Estou muito interessado nesta solução média em execução do n-ponto. Estive revirando minha cabeça por algum tempo agora e estou bastante perplexo em como abordar isso no LabVIEW. A ajuda é muito apreciada, - nickerbocker As operações atômicas (deleteinsert) DEVE fazer o seguinte: Quando você inserir na matriz, todos os elementos superiores precisam ser movidos para cima de um slot, então o elemento é inserido. Quando você exclui da matriz, o lement precisa ser excluído e todos os elementos superiores movem para baixo um slot. Ambas as operações envolvem uma operação de redimensionamento da matriz e a troca de dados na memória. Como o LabVIEW pode ter certeza de que a memória pode ser reutilizada. E se o seu código deletar um, mas insira dois em cada iteração. Pode ser que o compilador do LabVIEW reutilize corretamente a memória em seu caso particular, mas não há Garantias. Uma disposição de cinco elementos é amendoim. Então provavelmente seria difícil notar uma diferença. Você pode querer executar um benchmark dos diferentes algoritmos usando um buffer enorme. A primeira chamada é definida como segue na ajuda on-line: First Call retorna TRUE a primeira vez que o VI é executado após o primeiro chamador de nível superior começar a ser executado, como quando o botão Executar é clicado ou o método Run VI é executado. Se um segundo chamador de nível superior chama o VI enquanto o primeiro chamador de nível superior ainda está em execução, First Call não retorna TRUE por segunda vez. Só será verdade exatamente uma vez durante toda a execução do VI de nível superior, apenas a primeira vez que for chamado de qualquer lugar. Média móvel em miniatura simples geralmente, quando as pessoas falam sobre uma média móvel, significam substituir o ponto N pela média dos pontos M Em torno do ponto N. Suponha que eu tenho 100 pontos cujos valores são 1, 2, 3. 100, e eu quero fazer uma média móvel de 5 pontos. A primeira coisa a notar é que existe uma média móvel do terceiro ponto é a média de 1, 2, 3, 4, 5 3. A média do quarto ponto é a média de 2, 3, 4, 5, 6 4. No entanto, este é talvez um exemplo muito simples. Como sobre a média de uma função Step, 0 de 1 a 10, então 20 depois. Novamente, jogue fora os pontos 1 e 2. A média dos pontos 1-5 (para entrar no ponto 3) 0 (já que todos os pontos são 0). Da mesma forma com o ponto 4, 5, 6,7 e 8. No entanto, o ponto 9 é a média de 0, 0, 0, 0, 20 4. Como sobre o ponto 10 Bem, deve ser a média de 0, 0, 0 , 20, 20 8, mas você se lembrou de não substituir Point 9 Hmm, parece que precisamos manter duas cópias da matriz (o que, em geral, é caro). Há várias maneiras de evitar isso. Você entende onde o problema surge no parágrafo anterior Se não, tente fazer isso com lápis e papel (ou tente codificá-lo no LabVIEW). Eu vou dar-lhe a resposta para que você possa verificar - a média móvel da função Step é -, -, 0, 0, 0, 0, 0, 0, 0, 4, 8, 12, 16, 20, 20 , 20. -, - (onde - são os valores vazios nas extremidades da matriz, os pontos que você não tem vizinhos suficientes). P. S. - não me surpreenderia se houvesse uma função LabVIEW que faça isso por você. Mas se você está aprendendo o LabVIEW e quer ter uma melhor compreensão de como os algoritmos que você está conectando no trabalho, nunca dói jogar e experimentá-lo sozinho. Você pode até encontrar uma melhoria (vários de nós já o fizeram). Obrigado por sensibilizar sobre os pontos mais finos do método da Moeda Variável. Esta é uma ferramenta estatística que ajuda a ver o que você deseja ver, abstraindo os distractores. Portanto, o método é obrigado a ter algumas falhas em algumas situações ou contexto. Mas acho que é perfeitamente adequado para o meu tipo de registro de dados dof - é uma pressão ou temperatura ou sinal de fluxo - e adquiro em algo como 400 amostras de segundo e depois use uma amostra única calculada em média. E o processo é bastante lento, pois meu código principal é executado a uma velocidade não superior a 20 Hz. Então, quando eu faço uma média de 5 amostras, a minha primeira amostra chega 5 x 50 ms depois, então, por cada 50 ms, recebo uma amostra válida. Basicamente, estou mais preocupado com as tendências e sem valores pontuais. Nisto há pouca preocupação com amostras perdidas ou valores desonesto. Claro, eu não ousaria usar isso para uma função Step. Isso seria cruel. Raghunathan LV2012 para automatizar plataformas de teste hidráulico. Mensagem 4 de 15 (823 Visualizações) Re: Simple Moving Average VI 03-30-2016 11:58 PM Há ptbypt médio que faz o mesmo. Você pode inspecionar o código se desejar. Uma grande falha em seu código é o fato de que você cresce constantemente e encolhe uma matriz existente. Você deve tentar encontrar uma solução que funcione no local em uma matriz de tamanho fixo. Alguns exemplos foram postados no fórum ao longo dos anos (veja hee, por exemplo). A média não se importa se os elementos estão fora de ordem, então você pode simplesmente substituir o elemento mais antigo, não importa onde ele esteja localizado. Você também está antecipando o novo elemento ao início de uma matriz existente, que é sempre muito mais cara do que adicionar até o fim. O tamanho da amostra não pode mudar quando o VI estiver sendo executado. Seu registro de deslocamento deve ser inicializado com uma matriz vazia, não uma matriz que já contém um único elemento que é zero. (Este zero extra dará médias erradas) Seu código deve ser transformado em um subVI para que ele possa ser reutilizado (semelhante à versão Ptbypt). Seu VI nunca pode ser interrompido, apenas abortado. Boas dicas de otimização. O ponto de inicialização com o Zero me perdeu. E sim, o usuário não deve alterar o tamanho da amostra uma vez que ele começa a ser executado. Finalmente, vou fazer um SubVI e lidar com coisas como parar, etc. Quanto ao ponto de prepender do que adicionar o novo valor à matriz, talvez haja uma penalidade de desempenho, mas dado o tamanho da minha matriz, estou certo de que a CPU não se importa com a velocidade . Mas para mim tem que ser assim, pois uso os dados finais para traçar uma tendência de um parâmetro físico. Obrigado pelo seu tempo. Raghunathan LV2012 para automatizar plataformas de teste hidráulico. Obrigado por sensibilizar sobre os pontos mais finos do método da Moeda Variável. Esta é uma ferramenta estatística que ajuda a ver o que você deseja ver, abstraindo os distractores. Portanto, o método é obrigado a ter algumas falhas em algumas situações ou contexto. Mas acho que é perfeitamente adequado para o meu tipo de registro de dados dof - é uma pressão ou temperatura ou sinal de fluxo - e adquiro em algo como 400 amostras de segundo e depois use uma amostra única calculada em média. E o processo é bastante lento, pois meu código principal é executado a uma velocidade não superior a 20 Hz. Então, quando eu faço uma média de 5 amostras, a minha primeira amostra chega 5 x 50 ms depois, então, por cada 50 ms, recebo uma amostra válida. Aha Então você não quer uma média móvel, mas apenas uma média simples. Isso é muito mais fácil. É a idéia (o que funciona muito melhor com um Design ProducerConsumer) - Digamos que você esteja fazendo amostragem a 400Hz, quer salvar os dados em 400 Hz (ou seja, salvar todos os dados no disco), mas deseja exibir a 20 Hz (porque você Quer ver tendências, uma base de tempo mais longa, etc.). Configure seu sistema AD para coletar 20 amostras a 400Hz (note que você pode coletar N Canais ao mesmo tempo, dando-lhe uma matriz 2D de amostras. À medida que você obtém os dados (a 20 Hz) do AD (tornando este o Produtor) O consumidor começa escrevendo os dados no disco (não deve demorar muito tempo). Agora você tem uma matriz 2D - em um Loop For, em um canal por canal, média dos 20 pontos. Agora você tem uma matriz 1D, com um ponto invertido para cada canal. Avance e trafique. Observe que este esquema (a) usa todos os dados, (b) manipula dados multicanal com aplomo (e, se você estiver Do Oriente Médio, onde eles crescem, você também pode lidar com seus dados com uma ameixa suculenta), e (c) permite que você colete seus dados do equipamento AD, guarde seus dados no disco mantendo todos os pontos e mostre seus dados em A tela usando todos os seus pontos, mas também progride para melhorar a relação sinal / ruído visual, tudo sem perder dados (Ive fez exatamente isso com 24 canais a 1KHz, com Os dados foram retirados em um sistema remoto e enviados para o PC via TCPIP, então também temos processamento TCP no loop). Bem-vindo ao mundo emocionante de aquisição e processamento de dados com o LabVIEW. Confie em mim, este é um sistema maravilhoso para fazer este tipo de trabalho Com base nos comentários que recebi no meu VI original, eu refinei o código da Moeda Mínima para um subVI. Então usei-o para uma média de dados simulados de 10 canais, apenas para manter as coisas simples, certifiquei-me de que todos os canais tinham dados idênticos. Espera-se então obter a mesma média móvel para os 10 canais. Estou surpreso com a pequena variação que notei entre canais - geralmente eles são próximos, mas não exatos. E apenas para explicar o processo que estou tentando, eu também encerrei um XLS. Então, de onde vem a variação. O registro de desligamento não inicializado dentro do Sub VI. Raghunathan LV2012 para automatizar plataformas de teste hidráulico. Mensagem 9 de 15 (726 Visualizações) Re: Simple Moving Average VI altenbach 04-01-2016 10:25 AM Seu código ainda não faz sentido. Quando você está chamando o subalterno um escalar de cada vez, você não está recebendo o que deseja porque o registro de desligamento apenas relembra os últimos N escalares, independentemente do canal de que seja. Seu código ainda é muito ineficiente e complicado. (Por exemplo, por que você ainda está usando a inserção na matriz para anexar (tanto no mani nad no sub). (Você poderia usar um subVI reenetrante e um loop FOR mais interno paralelo, mas isso parece excessivamente complicado também) Se você quer fazer um A média de execução em cada canal, o subVI precisa manter uma matriz 2D no subVI. Tudo isso foi feito antes. Mensagem 10 de 15 (710 Visualizações)

No comments:

Post a Comment