Thursday 4 January 2018

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 registradores de deslocamento. O registrador de deslocamento superior é inicializado com um elemento e então adiciona continuamente o valor anterior com o novo valor. O total das últimas medidas x Depois de dividir os resultados da função de adição com o valor pré-selecionado, o VI calcula o valor da média 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 medição A função de substituição Substitui o novo valor após cada loop. Este VI é muito eficiente e rápido porque ele usa a função replace element dentro do loop while e inicializa a matriz antes de entrar no loop. Este VI foi criado no LabVIEW 6 1.Bookmark Share. Exponentia l movendo resposta passo médio fpga. I tenho um problema com o meu filtro, a média exponencial ponderada filtro IIR ordem média do livro Entendendo o processamento de sinal digital Lyons Richard Eu tenho a seguinte fórmula de cálculo da freqüência 3dB fc de alfa Alpha é o parâmetro para controlar o filtro. Differencial equação de filtro ynxn alfa 1-alfa y n-1.Relação entre fc e alpha alfa cos 2fc fs - 1 cos quadrado 2fc fs - 4 cos 2fc fs 3. Se eu escolher agora uma frequência 3dB de 0,0794Hz constante de tempo TC 2s alfa 0,00169621 fs 94Hz. Para um filtro IIR primeira ordem, o tempo de subida ta da resposta stepresponse de 10 a 90 é ta 2,2 TC o que resulta em ta 4,4. Mas se eu simular a resposta passo, o meu tempo de ascensão é cerca de 3 vezes deste valor em 14s. I não pode explicar por que a resposta passo do meu filtro é diferente Muito Para o meu filtro de média móvel o tempo de ascensão calculado e simulado são equal. I tem o vi que é realizado no FPGA anexado Talvez alguém pode encontrar um erro. Veja também o filtro alfa ou RC filter. Is sua freqüência de amostragem fs correto Se o tempo loop não corresponde, que iria explicar it. Your tipos de dados parecem bons para obter alfa dentro de 1 Mas eu gostaria de sugerir uma pequena alteração na implementação Como está , É um pouco propenso a arredondamento à deriva, porque 1-alfa é repetidamente multiplicado pelo y n-1 Um método um pouco mais confiável é dizer yny n-1 alfa xn - y n-1 A diferença é sutil, Mas me dá melhores resultados muitas vezes E ele elimina um multiply. By a maneira, reinterpretar o número faz a mesma coisa como o seu converso de FXP para bool, em seguida, de volta É um pouco menos confuso, though. I um pouco confundido pelo loop temporizado que nunca Loops Será que forçar timing que forma eu assumi que wouldn t, então nunca usou Eu uso o temporizador Loop vez. CLD Usuário desde rev 8 6.Mensagem 2 de 13 1.087 Views. Re exponentia l movendo passo médio fpga resposta. 10-01-2017 02 05 AM - editada 10-01-2017 02 17 AM. thanks for your answer.1, eu prova a minha freqüência de amostragem com o temporizador de loop Minha entrada são 425 532 ticks que é igual a.94 Hz Este tickrate É confirmado por carrapatos EWMA. - Talvez alguém pode testar o código e me diga.2, eu encontrei a sua abordagem na seção de truques e tipps do livro de Lyons vou ter uma tentativa, mas você poderia explicar a rodada deriva um pouco Eu sou completamente novo nesta área. Há um benefício adicional de eliminar um multiplicador exceto recursos são a resposta de freqüência, a resposta de impulso ea resposta da etapa o mesmo.3, se eu bitbift somente, sou amável a usado a este método Não sure se A função reinterprate usa menos recursos Mas obrigado por notar it.4, O loop temporizado itera cada 425 532 ticks uma vez Então, com uma freqüência de 94Hz um valor é computado pelo código como o código dentro do loop temporizado só precisa de uma iteração Ou Estou mal entendendo a sua pergunta. Não sei o que mais informações você precisa, eu tento Para comparar a resposta de passo 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, alfa tem que ser 0,00169 O aumento Tempo da resposta do passo de 10 a 90 do valor final difere do tempo de ascensão da teoria deve ser 4,4s com constante de tempo 2s mas eu recebo quase 14 se eu executar o meu código na FPGA. I confirmou que, com alfa 0,00169 , Meu código leva 1297samples para obter de 0,1 a 0,9 valor final é 1, valor de início 0. Como você pode ver no meu código eu verificar o tempo de loop com o indicador ewma carrapatos para confirmar a taxa de amostragem do SCTL. Alguém pode confirmar as amostras 1297 que são necessárias em alfa 0,00169 Porque eu acho que eu preciso de amostras demais para atingir o valor 0,9.Eu já implementado a versão sugerida EWMA da primeira resposta O mesmo problema here. Message 5 De 13 1.037 Views. Re exponentia l movendo passo passo médio fpga. 10-01-2017 08 13 AM - editado 10-01-2017 08 15 AM.1, eu provar a minha frequência de amostragem com o temporizador de loop Minha entrada são 425 532 ticks que é igual a.94 Hz Este tickrate é confirmado por carrapatos EWMA . - Talvez alguém possa testar o código e dizer-me.2, eu encontrei a sua abordagem na seção de truques e tipps do livro de Lyons vou ter uma tentativa, mas você poderia explicar a rodada de deriva um pouco Eu sou muito novo em Esta area. Is lá um benefício adicional de eliminar um multiplicador exceto recursos são a resposta de freqüência, a resposta de impulso ea resposta da etapa o same.3, se eu bitchift somente, sou amável a usado a este método Não sure se a função do reinterprate usa menos Recursos Mas obrigado por notar it.4, O ciclo temporizado itera cada 425 532 ticks uma vez Então, com uma freqüência de 94Hz um valor é computado pelo código como o código dentro do loop temporizado só precisa de uma iteração Ou estou mal perceber a sua pergunta . Eu usei uma planilha para simular, e obter quase exatamente a mesma resposta 12 99 ciclos para ir de 0 1 a 0 9 As planilhas fazem uma ferramenta útil para testar cálculos.1 Ok eu nunca usei o Single-Cycle-Timed-Loop SCTL com o T escrito para a parada Isso forçaria as funções matemáticas para ser único , Mas eu não tenho certeza se isso é qualquer vantagem que eu só queria ter certeza de que o tempo foi confirmado, e é.2 A rodada de drifting provavelmente ganhou t aparecer, a menos que a sua entrada é menor do que 0 1 Eu vejo Agora que você tem 40 bits 39 à direita do decimal para o feedback Que leva um pouco de FPGA para multiplicar, mas não terá round-off questões Outras partes só tinha 18 bits 17 à direita do decimal, por isso alfa 0 00169 - 000007 Vezes uma entrada de 0 1 teria sido 0 000169 - 0 000007, ou erro 7 Mas que multiplicar é também 40 bits, então você shouldn t ver quaisquer problemas. Tipicamente, a saída yn tem menos bits e vai arredondar no último Bit Mas porque ele está em um loop multiplicando por 1-alfa cada vez, o round-off às vezes é acumulado cada loop até que ele é grande enou Gh para afetar o add s resultados É 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 que usint o método de um multiplicação. As respostas serão quase idênticas, exceto por uma pequena diferença A maior vantagem é salvar o espaço FPGA e compilar o tempo E você pode reduzir o 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 livres em FPGA Os bits não são alterados, por isso nenhuma lógica é necessária, eles são simplesmente relabeled.4 Eu acho que você respondeu bem. Geralmente, neste momento, eu iria ajustar alfa até que meus resultados correspondem ao que eu queria, e seguir em frente Eu odeio não entender um Mas, geralmente, não têm tempo para mergulhar nela. Mas, por causa da ciência, vamos considerar que sua fórmula pode ser falho. Acho que você pode estar usando uma fórmula para uma decadência exponencial contínua e-t tau, não para Uma decadência exponencial discreta 1-alpha i É mais fácil de olhar Nn n-0 n, n n 0 n, para n 0 n, para n 0 n, para n 0, Como 1361, para uma diferença de 1299. CLD Usuário desde rev 8 6.thank você para sua resposta detalhada. Concerning o 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 mal interpretado por mim e definido no contexto errado. Quando eu estava andando de bicicleta do trabalho eu me lembrei de uma função útil de labview filtro de suavização Aqui você só tem que definir tau TC e fs e calcula nomeador e denominador para a média móvel exponencial e Como o nomeador é alfa eu poderia comparar o resultado com a fórmula que eu usei e houve uma grande diferença Labview usa a seguinte fórmula alfa 1-exp -1 fs TC Com esta fórmula TC 2s é igual a alfa 0,0053.And Com este alfa minha simulação funciona Risetime 4,4s. Quoting você Geralmente, neste momento, eu iria ajustar alfa até o meu r Esults combinado o que eu queria, e seguir em frente Eu gostaria de fazer o mesmo, mas como esta é a minha tese de mestrado eu tenho que resolver essas coisas. Now de volta para as questões de arredondamento eu entendo, que os valores pequenos são um problema maior Como este filtro É usado em um Lock In, os valores vão ser REALMENTE pequeno Mas eu já testei no nosso dispositivo de medição e ele funciona, por isso vou testar sua versão também, mas se eu não tiver problemas, eu acho que eu manter Ele em 40bits Simular a seguinte configuração causou um erro de 2 3 Usando 57 bits reduziu o erro para menos de 1 Eu acho que 40bits deve ser enough. And sobre os recursos eu 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 livre FlipFlops. So eu acho que este tópico é resolvido Obrigado pela sua grande ajuda e pensamentos interessantes. Cool eu estou feliz que está funcionando, now. I cresceu na era sem fatias DSP em FPGAs e Menor número de células, então ainda tendem a pensar nesses termos, eu ainda prefiro spen D 25 minutos de programação para obter os meus tempos de compilação para baixo, embora eu tive casos onde eu cortar o tempo de compilação de 90 minutos para 45 minutos, otimizando um pouco Com um servidor poderoso para compilar, que s menos importante. Uma dessas otimizações é para Reduza contagens de bits onde eu puder, especialmente para multiplicações Por exemplo, alfa é 16 0 e para 0 0053, você também pode usar contagem inteira negativa de 12 -4 Você também pode ser capaz de eliminar muitos bits superiores de sua entrada 5 minutos Para escolher a menor contagem de bits pode facilmente salvar 2-10 minutos para cada compile. My segunda otimização é reduzir multiplica, mas com uma fatia DSP, que não é tão importante que eu não posso encontrar boa documentação sobre as fatias DSP se você tiver Alguns, por favor, postar links, mas como eu entendo, se você multiplicar números maiores contas de bits, ele precisa de várias fatias, e talvez tempo para combinar os resultados. E mais um truque escolher um alfa com um valor binário simples, como 1 256 você Escolhido cerca de 1 189, e mude fs até você ge T o alisamento que você quer Então use uma constante para alfa Multiplique por uma constante 1 256 é livre no FPGA ele só desloca os bits. Para isso, fazer alfa constante pode otimizar o multiplica bastante Dependendo do smarts do otimizador, Ele pode alterá-lo para um conjunto de adicionadores em vez entradas do painel frontal são ótimos para fazer as coisas funcionarem, mas as constantes otimizam muito melhor. CLD Usuário desde rev 8 6.Se você média 16 vezes mais amostras fs 16x o que era, você deve incluir mais 4 bits em seu feedback Você já tem pleanty, de modo que pode não ser importante a menos que você vá muito mais rápido Caso contrário, aumentando fs É provavelmente bom. Se a entrada tem ruído de baixa freqüência, sobre a amostragem doesn t ajudar a eliminar isso em todos os ruídos de alta freqüência, no entanto, não reduzir com over-sampling Se, por exemplo, o ruído acima de 10Hz é -5dB que é 10 - 5 vezes a amplitude do sinal que você gosta, e você amostra em 20S s, você provavelmente vai pegar -5dB em suas leituras iniciais Se o seu -3dB fc também é 10Hz, então você vai acabar com cerca de -8dB ruído deixado em O seu sinal Se você tomar 200S s, grupos médios de 10, então passar essas médias para o filtro, você não vai ajudar o ruído em 10Hz você estava medindo 10Hz ruído sem efeitos de amostragem, mas vai reduzir o ruído acima de 100Hz por cerca de um fator de Perto, mas não realmente 10.There são inteiras semestre-longas classes que discutem porque, como , Etc A versão curta é esta Cada amostra é a soma do sinal que você quer e do ruído Se você adicionar 10 amostras, você recebe 10x o sinal que você quer ea soma de 10 ruídos A natureza do ruído determina o que você recebe quando você Adicione as 10 amostras de ruído Gaussian ruído adiciona uma maneira algo como se 83 de amostras estão abaixo de X, a soma tem 83 somas abaixo de 1 1X, ou algo parecido que o ruído linear adiciona outra maneira E repetir padrões adicionar outra maneira Assim, sem saber exatamente O que o ruído é, ninguém pode respondê-lo com certeza, exceto que a média de várias amostras, provavelmente, ajuda, e quase nunca dói. Há também a questão de aliasing Se você tem uma interferência senoidal de 60Hz, -3dB, e você amostra no 10 001S sempre assumir que os relógios não coincidirá com presicely, você vai ter algo como 0 006Hz em -3dB adicionado ao seu sinal, e seu filtro não vai removê-lo Mas bater a sua taxa de amostragem para 100 001S s, vai colocar a interferência em cerca de 40Hz , Para que o seu filtro deve eliminá-lo. Averagi Ng 10 amostras de cada vez é um tipo de caixa de filtro Se você olhar para ele em um domínio de freqüência, você pode ver que algumas freqüências mais altas se deslocam para baixas freqüências de uma forma estranha, e nem todos estão reduzidos Se você média 4000 S s , 100 de cada vez, você vai ter uma média de 40 vezes por segundo com 60Hz interferência, você terá cerca de 1 3 tanto o ruído, mudou para 20Hz, que ganhou t filtro, bem como 60Hz teria. So, seria melhor Para usar o filtro EWMA na taxa de amostragem mais alta do que para a média de blocos de entradas, em seguida, filtro E E média é provavelmente melhor do que apenas usando uma taxa de amostragem mais lenta. Se você tiver um adaptador de entrada com built-in filtros eletrônicos, isso é ainda melhor , E não há necessidade de amostra mais de 2X a freqüência do filtro s. CLD User since rev 8 6.An Introdução ao uso do LabView - Usando um loop temporizado. Na primeira nota do LabVIEW examinamos algumas operações aritméticas simples no LabVIEW. Nesta nota vamos examinar como escrever um programa simples com um loop temporizado. Afinal, Não é suficiente apenas para fazer aritmética Na maioria dos aplicativos você precisa fazer cálculos repetidamente Os cálculos repetitivos são melhores feitos usando um loop temporizado. Loops temporais são importantes porque muitas vezes você encontra situações em que deseja tomar medidas repetidamente em um tempo constante Intervalo Loops temporizados permitem que você tome dados onde você pode definir o tempo entre as medições Antes de chegar a laços temporizados, vamos guiá-lo através de alguns loops simples, e vamos terminar com alguns ciclos cronometrados que geram e exibir sinusoidal signals. In esta nota - como Nas outras notas do LabVIEW, você poderia apenas ler a nota, mas você fará melhor se você trabalhar ao longo como discutimos o que está acontecendo. A primeira coisa que você vai fazer é construir Um simples loop temporizado Você precisa fazer o seguinte. Iniciar LabView Escolher Novo vi. Nós usaremos algumas das rotinas que escrevemos anteriormente Você precisará ter a janela Diagrama ativa Escolher Janela-Mostrar Diagrama se o diagrama não estiver ativo e mostrando. Choose Window-Show Functions Palette A paleta Functions é mostrada abaixo. Na paleta Functions, localize o menu Structures no canto superior esquerdo e clique para obter opções. Ao colocar o cursor sobre os diferentes menus, uma pequena janela pop-up permite que você saiba o que Menu contains. Place um While Loop no Diagrama de Bloco. Este é o que você começa Faça-o, pelo menos, este size. You deve notar um contador de iteração i e um Loop Stop Condicional Terminal O while loop executa enquanto o condicional Terminal é verdade - Embora você possa mudar isso mesmo. Para mudar o terminal condicional para olhar como o um acima no canto direito mais baixo - se acontecer para olhar como um sinal pequeno do batente - clique direito do rato sobre o ícone e ajustado a Continuar se verdadeiro. Escreva um loop que é executado para um número de vezes que você especificar - eventualmente Mas por agora, vamos adicionar algumas coisas para fazer isso correr Primeiro tente executar o vi Você deve receber uma mensagem de erro que o terminal condicional não é com fio Isso não é o único problema - mas é o problema que você vai corrigir primeiro. Para começar, vá para o painel frontal e adicione um indicador numérico a partir do menu numérico Quando você tem o indicador numérico no painel frontal, clique com o botão direito do mouse no E escolha Find Terminal Você será levado para o diagrama eo terminal será evidente Observe que adicionando o indicador no painel frontal adiciona automaticamente um terminal para o indicador para o diagrama Existem alguns componentes que só podem ser adicionados - ou excluídos - A partir do painel frontal ou o diagrama - mesmo que eles devem aparecer em both. Move o terminal dentro do loop while. Change a representação para um formato inteiro O controle deve ser azul quando você tem direito Blue indica um integer. Now, add ac Onstant ao terminal condicional, clicando com o botão direito do mouse no terminal para adicionar uma constante Tornar essa constante igual a True usando a ferramenta de mão. Neste ponto, seu diagrama de bloco deve ser semelhante a this. Now, você pode executar o programa Tudo o que acontece é Que o indicador mostra o contador de loop - e ele irá mostrar que cada loop leva muito pouco tempo. Como os números no indicador rapidamente zip, aperte o botão Stop parece um sinal de stop logo abaixo do menu. That s sua primeira excusion em O mundo dos loops O loop que você escreveu deve ter executado muito rapidamente e deve ter exibido um número crescente no indicador no painel frontal Agora podemos adicionar um temporizador para o loop para controlar a rapidez que executa. Em seguida, vamos definir o Timing do loop execução. On o menu de tempo selecione o temporizador com um ícone de metrônomo e colocá-lo dentro do loop. Right clique no temporizador para adicionar uma constante fazer essa constante igual a 1000 que s 1000 milissegundos usando o text tool. Your diagrama deve Olhe Ike this Exceto que, ao gerar a imagem abaixo, podemos ter perdido o fio passando da constante VERDADEIRO para o terminal condicional Esse fio deve estar lá É apenas não mostrar na imagem. Neste ponto você tem um loop que é cronometrado, E uma vez que a entrada para o temporizador é 1000 que s milissegundos sempre é executado em intervalos de 1 segundo Há duas coisas que queremos fazer para melhorar este programa. We quer ser capaz de definir o intervalo de tempo em segundos. Queremos exibir o O tempo decorrido em segundo. Vamos cuidar dessas duas preocupações next. To definir o intervalo de tempo, você precisará adicionar um controle numérico no painel frontal Do que agora NOTA Você precisa usar um controle que permite entradas de ponto flutuante se você quiser Para tempo o loop em intervalos como 1 5 segundos Adicionar esse controle agora. Depois de adicionar o controle, clique com o botão direito do mouse sobre o controle e localize o terminal para o controle numérico que você acabou de adicionar. Então você precisa fio o controle para que ele controla o Entrada para o bloco do temporizador Nós apenas usamos uma constante de 1000 para obter um segundo Se você inserir o intervalo de tempo em segundos, você precisará multiplicar o intervalo de tempo que o usuário entra por um fator de 1000 para obter o intervalo do temporizador em milissegundos, então você precisará de um Multiplicador e uma entrada constante para um lado do multiplicador igual a 1000. Agora, seu diagrama de bloco deve ser algo parecido com isto. Agora, execute o seu programa Claro, a única coisa que este programa faz é dizer-lhe quanto tempo ele tem sido executado É muito inútil, a menos que você usá-lo como um ovo timer. P1 Modificar o programa acima para que você possa parar o programa usando um controle ON-OFF Here sa dica Tente substituir a constante é ligada ao terminal condicional com um controle Right - Clique na constante definida como TRUE no diagrama de blocos acima e altere-o para um controle Em seguida, localize o controle no painel frontal Um programa final - apenas para terminar isso, produzindo algo que está ficando perto de útil A próxima lição nesta série terá Você para o mundo Das medições GPIB IEEE-488, e quando você coloca em um loop, então você tem algumas coisas interessantes que você pode fazer Anyhow, este último programa irá calcular uma onda senoidal e exibi-lo no dial Aqui está o diagrama de blocos. Você deve Observe o seguinte neste diagrama de blocos. No vi anterior, calculamos o tempo decorrido e exibimos no painel frontal. Aqui tomamos esse tempo e multiplicamo-lo por um fator que é 2 p f. O fator p é uma constante incorporada LabVIEW Você pode encontrá-lo no painel de operações numéricas, e você deve verificar todas as outras constantes disponíveis. O resultado das multiplicações é a entrada para uma função seno Você pode encontrar essa função na paleta numérica de funções em um sub - paleta de funções trigonométricas Confira o que mais está lá também. Finalmente, a saída da função seno é exibida em um indicador de medidor Esse indicador tem uma parte do painel frontal, e você deve adicioná-lo a partir do painel frontal. Actually, a frente Painel é parecido com este Quando você é feito. P2 Modifique o programa acima de modo que você possa introduzir a amplitude da onda de seno E aquele é sobre ele para esta lição Na próxima lição nós o começaremos familiarizar com algumas medidas simples de GPIB de IEEE-488, e depois que Vamos fazer essas medições dentro de um loop.

No comments:

Post a Comment