Labview Fpga Moving Average


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 medições x. 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 de baixo contém uma matriz com a dimensão Média. Este registro de deslocamento mantém todos os valores da medição. 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 Shareexponentia l media média resposta de passo fpga Tenho um problema com o meu filtro, o filtro de média móvel ponderada exponencial (IIR 1.ª ordem). 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 (2 fc fs) - 1 sqrtcos (2fc fs) - 4cos (2fc fs) 3 Se eu agora escolher uma frequência 3dB de 0, 0794Hz (constante de tempo (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 (896 Visualizações) Re: exponentia l resposta de mudança média em movimento 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 (846 Visualizações) Re: exponentia l resposta de mudança 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-t tau), não para uma decomposição exponencial discreta ((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 eu estava de bicicleta em casa do trabalho, lembrei-me de uma útil função de labview: alisando coeficientes de filtro. Aqui você só precisa configurar tau TC 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 é 16 0 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 1 256 (você escolheu cerca de 1 189) e mude fs até obter o alisamento desejado. Em seguida, use uma constante para alfa. Multiplicar por uma constante 1 256 é livre no FPGA (ele apenas 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 20S s, 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 200S s, 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 de fechamento Para (mas não realmente) 10. Existem classes completas de todo o 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ê amostra às 10.001S s (sempre presuma que os relógios não coincidem presicamente), você obterá algo como 0.006Hz a -3dB adicionado ao seu sinal e seu filtro não removerá isto. Mas superar sua taxa de amostragem para 100.001S s, 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ê receberá uma média de 40 vezes por segundo. Com 60Hz de interferência, você terá cerca de 1 3 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.

Comments

Popular Posts