Análise Média Móvel Simples


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 ShareYour 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. Posso entender sua frustração - mais ainda, quando o contexto de codificação LV é diferente em ambas as nossas vidas. Para mim como um O engenheiro mecânico é um add-on e o que começou como uma passagem de tempo. Portanto, o código pode não ser o mais eficiente ou extrair a última gota de suco da CPU. Na verdade, em aplicativos de controle de máquina, o conjunto da CPU não faz nada Mais vezes do que executar o código de controle. E com processadores como i5 ou i7, torna ainda mais fácil. Não estou dizendo que o código eficiente é um desperdício de tempo - estou apenas dizendo que o contexto é diferente. Aqui está outro rápido e sujo que funciona desde o primeiro fe Os valores w são ignorados - não é um grande problema em um aplicativo de registro de dados que funciona por horas a fio. Raghunathan LV2012 para automatizar plataformas de teste hidráulico. Desculpe, você tem uma consideração tão baixa quanto à elegância e à exatidão, e que você sente que Good Enough é bastante bom. Talvez, no futuro, você consulte alguém que conheça e compreenda o LabVIEW e simplesmente diga a ele (ou ela) o que você quer fazer e deixe-os fazer isso por você. No entanto, se o seu objetivo é (a) coletar dados de canais N na freqüência F (em Hz), mas para exibir a média de pontos M (então, para cada M pontos você gera gráfico 1 ponto, a média dos pontos M ), É uma boa maneira de fazê-lo: crie um loop de produtor que gere os dados configurando seu dispositivo de amostragem para lhe dar M Pontos de N canais, amostrados na freqüência F. Isso deve ser uma matriz 2D (M fileiras de N colunas) . Coloque isso em uma fila e repita, repetidamente, até que o botão Parar seja pressionado. Depois de sair do Producer Loop, envie mais uma matriz 2D vazia (você verá por que em um momento). Crie um Loop Consumidor paralelo e alimente-o na Fila usada pelo Loop Produtor. Dequeue the Data Array - se estiver vazio, foram concluídas, então, solte a fila e pare o Consumer Loop. Caso contrário, precisamos consumir (em média e traçar) os dados. Precisamos transpor a matriz M Points by N Channels para um N Channel por M Points array. Alimente esta Array para um Loop For (que irá percorrer os Canais), calcular a Média dos Pontos M e produzir esta Média. Queremos traçar esse ponto (único) de todos os canais N, então passe-o através do Build Array para criar uma matriz 1 por N, e traça isso. Aqui está um trecho no LabVIEW 2012 que permite simular tudo isso (ele gera pontos na freqüência que você especifica, máximo 1KHz). Eu também escala o gráfico para que o tempo seja em segundos. Isso não traduziu bem para o Snippet - eu realmente usei um Nó de Propriedade de Dados Média lá. Isso, penso eu, faz o que eu entendo que você realmente queria, ou seja, ter uma tela que mostra a média (em uma taxa de enxerto mais lenta que os dados). Você notará que cada Canal tem um deslocamento diferente, então, quando você olha o enredo, você deve ver 16 linhas, ficando cada vez mais suave à medida que aumenta o Tamanho da Amostra. Você precisa especificar os parâmetros antes de executar o código, uma vez que os princípios do Fluxo de Dados (no qual o LabVIEW está baseado) ignorarão as alterações que você fizer nos Controles quando o programa estiver sendo executado. Primeiro deixe-me agradecer a resposta detalhada e o trecho de código. Eu aprecio sua intenção de ajudar. Minha resposta anterior possivelmente soou um pouco bruta, mas eu serei a última pessoa a tirar algo que é meio cozido ou instável. Deixe-me explicar: Minha linha de atividade hidráulica de óleo e eu tenho minha própria empresa estabelecida em 1995 e como uma proposição de adição de valor, forneço sistemas integrados com instrumenation e software. Operamos em dois principais vertciais - WInd Turbines and Test Systems. E até agora, nós fornecemos muitos sistemas completos que são amplamente utilizados na indústria automotiva aqui na Índia e na Europa. Mas minha empresa não é uma organização enorme e é de tamanho médio e aqui há uma captura - é quase impossível encontrar programadores LabVIEW experientes. A Índia tem um enorme grupo de engenheiros de software, mas todos estão em computação de desktop e os engenheiros na Computação Física são quase nulos ou desprezíveis. Portanto, quando os clientes vêm para mim com novos requisitos (confie em mim - todos são diferentes) eu aceito o desafio pessoalmente, mas para entregar, eu depender inteiramente do suporte da comunidade on-line. Todate, desenvolvi com sucesso o código LV para obter dados via CanOpen, Modbus RTU, Profinet e EtherCAT. Com essa variedade e pouco tempo para exigências do mercado, eu simplesmente não tenho recursos para implantar uma enorme equipe para entregar. Então, ele se resume ao desenvolvimento de código básico ou óbvio que faz o que é suposto e se o cliente está bem com isso - deixe lá. É uma diferença entre o código funcional e o código inteligente e eu estava insinuando o anterior. E não está desenvolvendo código complicado Com seu código de exemplo - esse modelo de consumidor de produtor é regular, que eu uso para todos os meus projetos onde eu tenho o Main como o produtor e os Sub VIs como consumidor. Com o fluxo de dados através da fila. Estudo mais detalhadamente. Raghunathan LV2012 para automatizar plataformas de teste hidráulico. Média móvel simples. Normalmente, quando as pessoas falam sobre uma média móvel, elas significam substituir o ponto N pela média dos pontos M em torno do ponto N. Suponha que eu tenha 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, 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 (838 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 acrescentar 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, 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 (741 Visualizações) Re: Simple Moving Average VI 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 Média em cada canal, o subVI precisa manter uma matriz 2D no subVI. Tudo isso foi feito antes. Mensagem 10 de 15 (725 Visualizações)

Comments

Popular Posts