Wednesday, 18 October 2017

Mover Média Embutida C


Um filtro digital fácil de usar A média móvel exponencial (EMA) é um tipo de filtro de resposta de impulso infinito (IIR) que pode ser usado em muitas aplicações DSP incorporadas. Requer apenas uma pequena quantidade de RAM e poder de computação. O que é um Filter Filters vem em formas analógicas e digitais e existe para remover freqüências específicas de um sinal. Um filtro analógico comum é o filtro RC de passagem baixa mostrado abaixo. Os filtros analógicos são caracterizados pela resposta de freqüência que é o quanto as freqüências são atenuadas (resposta de magnitude) e deslocadas (resposta de fase). A resposta de freqüência pode ser analisada usando uma transformada de Laplace que define uma função de transferência no domínio S. Para o circuito acima, a função de transferência é dada por: Para R é igual a um quilo-ohm e C é igual a um microfarad, a resposta de magnitude é mostrada abaixo. Observe que o eixo dos x é logarítmico (cada marca é 10 vezes maior que a última). O eixo y está em decibéis (o que é uma função logarítmica da saída). A frequência de corte para este filtro é de 1000 rads ou 160 Hz. Este é o ponto em que menos da metade do poder em uma determinada freqüência é transferida da entrada para a saída do filtro. Os filtros analógicos devem ser usados ​​em projetos embutidos quando amostragem de um sinal usando um conversor analógico para digital (ADC). O ADC apenas captura freqüências que são até metade da freqüência de amostragem. Por exemplo, se o ADC adquire 320 amostras por segundo, o filtro acima (com uma freqüência de corte de 160Hz) é colocado entre o sinal ea entrada ADC para evitar aliasing (que é um fenômeno onde as freqüências mais altas aparecem no sinal amostrado como Freqüências mais baixas). Filtros digitais Os filtros digitais atenuam as freqüências em software em vez de usar componentes analógicos. Sua implementação inclui amostragem dos sinais analógicos com um ADC, em seguida, aplicando um algoritmo de software. Duas abordagens de design comuns para filtragem digital são filtros FIR e filtros IIR. Os filtros Filtros de Filtros finitos de Resposta a Impulso (FIR) utilizam um número finito de amostras para gerar a saída. Uma média móvel simples é um exemplo de um filtro FIR de baixa passagem. As freqüências mais altas são atenuadas porque a média suaviza o sinal. O filtro é finito porque a saída do filtro é determinada por um número finito de amostras de entrada. Como exemplo, um filtro de média móvel de 12 pontos acrescenta as 12 amostras mais recentes, em seguida, divide-se por 12. A saída de filtros IIR é determinada por (até) um número infinito de amostras de entrada. Filtros IIR Os filtros Infinite Impulse Response (IIR) são um tipo de filtro digital onde a saída é inifinetelyin teoria de qualquer forma influenciada por uma entrada. A média móvel exponencial é um exemplo de um filtro IIR de passagem baixa. Filtro médio exponencial exponencial Uma média móvel exponencial (EMA) aplica pesos exponenciais a cada amostra para calcular uma média. Embora isso pareça complicado, a equação conhecida em linguagem de filtragem digital como a equação de diferença para calcular a saída é simples. Na equação abaixo, y é a saída x é a entrada e alfa é uma constante que define a freqüência de corte. Para analisar como esse filtro afeta a freqüência da saída, a função de transferência do domínio Z é usada. A resposta de magnitude é mostrada abaixo para alfa igual a 0,5. O eixo dos e é, novamente, mostrado em decibéis. O eixo dos x é logarítmico de 0,001 a pi. A freqüência do mundo real se correlaciona com o eixo x, sendo zero a tensão CC e sendo igual a metade da frequência de amostragem. Quaisquer freqüências que são maiores que metade da freqüência de amostragem serão alias. Como mencionado, um filtro analógico pode garantir que praticamente todas as freqüências no sinal digital estão abaixo da metade da freqüência de amostragem. O filtro EMA é benéfico em projetos incorporados por dois motivos. Primeiro, é fácil ajustar a freqüência de corte. Diminuir o valor do alfa diminuirá a freqüência de corte do filtro como ilustrado pela comparação do gráfico alfa 0.5 acima com o gráfico abaixo, onde alfa 0.1. Em segundo lugar, o EMA é fácil de codificar e requer apenas uma pequena quantidade de energia e memória informática. A implementação do código do filtro usa a equação de diferença. Existem duas operações de múltiplas operações e uma operação de adição para cada saída. Isso ignora as operações necessárias para arredondar matemática de ponto fixo. Somente a amostra mais recente deve ser armazenada na RAM. Isto é substancialmente menor do que o uso de um filtro de média móvel simples com N pontos que requer N operações de multiplicação e adição, bem como N amostras a serem armazenadas na RAM. O código a seguir implementa o filtro EMA usando matemática de ponto fixo de 32 bits. O código abaixo é um exemplo de como usar a função acima. Os filtros de conclusão, tanto analógicos como digitais, são parte essencial dos projetos incorporados. Eles permitem aos desenvolvedores se livrar de freqüências indesejadas ao analisar a entrada do sensor. Para que os filtros digitais sejam úteis, os filtros analógicos devem remover todas as frequências acima da metade da frequência de amostragem. Os filtros digitais IIR podem ser ferramentas poderosas no design incorporado, onde os recursos são limitados. A média móvel exponencial (EMA) é um exemplo de um filtro que funciona bem em projetos embutidos por causa da baixa memória e dos requisitos de potência computacional. Sei que isso é viável com o aumento de acordo com: Mas eu realmente gostaria de evitar o uso de impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Qual é a maneira mais fácil de alcançar isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequavam minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, à medida que seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1 e calcula isso: você precisa apenas encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu já coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Assim, isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar alpha be (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como uma amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados, evitando a trajetória O (N) cara para calcular a soma - necessária para a média - na demanda. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro extra de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (melhor então renomeado algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem manchado. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D Jun 8 14 em 14: 27GIT repositórios Página de índice de todos os repositórios GIT que são clonáveis ​​desse servidor via HTTPS. Bersichtsseite aller GIT-Repositories, die von diesem Servidor aus ber git clone (HTTPS) erreichbar sind. Um monte de scripts de serviço para converter, analisar e gerar dados. Ein paar Serviços zum Konvertieren, Analysieren und Generieren von Daten. SwLib (php) Eine PHP-Bibiothek mit: Wrapperklassen fr Dateisystemfunktionen, Tracing, Sessions, Ausgabepufferung lokalisierbare Fehlermeldungen, implizite Umwandlung von Fehlern em Excepções Kommandozeilen-Ausfrhung und Abfangen de STDOUT, STDERR mit Callbacks. Kalender und Datumsfunktionalitt elaborierter FFmpeg Wrapper (Metadaten und Konvertierung von Audio Video) OpenSSH Key-Generierung und - Verwaltung automatische Erstellung von Podcast-Feeds, RSS Feed Renderer Renderer fr LaTeX-Formeln. Uma pequena biblioteca PHP contendo: classes de wrapper para funções de sistema de arquivos, rastreamento, sessões, buffer de saída mensagens de erro localizáveis, conversão implícita de erros para exceções Execução do programa CLI com STDOUT STDERR (opcionalmente com retorno de chamada) funcionalidade de data e calendário (UTC, local, GM) elaborado wrapper FFMPEG (Leia e converta metadataformat de áudio) Gerador de par de chaves OpenSSH e gerador de alimentação de podcast automático, renderizador de fórmulas LaTeX renderer RSS2. Interface web da oitava GNU Uma interface web para o GNU Octave, que permite executar cálculos científicos de netbooks, tabelas ou smartphones. A interface fornece um gerador de formulário web para parâmetros de script Octave com pré-validação, geração automática de listas de scripts, bem como apresentação de texto, figuras e arquivos de saída em uma página HTML de saída. Ein Webinterface fr GNU-Octave, mit dem wissenschaftliche Berechnungen von Netbooks, Tablets ou Smartphones aus durchgefhrt werden knnen. Die Schnittstelle beinhaltet einen Formulargenerator fr Octave-Scriptparameter, mit Einheiten und Einfabevalidierung. Textausgabe, Abbildungen und generierte Dateien werden abgefangen und in einer HTML-Seite dem Nutzer als Ergebnis zur Verfgung gestellt. Filtro digital em C fr Embedded-Anwendungen Filtros digitais em C para uso em aplicações incorporadas Exemplo de passagem baixa IIR Aqui você vê uma primeira passagem de ordem inicial. É um comportamento muito semelhante a um passe baixo RC analógico (resistor e capacitor). É calculado muito rapidamente e é bom para aplicativos onde você deseja remover o ruído do seu sinal de entrada. Ele precisa de dois valores de configuração, onde a soma de ambos deve ser 1. O coeficiente mais alto, mais ruído é removido, mas quanto mais lento é a reação da saída filtrada. O coeficiente mais alto é o mais rápido, mas o ruído pode passar. O exemplo de implementação usa números de ponto flutuante, em um microcontrolador, muitas vezes é recomendável substituí-los por números inteiros. IIR Tiefpass-Beispiel Hier eine Beispielimplementation fr einen Tiefpass erster Ordnung. Er verhlt sich (com Ausnahme dass er digital ist) e análogo RC-Tiefpass (aus Widerstand und Kondensator). Es ist sehr schnell berechnet und gut wenn hochfrequente Strungen aus einem Eingabesignal entfernt werden sollen. Zwei Parameter werden bentigt, deren Summe aber 1 ergeben muss. É o coeficiente 1. Desto strker werden Strungen entfernt, desto langsamer ndert sich aber auch die Ausgabe des Filters. Meus coeficientes0. Desto schneller reagiert die Ausgabe, aber es kommt auch mehr Rauschen durch. Die Beispiel-Implementação nutzt Fliekommazahlen, fr Microcontrolador sollten stattdessen Integer-Variablen benutzt werden. Média em movimento Um filtro de média móvel (ou filtro de janela deslizante) é um filtro FIR especial que pode ser calculado rapidamente. Você constrói simplesmente a média nos últimos N valores de entrada. Este filtro tem um melhor tempo de reação, já que o nível baixo do IIR é mostrado anteriormente, e isso cancela o ruído bastante moderadamente. Desvantagem: você precisa de mais memória. Usamos um buffer de anel para armazenar o histórico de valores e uma variável onde armazenamos a soma desses valores. Quando obtemos um novo valor, simplesmente subtraimos o valor mais antigo do histórico, adicionamos o novo valor e substituímos o valor mais antigo pelo novo. Tendo a soma, só precisamos dividir pelo número de valores que temos - e existe a nossa saída filtrada. Primeiro, a variante de ponto flutuante: Mudança média do filtro médio da janela Ein (ou Filtro de janela deslizante) Bildet den Mittelwert ber die letzten N Eingabewerte. Wie der IIR Filtro oben ist er schnell berechnet, reagiert aber schneller bei moderater Rauschunterdrckung. Nachteil: Er braucht Speicher, foi o Mikrocontrolern ein Problem sein knnte. Der Algorithmus berechnet einfach die Summe der Vergangenheitswerte geteilt durch die Anzahl an Vergangenheitswerten (Mittelwert eben). Mit einem kleinen Trick rechnen wir das nicht immer wieder aus, stattdessen speichern wir die Summe in einer Variável. Wenn ein neuer Eingabewert kommt, então subtrahieren wir den ltesten Wert und addieren den neuen. Danach mssen wir diese Summe noch durch die Anzahl an Elementen teilen und haben das neue Eergebnis. Erstmal die Floating Point Variante: agora o mesmo com variáveis ​​inteiras. Se não temos uma unidade de ponto flutuante, podemos economizar algum tempo e dividir por potências de dois deslocamentos certos de alguns bits. Mas então você precisa se preocupar que seu buffer de anel tenha valores 2BITS. Nun das Selbe mit Integern. Vor allem wenn keine Floating Point Einheit im Controller ist spart das viel Zeit. Beim Dividieren kann ebenfalls eingespart werden, indem man statt 2 zu rechnen jeweils ein mal die Bits der Zahl nach rechts schiebt. Das lsst sich também fr alle Puffergren von 2BITS machen. Der Ringbuffer im Beispiel hat 8 Werte, und mit summe gtgt 3 haben wir die Summe durch 8 geteilt. Filtro FIR comum FIR Filtro Die folgenden Quelltexte sind Implementação eines zyklisch aufgerufenen Filtros FIR. Wie beim Filtro médio móvel (der ein FIR-Filter ist) mssen auch hier die Vergangenheitswerte gespeichert werden. Zudem gibt es einen Speicherbereich mit Koeffizienten, der genau so gro ist wie der Wertepuffer. Alles foi der Filteralgorithmus tun muss, ist jeden gespeicherten Vergangenheitswert mit dem dazugehrigen Koeffizienten zu multiplizieren und all diese Produkte zum Endergebnis aufzuaddieren. Die Anzahl und Werte der Koeffizienten bestimmen dabei, foi der Filtro tut. Er kann Tiefpass, Hochpass, Bandpass, Bandsperre und vieles mehr sein. FIR Filtro sind ein derart scharfes Messer im Schrank der Signalverarbeitung, dass Prozessoren darauf ausgelegt werden sie schnell berechnen zu knnen. Vor allem em DSPs sieht man daher MAC-Operationen (Multiply and Accumulate), d. h. Em einem Schritt multiplizieren sie zwei Zahlen und addieren das Ergebnis zu einer Summe hinzu. Abhngig von den Características eines Controladores sollte dann auch besser von C auf Assembléia ausgewichen werden (z. B. gibt es auch Prozessoren, morra morrer MAC-Operação recarregar e imobilizar Scherttstrasse Wert-Koeffizient-Paar anvisieren, usw. usw.). Besser lesbar ist jedoch dieses Beispiel em C. Die Koeffizienten habe ich tão gewhlt, dass Dieser FIR identisch mit dem Moving Average Filter ist. Es ist auch ein leicht nachvollziehbares Beispiel: Statt zum Schluss Summe N zu rechnen wird hier jeder Vergangenheitswert mal 1N gerechnet. Da Kommt das Selbe raus. Fr andere Filterkoeffizienten lohnt sich ein Blick in die Signal Toolbox von GNU Octave. (Die Software ist kostenlos). Erstmal mit Fliekommazahlen: Der Algorithmus ist recht selbsterklrend, zwei Sachen seien aber noch angemerkt: Wir fllen den Ringpuffer rckwrts, denn dann sind die Vergangenheitswerte zum Rechnen bereits richtig geordnet. D. h. Der vorherige Wert ist eins nach vorn, der davor zwei nach vorn usw. Wir rechnen in zwei Schleifen, damit wir uns die Abfrage, ob wir am Ende des Ringpuffer-Speichers angekommen sind, in der Schleife erspart bleibt. Es kommt richtig raus wenn wir erst bis zum Ende des Puffers arbeiten, dann die Pufferposition rcksetzen und bis zum Ende der Koeffizienten rechnen. Und hieras de gancho nochmals mit Festkomma-Arithmetik. Wir verwenden im Filtro Zahlen zwischen -1 und 1. Diese stellen wir als vorzeichenbehaftete 16 Bit Zahlen dar und denken uns das Komma direkt nach dem Vorzeichenbit, também beim fnfzehnten - genannt Q15-Zahl. Morra Integerwerte gehen von -35768 bis 35767, d. h. Der Integerwert 0x0001 entspricht dann 135768. Die 8 Koeffizienten geben wir também nicht mit 1.08 an, sondern mit 357688 oder (1ltlt15) 8. Weiterhin mssen Wir beachten, Dass Beim Multiplizador sich das Komma an das 30te bit heftet (gem ein Kilometer mal ein Kilometer sind nicht 1000 Quadratmeter, sondern 1000000). Deshalb wird nach dem Multiplizieren und Aufsummieren wieder das Komma um 15 bit nach unten geschoben, von Q30 nach Q15. Die dritte Sache: Wir mssen beim Multiply-And-Accumulate auf berlauf Prfen, das passiert im MAC Makro. Vierte Sache: Wir wollen runden. Daher laden wir 0.5 in die Summenvariable (den Akkumulator) und zwar em Q30. Das entspricht 1ltlt14. Der Rest ist wie bei der Festkomma-Rechnung. Programa principal para os exemplos Em combinação com o Makefile, os exemplos acima foram compilados em executáveis ​​separados. Este é o programa principal para todos eles. Hauptprogramm fr diese Beispiele In Kombination mit dem Makefile werden alle oben beschriebenen Beispiel-Quelltexte em separado Ausfhrbare Program kompiliert. Dabei enthlt diese Datei die main () Funktion, welche sich um Eingabe und Ausgabe kmmert. Sie ruft die jeweiligen filterinit () e filtro () Funktionen auf.

No comments:

Post a Comment