Sunday, 15 October 2017

Labview Exponencial Média Móvel


Filtro Médico em Movimento w aquisição de dados contínuos Estou procurando filtrar vários sinais ruidosos. Atualmente, estou usando um NI9203 com uma amostragem cDAQ-9174 a 1000Hz. Eu uso DAQmx vis para iniciar a tarefa e adquirir o sinal. Eu tentei usar coeficientes de filtragem de suavização. vi emparelhado com IIR filter. vi (Moving Avg. png) isso parece funcionar para sinais simulados e para dados registrados. No entanto, quando tento usar esta configuração para a média em tempo real, simplesmente corta todos os sinais para zero. Eu olhei para usar registros de deslocamento, mas para obter o resultado necessário, parece que eu teria que usar centenas de elementos. Em última análise, estou tentando filtrar o sinal para obter uma leitura mais constante para o usuário. Por exemplo durante a operação, o usuário precisa rever o status atual dos valores em tempo real. Isso é difícil atualmente quando o ruído mostra valores - 100 mudando a cada 100ms. Qualquer ajuda ou sugestão será apreciada, obrigado antecipadamente. Mensagem 1 de 9 (6,011 Visualizações) Re: Moving Average Filter w aquisição de dados contínuos 09-25-2013 12:31 PM Sem anexar o seu VI, você não fornece informações suficientes para ajudá-lo. Errar é humano, mas realmente sujar isso requer um computador. O otimista acredita que estamos no melhor de todos os mundos possíveis - o pessimista teme que isso seja verdade. A linguagem é a linguagem que todos os programadores conhecem melhor. Um especialista é alguém que cometeu todos os possíveis erros. Para aprender algo sobre o LabVIEW sem custo extra, trabalhe no tutorial online LabVIEW: Mensagem 2 de 9 (6.008 Visualizações) Re: Filtro Médio em Movimento w aquisição contínua de dados no crossrulz 09-25-2013 12:37 PM Como você é Tentando perfolar um filtro ao mesmo tempo em que coleta dados continuamente, você pode querer examinar os VIs de filtro de ponto a ponto. Você precisará colocar seus dados de forma de onda em um loop FOR para processá-lo, mas pode ser executado em tempo real para você. Há apenas duas maneiras de agradecer a alguém: Kudos e Marked Solutions Regras e Diretrizes do Fórum não oficial As discussões da Advanced User Track não acabaram. Participe da conversa: Usuários avançados de 2016 Acompanhe os participantes da NI-Week, clique aqui para fazer a pesquisa para as sessões que você assistiu Mensagem 3 de 9 (6.003 Visualizações) Re: Filtro Médico em Movimento w aquisição contínua de dados 09-25-2013 01 : 41 PM Anexei uma versão ligeiramente simplificada do meu vi. Não tenho certeza de como eu implementaria um loop for sem interromper o loop do consumidor. Do meu entendimento, se eu inserir um For Loop, o loop while deixaria de funcionar e, portanto, não registraria dados até que o loop for concluído, esta pausa do loop while aconteceria cada interação do loop while dando dados inconsistentes. Mensagem 4 de 9 (5,989 Visualizações) Re: Moving Average Filter w aquisição de dados contínuos 09-25-2013 02:43 PM Você não anexou seu VI, mas uma imagem de um ponto no tempo de sua execução VIs, existem estados Não mostrado, não há conexão visível ao seletor de caso para o estado que você está mostrando, o Boolean 3 aparentemente está no meio do nada, e a imagem inteira não tem conexão com a filtragem que você disse que estava tentando fazer em A publicação original. Uma coisa que ocorre para mim, no entanto, é que IMHO você está tentando fazer muito demais no loop do produtor. Você procurou sine. NI para escrever sobre esta arquitetura. Você pode querer fazer isso e aproveitar várias boas explicações e exemplos de programas P-C, então veja onde o seu é qualitativamente diferente. De qualquer forma, sem enviar um VI relevante para a sua pergunta (e algumas imagens de dados dos resultados para aqueles que não temos o seu equipamento exato), é por isso que posso ir aqui. Outros podem ser capazes de lhe dar uma melhor adivinhação sobre o que está acontecendo, mas ainda será um palpite. Errar é humano, mas realmente sujar isso requer um computador. O otimista acredita que estamos no melhor de todos os mundos possíveis - o pessimista teme que isso seja verdade. A linguagem é a linguagem que todos os programadores conhecem melhor. Um especialista é alguém que cometeu todos os possíveis erros. Para aprender algo sobre o LabVIEW sem custo extra, trabalhe no tutorial online LabVIEW: não estou tentando dar uma leitura sobre a etiqueta do fórum, apenas apontando as informações que facilitariam a sua ajuda das pessoas boas Aqui (talvez até eu possa ajudá-lo). Se você pode reduzir seu programa para a parte com a qual você está tendo problemas, isso ajudará. Mesmo se você estiver usando o material da DAQ para tirar dados e alguém não tiver o mesmo equipamento, muitas vezes a estrutura do VI é reconhecível o suficiente para que eles possam ajudar. Se você pode incluir um fluxo de entrada de dados de entrada típico que resulte em saída incorreta, ele também ajuda. Quanto ao seu VI, eu provavelmente dividi-lo em três loops, o primeiro apenas para levar os dados, em segundo lugar para registrar um arquivo e terceiro para filtrar o benefício dos usuários. Como Crossrulz disse, você pode usar um filtro ponto-a-ponto em um loop FOR dentro do loop de filtragem, então você não perderá nenhum dado porque não afeta essa função. Errar é humano, mas realmente sujar isso requer um computador. O otimista acredita que estamos no melhor de todos os mundos possíveis - o pessimista teme que isso seja verdade. A linguagem é a linguagem que todos os programadores conhecem melhor. Um especialista é alguém que cometeu todos os possíveis erros. Para aprender algo sobre o LabVIEW sem custo extra, trabalhe o (s) tutorial (s) online LabVIEW: exponentia l resposta média em mudança fpga Tenho um problema com o meu filtro, o filtro de média móvel ponderada exponencial (IIR 1.st order). Do livro: Compreendendo o processamento do sinal digital (Lyons Richard) Tenho a seguinte fórmula calculando a frequência 3dB (fc) do alfa. Alpha é o parâmetro para controlar o filtro. Equação diferencial do filtro: ynxnalpha (1 - alfa) yn-1 Relação entre fc e alfa: alfa cos (2fcfs) - 1 sqrtcos (2fcfs) - 4cos (2fcfs) 3 Se eu agora escolher uma frequência 3dB de 0,0794Hz (tempo Constante (TC) 2s) alfa 0,00169621. (Fs94Hz) Para uma primeira ordem de filtro IIR, o tempo de subida (ta) da resposta constante (de 10 a 90) é: ta2,2TC, o que resulta em ta 4,4s. Mas se eu simular a resposta passo a passo, meu tempo de subida é cerca de 3 vezes desse valor às 14s. Eu não posso explicar por que a resposta de passo do meu filtro difere tanto. Para o meu filtro de média móvel, o tempo de subida calculado e simulado é igual. Eu tenho o vi que é executado no FPGA anexado. Talvez alguém possa encontrar um erro. (Veja também o filtro alfa ou o filtro RC) A sua frequência de amostragem (fs) está correta Se o tempo de loop não corresponder, isso explicaria isso. Os seus tipos de dados ficam bons (para obter alfa dentro de 1). Mas eu sugiro uma pequena alteração na implementação. Por enquanto, é um pouco propenso a arredondar a deriva, porque (1-alfa) é repetidamente multiplicado pelo yn-1. Um método um pouco mais confiável é dizer yn yn-1 (alfa (xn-yn-1)). A diferença é sutil, mas me dá melhores resultados muitas vezes. E elimina um se multiplica. A propósito, o número do reinterpret faz o mesmo que o seu conversor de FXP para o bool, em seguida, de volta. É um pouco menos confuso, no entanto. Estou um pouco perplexo com o loop temporizado que nunca percorre. Isso impõe o tempo dessa forma (eu assumi que não seria, então nunca usei eu uso o Loop Timer em vez disso.) CLD User desde rev 8.6. Mensagem 2 de 13 (914 Visualizações) Re: exponentia l media média resposta passo fpga 10-01-2015 02:05 AM - editado 10-01-2015 02:17 AM Obrigado pela sua resposta. 1, provendo minha freqüência de amostragem com o temporizador de loop. Minha entrada é 425.532 carrapatos que é igual a 94 Hz. Este tickrate é confirmado por ticks EWMA. - Talvez alguém possa testar o código e me dizer 2, encontrei sua abordagem na seção truques e tipps do livro de Lyons. Vou tentar, mas você poderia explicar a rodada, um pouco, eu sou bastante novo nessa área. Existe um benefício adicional de eliminar um multiplicador, exceto os recursos. A resposta de freqüência, a resposta de impulso e a resposta por etapas são iguais 3, Se eu for apenas um bithift, eu sou amável com esse método Não tenho certeza se a função reinterprate usa menos recursos. Mas obrigado por notar isso. 4, o loop temporizado itera todos os 425.532 tiques uma vez. Então, com uma freqüência de 94Hz, um valor é calculado pelo código, pois o código dentro do loop temporizado só precisa de uma iteração. Ou eu sinto falta de sua pergunta. Não tenho certeza do que outras informações você precisa. Tento comparar a resposta gradual de uma média móvel com uma média móvel exponencial (EWMA). Na verdade, eu só quero confirmar a teoria. Como mencionei acima para obter uma constante de tempo de 2s a uma taxa de amostragem de 94Hz, o alfa deve ser 0,00169. O tempo de subida da resposta de passo de 10 a 90 do valor final difere da teoria. O tempo de subida deve ser 4,4 com constante de tempo 2s, mas eu recebo quase 14s se eu executar meu código no FPGA. Eu confirmei que, com o alfa 0,00169, meu código leva amostras de 1297 para obter de 0,1 a 0,9 (o valor final é 1, valor inicial 0). Como você pode ver no meu código, verifico o tempo do loop com o indicador marca a ewma para confirmar a taxa de amostragem do SCTL. Alguém pode confirmar as 1297 amostras que são necessárias no alfa 0,00169 Porque eu penso, que eu preciso de muitas amostras para alcançar o valor de 0,9. Eu já implementei a versão EWMA sugerida a partir da primeira resposta. O mesmo problema aqui. Mensagem 5 de 13 (864 Visualizações) Re: exponentia l resposta de mudança de média em movimento fpga 10-01-2015 08:13 AM - editado 10-01-2015 08:15 AM 1, provendo minha freqüência de amostragem com o temporizador de loop. Minha entrada é 425.532 carrapatos que é igual a 94 Hz. Este tickrate é confirmado por ticks EWMA. - Talvez alguém possa testar o código e me dizer 2, encontrei sua abordagem na seção truques e tipps do livro de Lyons. Vou tentar, mas você poderia explicar a rodada, um pouco, eu sou bastante novo nessa área. Existe um benefício adicional de eliminar um multiplicador, exceto os recursos. A resposta de freqüência, a resposta de impulso e a resposta por etapas são iguais 3, Se eu for apenas um bithift, eu sou amável com esse método Não tenho certeza se a função reinterprate usa menos recursos. Mas obrigado por notar isso. 4, o loop temporizado itera todos os 425.532 tiques uma vez. Então, com uma freqüência de 94Hz, um valor é calculado pelo código, pois o código dentro do loop temporizado só precisa de uma iteração. Ou eu sinto falta de entender sua pergunta, usei uma planilha para simular e obtenho quase exatamente a mesma resposta (1299 ciclos para passar de 0,1 a 0,9). As folhas de cálculo são uma ferramenta útil para testar cálculos. 1. Ok. Nunca usei o Single-Cycle-Timed-Loop (SCTL) com o T escrito para a parada. Isso forçaria as funções de matemática a serem de um único ciclo, mas não tenho certeza se isso é alguma vantagem. Eu só queria ter certeza de que o tempo foi confirmado, e é. 2. A derivação do round-off provavelmente não aparecerá, a menos que sua entrada seja pequena (menos de 0,1). Vejo agora que você tem 40 bits (39 direito do decimal) para o feedback. Isso leva um pouco de FPGA para se multiplicar, mas não terá problemas de arredondamento. Outras partes apenas tiveram 18 bits (17 à direita do decimal), portanto, alfa (0,00169 - .000007) vezes, uma entrada de 0,1 seria 0.000169 - 0.000007 ou erro 7). Mas isso se multiplica também é de 40 bits, então você não deve ver nenhum problema. Normalmente, a saída yn tem menos bits, e irá rodar no último bit. Mas porque está em um loop multiplicado por 1-alfa a cada vez, a rodada às vezes acumula cada loop até que ele seja grande o suficiente para afetar os resultados de adição. É difícil de explicar, mas a minha regra geral é que eu espero um erro igual ao menor bit dividido por alfa, usando o método original, ou cerca de metade desse usint o método de um único múltiplo. As respostas serão quase idênticas, com exceção de uma pequena diferença. A maior vantagem é salvar o espaço FPGA (e tempo de compilação). E você pode reduzir seu número de bits um pouco para economizar ainda mais. 3. Eles são basicamente idênticos. E ambos os métodos são gratuitos em FPGA. Os bits não foram alterados, então nenhuma lógica é necessária, eles são simplesmente redatados. 4. Eu acho que você respondeu bem. Geralmente, neste momento, eu ajustaria o alfa até que meus resultados correspondiam ao que eu queria e segui em frente. Odeio não entender uma incompatibilidade, mas geralmente não tenho tempo para mergulhar nele. Mas, por causa da ciência, consideramos que sua fórmula pode ser defeituosa. Eu acho que você pode estar usando uma fórmula para uma decadência exponencial contínua (e-ttau), não para uma decaimento exponencial discreto ((1-alfa) i). É mais fácil ver isso como uma função de passo de 1 a 0. Nesse caso, yn (para ngt0) é yn (1-alpha) (n). Podemos encontrar n para yn 0.9, como nlog1-alpha (0.9) 62, e n para yn 0.1, como 1361, para uma diferença de 1299. CLD User desde rev 8.6. Obrigado pela sua resposta detalhada. Quanto ao problema com o tempo de subida, acho que encontrei o erro. Você pode estar certo de que a fórmula não está correta, ou o que é mais provavelmente incompreendido por mim e configurado no contexto incorreto. Quando andei de bicicleta para casa do trabalho, lembrei-me de uma prática função de labview: alisando coeficientes de filtro. Aqui você só precisa configurar tauTC e fs e calcula o nominal e o denominador para a média móvel exponencial e a média móvel. Como o indicador é alfa, eu poderia comparar o resultado com a fórmula que usei e houve uma grande diferença. Labview usa a seguinte fórmula: alpha1-exp (-1 (fsTC)). Com esta fórmula TC2s é igual a alpha0,0053. E com este alfa minha simulação funciona Risetime 4,4s Citando você: Geralmente, nesse ponto, eu ajustaria o alfa até que meus resultados correspondiam ao que eu queria e continuem. Eu adoraria fazer o mesmo, mas como esta é a minha tese de mestrado, eu tenho que resolver essas coisas. Agora, de volta aos problemas de arredondamento. Eu entendo, que os pequenos valores são um problema maior. Como esse filtro é usado em um Bloqueio, os valores serão REALMENTE pequenos. Mas eu já testei isso em nosso dispositivo de medição e funciona, por isso também vou testar sua versão, mas se eu não tiver problemas, acho que eu mantenho isso em 40bits. Simular a configuração a seguir causou um erro de 2.3. Usando 57 bits reduziu o erro para abaixo de 1. Eu acho que 40bits devem ser suficientes. E no que diz respeito aos recursos, não tenho preocupações. Embora usando um myrio no final eu ainda tenho um monte de DSP Slices para a multiplicação e 10 FlipFlops grátis. Então eu acho que este tópico está resolvido. Obrigado pela sua grande ajuda e pensamentos interessantes. Legal Estou feliz por estar funcionando, agora. Eu cresci na era sem fatias DSP em FPGAs, e contagens menores de células, então ainda tendem a pensar nesses termos. Ainda prefiro passar 25 minutos de programação para reduzir meus tempos de compilação. Eu tive casos em que eu cortei o tempo de compilação de 90 minutos a 45 minutos, otimizando um pouco. Com um servidor poderoso para compilação, isso é menos importante. Uma dessas otimizações é reduzir as contagens de bits onde eu posso, especialmente para se multiplica. Por exemplo, o alfa é 160 e, para 0,0053, você também pode usar 12-4 (contagem de número inteiro negativo). Você também pode eliminar muitos bits superiores da sua entrada. 5 minutos para escolher a menor contagem de bits pode economizar facilmente 2-10 minutos para cada compilação. Minha segunda otimização é reduzir as multiplicações, mas com uma fatia DSP, isso não é tão importante. Não consigo encontrar boa documentação sobre as fatias do DSP (se você tiver alguma, por favor, coloque links), mas, conforme entendi, se você multiplicar números maiores (contagens de bits), ele precisa de fatias múltiplas e talvez seja tempo para combinar os resultados. E mais um truque: escolha um alfa com um valor binário simples, como 1256 (você escolheu cerca de 1189) e mude o fs até obter o alisamento desejado. Em seguida, use uma constante para alfa. Multiplicar por uma constante 1256 é livre no FPGA (ele simplesmente desloca os bits). Para esse assunto, fazer alfa constante pode otimizar as multiplicações um pouco. Dependendo da inteligência do otimizador, ele pode mudá-lo para um conjunto de adders. As entradas do painel frontal são ótimas para que as coisas funcionem, mas as constantes otimizam muito melhor. Usuário CLD desde a rev. 8.6. Se você calcula 16 vezes mais amostras (fs 16x o que era), você deve incluir mais 4 bits em seus comentários. Você já tem pleanty, de modo que talvez não seja importante a menos que você vá muito mais rápido. Caso contrário, aumentar fs provavelmente é bom. Se a entrada tiver ruído de baixa frequência, a amostragem não ajuda a eliminar isso. O ruído de alta freqüência, no entanto, reduz com o excesso de amostragem. Se, por exemplo, o ruído acima de 10Hz é -5dB (isto é, 10 a 0,5 vezes a amplitude do sinal que você gosta), e você amostra em 20Ss, você provavelmente pegará -5 dB em suas leituras iniciais. Se o seu -3dB (fc) também for 10Hz, então você acabará com um ruído de -8dB sobrado no seu sinal. Se você, em vez disso, tomar 200Ss, grupos médios de 10, depois passar essas médias para o filtro, você não ajudará o ruído a 10Hz (você estava medindo 10Hz de ruído sem efeitos de amostragem), mas reduzirá o ruído acima de 100Hz em cerca de um fator próximo (Mas não realmente) 10. Há classes inteiras de um semestre que discutem o porquê, como, etc. A versão curta é esta: Cada amostra é a soma do sinal que deseja e do ruído. Se você adicionar 10 amostras, você recebe 10 vezes o sinal desejado e a soma de 10 ruídos. A natureza do ruído determina o que você obtém quando você adiciona as 10 amostras de ruído. O ruído gaussiano acrescenta uma maneira (algo como: se 83 das amostras estão abaixo de X, a soma tem 83 somas abaixo de 1.1X, ou algo assim). O ruído linear adiciona outra maneira. E os padrões de repetição adicionam outra maneira. Então, sem saber exatamente o que é o ruído, ninguém pode responder com certeza, exceto que a média de múltiplas amostras provavelmente ajuda e quase nunca dói. Há também a questão do aliasing. Se você tiver uma interferência do seno de 60Hz, em -3dB, e você provará em 10.001Ss (sempre presuma que os relógios não se encaixem presicamente), você obterá algo como 0.006Hz a -3dB adicionado ao seu sinal e seu filtro não o removerá . Mas batendo sua taxa de amostragem para 100.001Ss, colocará a interferência em cerca de 40Hz, então seu filtro deve eliminá-la. A média de 10 amostras por vez é um tipo de filtro (caixa). Se você olhar para ele em um domínio de freqüência, você pode ver que algumas freqüências mais altas são deslocadas para frequências mais baixas de uma maneira estranha e nem todas são reduzidas. Se você tiver uma média de 4000 Ss, 100 de cada vez, você terá uma média de 40 vezes por segundo. Com a interferência de 60Hz, você terá cerca de 13 tanto ruído, deslocado para 20Hz, que não irá filtrar, assim como 60Hz teria. Então, seria melhor usar o filtro EWMA com a maior taxa de amostragem. Do que a média de blocos de entradas, então filtre isso. E a média é (provavelmente) melhor do que apenas usar uma taxa de amostragem mais lenta. Se você possui um adaptador de entrada com filtros eletrônicos incorporados, isso é ainda melhor, e não há necessidade de amostra de mais de 2X a freqüência dos filtros. Usuário CLD desde a rev. 8.6.

No comments:

Post a Comment