Thursday, 4 May 2017

Matlab Moving Average Double



Estou tentando fazer um filtro de média móvel em linguagem C, Ive adaptado um programa matlab que funciona corretamente, a entrada do meu filtro é um arquivo. pcm (um sinal de varredura de áudio), o problema para mim é o arquivo de saída do movimento Média na linguagem C, a saída vai mal, o sinal só diminui ao longo do tempo (não filtter). Abaixo do meu código C: A imagem abaixo é a saída do programa matlab para a média móvel com comprimento 16: Esta imagem é a saída em linguagem C com média móvel com comprimento 16: Alguém sabe o que pode ser Abaixo do código em matlab, que Ive Adaptado: Atualização 1 (Usando a resposta acima): O início do sinal ainda com interferência, mas a partir do meio para o final do sinal é corretamente. Download movAv. m (ver também movAv2 - uma versão atualizada permitindo a ponderação) Descrição Matlab Inclui funções chamadas movavg e tsmovavg (séries temporais de média móvel) no Financial Toolbox, o movAv foi projetado para replicar a funcionalidade básica destes. O código aqui fornece um bom exemplo de gerenciamento de índices dentro de loops, o que pode ser confuso para começar. Ive deliberadamente mantido o código curto e simples para manter este processo claro. O movAv executa uma média móvel simples que pode ser usada para recuperar dados ruidosos em algumas situações. Funciona tomando uma média da entrada (y) sobre uma janela de tempo deslizante, cujo tamanho é especificado por n. Quanto maior for n, maior a quantidade de suavização do efeito de n é relativa ao comprimento do vetor de entrada y. E efetivamente (bem, tipo de) cria um filtro de freqüência lowpass - veja a seção de exemplos e considerações. Como a quantidade de suavização fornecida por cada valor de n é relativa ao comprimento do vetor de entrada, sempre vale a pena testar diferentes valores para ver o que é apropriado. Lembre-se também de que n pontos são perdidos em cada média se n é 100, os primeiros 99 pontos do vetor de entrada não contêm dados suficientes para uma média de 100pt. Isto pode ser evitado um pouco empilhando médias, por exemplo, o código eo gráfico abaixo comparam um número de diferentes médias de janela de comprimento. Observe como liso 1010pt é comparado a uma única 20pt média. Em ambos os casos, 20 pontos de dados são perdidos no total. Criar xaxis x1: 0.01: 5 Gerar ruído noiseReps 4 ruído repmat (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) reestruturação de ruído (ruído, 1, X) 10noise (1: length (x)) Médias de Perfrom: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 pt (X, y, y2, y3, y4, y5, y6) legenda (dados brutos, média móvel 10pt, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel Y) título (Comparação de médias móveis) movAv. m função de execução do programa movAv (y, n) A primeira linha define o nome das funções, entradas e saídas. A entrada x deve ser um vetor de dados para realizar a média em, n deve ser o número de pontos a executar a média sobre a saída conterá os dados médios retornados pela função. Prealocar a saída outputNaN (1, numel (y)) Encontrar o ponto médio de n midPoint round (n2) O trabalho principal da função é feito no loop for, mas antes de iniciar duas coisas são preparadas. Em primeiro lugar a saída é pré-alocada como NaNs, isso serviu dois propósitos. Em primeiro lugar, a pré-alocação é geralmente uma boa prática, pois reduz a memória que o Matlab tem de fazer, em segundo lugar, torna muito fácil colocar os dados médios em uma saída do mesmo tamanho do vetor de entrada. Isto significa que o mesmo xaxis pode ser usado mais tarde para ambos, o que é conveniente para plotar, alternativamente, os NaNs podem ser removidos mais tarde em uma linha de código (output output (A variável midPoint será utilizada para alinhar os dados no vetor de saída. N 10, 10 pontos serão perdidos porque, para os primeiros 9 pontos do vetor de entrada, não há dados suficientes para tomar uma média de 10. Como a saída será menor do que a entrada, ele precisa ser alinhado corretamente. Ser usado para que uma quantidade igual de dados seja perdida no início e no fim e a entrada seja mantida alinhada com a saída pelos buffers NaN criados quando a saída de pré-alocação for. Over (a: b) ban Calcular a saída média (amidPoint) mean (y (a: b)) end No loop for, uma média é tomada em cada segmento consecutivo da entrada. Definido como 1 até o comprimento da entrada (y), menos os dados que serão perdidos (n).Se a entrada é 100 pontos lo Ng e n é 10, o ciclo irá decorrer de (a) 1 a 90. Isto significa a proporciona o primeiro índice do segmento a ser calculado a média. O segundo índice (b) é simplesmente an-1. Assim, na primeira iteração, a1. N10. Assim b 11-1 10. A primeira média é tomada sobre y (a: b). Ou x (1:10). A média desse segmento, que é um valor único, é armazenada na saída no índice amidPoint. Ou 156. Na segunda iteração, a2. B 210-1 11. Assim a média é tomada sobre x (2:11) e armazenada na saída (7). Na última iteração do laço para uma entrada de comprimento 100, a91. B 9010-1 100 assim que a média é tomada sobre x (91: 100) e armazenada na saída (95). Isto deixa a saída com um total de n (10) valores de NaN no índice (1: 5) e (96: 100). Exemplos e considerações As médias móveis são úteis em algumas situações, mas nem sempre são a melhor escolha. Aqui estão dois exemplos onde eles não são necessariamente ótimos. Calibração do microfone Este conjunto de dados representa os níveis de cada freqüência produzida por um alto-falante e gravada por um microfone com uma resposta linear conhecida. A saída do alto-falante varia com a freqüência, mas podemos corrigir essa variação com os dados de calibração - a saída pode ser ajustada em nível para considerar as flutuações na calibração. Observe que os dados brutos são barulhentos - isso significa que uma pequena mudança de freqüência parece exigir uma grande alteração errática no nível a ser considerado. É este realista Ou é este um produto do ambiente de gravação É razoável, neste caso, para aplicar uma média móvel que suaviza a curva de nível de freqüência para fornecer uma curva de calibração que é ligeiramente menos errático. Mas por que isso não é o ideal neste exemplo? Mais dados seriam melhores - múltiplas calibrações executadas em média destruiriam o ruído no sistema (enquanto o seu aleatório) e fornecessem uma curva com menos detalhes sutis perdidos. A média móvel pode somente aproximar isto, e pode remover alguns mergulhos da freqüência mais elevada e os picos da curva que realmente existem. Seno ondas Usando uma média móvel em ondas senoidal destaca dois pontos: A questão geral de escolher um número razoável de pontos para realizar a média mais. Seu simples, mas há métodos mais eficazes de análise de sinal do que a média dos sinais oscilantes no domínio do tempo. Neste gráfico, a onda sinusoidal original é plotada em azul. O ruído é adicionado e plotado como a curva laranja. Uma média móvel é realizada em números diferentes de pontos para ver se a onda original pode ser recuperada. 5 e 10 pontos fornecem resultados razoáveis, mas não removam o ruído inteiramente, onde como um número maior de pontos começa a perder detalhe de amplitude como a média se estende sobre fases diferentes (lembre-se a onda oscila em torno de zero, e média (-1 1) 0) . Uma abordagem alternativa seria construir um filtro passa-baixa que possa ser aplicado ao sinal no domínio da frequência. Eu não vou entrar em detalhes, pois vai além do escopo deste artigo, mas como o ruído é consideravelmente maior freqüência do que a freqüência das ondas fundamental, seria bastante fácil, neste caso, para construir um filtro passa-baixa que irá remover a alta freqüência Eu preciso calcular uma média móvel sobre uma série de dados, dentro de um loop for. Eu tenho que obter a média móvel em N9 dias. O array Im computing in é 4 séries de 365 valores (M), que são valores médios de outro conjunto de dados. Eu quero traçar os valores médios dos meus dados com a média móvel em um gráfico. Eu pesquisei um pouco sobre as médias móveis eo comando conv e encontrei algo que eu tentei implementar no meu código. Então, basicamente, eu computo o meu médio e plotá-lo com uma média móvel (errada). Eu escolhi o valor de wts fora do site mathworks, de modo que está incorreto. (Fonte: mathworks. nlhelpeconmoving-average-trend-estimation. html) Meu problema, porém, é que eu não entendo o que este wts é. Alguém poderia explicar Se tem algo a ver com os pesos dos valores: que é inválido neste caso. Todos os valores são ponderados da mesma forma. E se eu estou fazendo isso inteiramente errado, eu poderia obter alguma ajuda com ele Meus mais sinceros agradecimentos. September 23 14 at 19:05 Usando conv é uma excelente maneira de implementar uma média móvel. No código que você está usando, wts é o quanto você está pesando cada valor (como você adivinhou). A soma desse vetor deve ser sempre igual a um. Se você deseja pesar cada valor uniformemente e fazer um filtro de tamanho N em movimento, então você gostaria de fazer Usando o argumento válido em conv resultará em ter menos valores em Ms do que você tem em M. Use o mesmo se você não se importa os efeitos de Zero preenchimento. Se você tiver a caixa de ferramentas de processamento de sinal, você pode usar o cconv se quiser experimentar uma média móvel circular. Algo como Você deve ler a documentação conv e cconv para obter mais informações se você já não. Você pode usar o filtro para encontrar uma média em execução sem usar um loop for. Este exemplo encontra a média em execução de um vetor de 16 elementos, usando um tamanho de janela de 5. 2) suave como parte da Caixa de Ferramentas de Ajuste de Curva (que está disponível na maioria dos casos) yy suave (y) suaviza os dados no vetor de coluna Y usando um filtro de média móvel. Os resultados são retornados no vetor de coluna yy. O intervalo padrão para a média móvel é 5.Double Moving Average Filter Descrição O DoubleMovingAverageFilter implementa um filtro de média móvel de passagem baixa. O DoubleMovingAverageFilter faz parte dos módulos de pré-processamento. Um exemplo de um sinal (ruído aleatório de onda senoidal) filtrado usando um filtro de média móvel. O sinal vermelho é o ruído do sinal original, o sinal verde é o sinal filtrado usando um filtro de média móvel com um tamanho de janela de 5 eo sinal azul é o sinal filtrado usando um filtro de média móvel com um tamanho de janela de 20. DoubleMovingAverageFilterExampleImage1. Jpg Vantagens O DoubleMovingAverageFilter é bom para remover uma pequena quantidade de ruído de alta freqüência de um sinal N dimensional. Desvantagens A principal desvantagem do DoubleMovingAverageFilter é que, para filtrar significativamente o ruído de alta freqüência, o tamanho da janela do filtro precisa ser grande. O problema com ter uma grande janela de filtro é que isso irá induzir uma latência grande em qualquer sinal que passa através do filtro, o que pode não ser vantajoso para aplicações em tempo real. Se você achar que você precisa de uma grande janela de filtro para filtrar o ruído de alta freqüência ea latência induzida por este tamanho de janela não é adequado para o seu aplicativo em tempo real, então você pode querer experimentar um filtro de baixa passagem em vez disso. Exemplo de código GRT DoubleMovingAverageFilter Exemplo Este exemplo demonstra como criar e usar o Módulo de Pré-Processamento DoubleMovingAverageFilter GRT. O DoubleMovingAverageFilter implementa um filtro de média móvel de baixa passagem. Neste exemplo, criamos uma instância de um DoubleMovingAverageFilter e usamos isso para filtrar alguns dados fictícios, gerados a partir de um ruído aleatório de onda senoidal. O sinal de teste e os sinais filtrados são salvos em um arquivo (assim você pode traçar os resultados em Matlab, Excel, etc. se necessário). Este exemplo mostra como: - Criar uma nova instância DoubleMovingAverageFilter com um tamanho de janela específico para um sinal de 1 dimensão - Filtrar alguns dados usando o DoubleMovingAverageFilter - Salvar as configurações de DoubleMovingAverageFilter em um arquivo - Carregar as configurações de DoubleMovingAverageFilter de um arquivo incluem quotGRT. hquot Usando namespace GRT int main 40 int argc. Const char argv 91 93 41 123 Criar uma nova instância de um filtro de média móvel dupla com um tamanho de janela de 5 para um sinal de 1 dimensão DoubleMovingAverageFilter filtro 40 5. 1 41 Criar e abrir um arquivo para salvar o arquivo de arquivo de dados fstream. Abra 40 quotDoubleMovingAverageFilterData. txtquot. Fstream. Out 41 Gerar alguns dados (ruído de onda senoidal) e filtrá-lo x 0 const UINT M 1000 Aleatório aleatório para 40 UINT i 0 i lt M i 41 123 sinal duplo sin 40 x 41 aleatório. GetRandomNumberUniform 40 - 0,2. 0,2 Filtro de filtro duplo filtrado. Filtro 40 sinal 41 arquivo ltlt sinal ltlt quot t qut ltlt filterValue ltlt endl x TWOPI double 40 M 41 10 125 Feche o arquivo de arquivo. Close 40 41 Salve as configurações do filtro em um filtro de arquivo. SaveSettingsToFile 40 quotDoubleMovingAverageFilterSettings. txtquot 41 Podemos então carregar as configurações mais tarde, se necessário filtro. LoadSettingsFromFile 40 quotDoubleMovingAverageFilterSettings. txtquot 41 return EXITSUCCESS 125 O DoubleMovingAverageFilter também funciona com qualquer sinal N dimensional: Crie uma nova instância do DoubleMovingAverageFilter com um tamanho de janela de 10 para um sinal tridimensional DoubleMovingAverageFilter filter 40 10. 3 41 O valor que você deseja filtrar Vector lt dados gt duplos 40 3 41 dados 91 0 93 0. Obter valor dos dados do sensor 91 1 93 0. Obter valor dos dados do sensor 91 2 93 0. Obter valor do sensor Filtrar o vetor de sinal lt duplo filtro filterValue gt. Dados do filtro 40 41

No comments:

Post a Comment