Friday 11 May 2018

Moving average filter matlab code example


The Scientist and Engineers Guide to Digital Signal Processing por Steven W. Smith, Ph. D. Como o nome indica, o filtro de média móvel opera calculando a média de um número de pontos do sinal de entrada para produzir cada ponto no sinal de saída. Na forma de equação, isso está escrito: Onde está o sinal de entrada, é o sinal de saída e M é o número de pontos na média. Por exemplo, em um filtro de média móvel de 5 pontos, o ponto 80 no sinal de saída é dado por: Como alternativa, o grupo de pontos do sinal de entrada pode ser escolhido simetricamente em torno do ponto de saída: . 15-1 de: j 0 a M -1, a: j - (M -1) / 2 a (M -1) / 2. Por exemplo, em um filtro de média móvel de 10 pontos, o índice, j. pode executar de 0 a 11 (média de um lado) ou -5 a 5 (média simétrica). A média simétrica requer que M seja um número ímpar. A programação é um pouco mais fácil com os pontos em apenas um lado, no entanto, isso produz um deslocamento relativo entre os sinais de entrada e saída. Você deve reconhecer que o filtro de média móvel é uma convolução usando um kernel de filtro muito simples. Por exemplo, um filtro de 5 pontos tem o kernel do filtro: 82300, 0, 1/5, 1/5, 1/5, 1/5, 1/5, 0, 08230. Ou seja, o filtro da média móvel é uma convolução do sinal de entrada com um pulso retangular com uma área de um. A Tabela 15-1 mostra um programa para implementar o filtro de média móvel. Transfira movAv. m (consulte também movAv2 - uma versão atualizada que permite ponderar) Descrição O Matlab inclui funções chamadas movavg e tsmovavg (média móvel de séries temporais) na Caixa de Ferramentas Financeira, movAv é 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. Eu deliberadamente mantive o código curto e simples para manter esse processo claro. O movAv executa uma média móvel simples que pode ser usada para recuperar dados ruidosos em algumas situações. Ele funciona tomando a média da entrada (y) em uma janela de tempo variável, cujo tamanho é especificado por n. Quanto maior n for, maior será a quantidade de suavização do efeito de n em relação ao comprimento do vetor de entrada y. e efetivamente (bem, mais ou menos) cria um filtro de baixa freqüência - 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, vale sempre a pena testar valores diferentes para ver o que é apropriado. Lembre-se também que n pontos são perdidos em cada média se n for 100, os primeiros 99 pontos do vetor de entrada não contiverem dados suficientes para uma média de 100pt. Isso pode ser evitado de alguma forma pelo empilhamento de médias, por exemplo, o código e o gráfico abaixo comparam um número de diferentes médias de janela de comprimento. Observe como 1010pt suave é comparado a uma única média de 20pt. Em ambos os casos, 20 pontos de dados são perdidos no total. Crie xaxis x1: 0.01: 5 Gere ruído de ruídoRepita 4 ruído repmat (randn (1, ceil (numel (x) / ruídoRéps)), noiseReps, 1) noise reshape (noise, 1, length (ruído) noiseReps) Gere ydata noise yexp (x) 10noise (1: length (x)) Perfrom averages: y2 movAv (y, 10) 10 pt y3 movAv (y2, 10) 1010 pt y4 movAv (y, 20) 20 pt y5 movAv (y, 40) 40 pt y6 movAv (y, 100) 100 pt Legenda trama (x, y, y2, y3, y4, y5, y6) legenda (Dados brutos, 10pt, média móvel, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel (y) title (Comparação de médias móveis) movAv. m saída de função run-through do código movAv (y, n) A primeira linha define o nome da função, entradas e saídas. A entrada x deve ser um vetor de dados para executar a média em, n deve ser o número de pontos para executar a média sobre a saída conterá os dados médios retornados pela função. Pré-alocar a saída outputNaN (1, numel (y)) Encontrar o ponto médio de n midPoint round (n / 2) 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 a dois propósitos. Em primeiro lugar, a pré-alocação é geralmente uma boa prática, pois reduz o malabarismo de memória que o Matlab tem a fazer, em segundo lugar, torna muito fácil colocar os dados médios em uma saída do mesmo tamanho que o vetor de entrada. Isto significa que o mesmo xaxis pode ser usado posteriormente para ambos, o que é conveniente para plotagem, alternativamente os NaNs podem ser removidos posteriormente em uma linha de código (saída de saída (A variável midPoint será usada 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 obter uma média de 10 pontos. Como a saída será menor do que a entrada, ela precisa ser alinhada corretamente. ser usado para que uma quantidade igual de dados seja perdida no início e no final, e a entrada seja mantida alinhada com a saída pelos buffers NaN criados ao pré-alocar a saída para um intervalo de índice 1: length (y) - n Find para obter a média over (a: b) ban Calcular média de saída (amidPoint) média (y (a: b)) fim No loop for, uma média é tomada em cada segmento consecutivo da entrada. O loop será executado por a. definido como 1 até o comprimento da entrada (y), menos os dados que serão perdidos (n). Se a entrada for 100 pontos, ng e n são 10, o loop será executado de (a) 1 a 90. Isso significa que fornece o primeiro índice do segmento a ser medido. O segundo índice (b) é simplesmente an-1. Então, na primeira iteração, a1. n10. então b 11-1 10. A primeira média é assumida por 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. então a média é assumida x (2:11) e armazenada na saída (7). Na última iteração do loop para uma entrada de comprimento 100, a91. b 9010-1 100, então a média é retomada x (91: 100) e armazenada na saída (95). Isso deixa a saída com um total de n (10) valores 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 de 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 frequê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 ruidosos - isso significa que uma pequena mudança na frequência parece exigir uma mudança grande e errática no nível a ser considerada. Isso é realista? Ou é um produto do ambiente de gravação? É razoável, neste caso, aplicar uma média móvel que suaviza a curva de nível / frequência para fornecer uma curva de calibração ligeiramente menos errática. Mas por que isso não é o ideal neste exemplo? Mais dados seriam melhores - várias execuções de calibragem juntas destruiriam o ruído no sistema (desde que fosse aleatório) e forneceriam uma curva com detalhes menos sutis perdidos. A média móvel só pode aproximar isso, e pode remover algumas quedas e picos de freqüência mais altos da curva que realmente existem. Ondas senoidais Usando uma média móvel em ondas senoidais destaca dois pontos: A questão geral de escolher um número razoável de pontos para executar a média sobre. É simples, mas existem métodos mais eficazes de análise de sinais do que a média de sinais oscilantes no domínio do tempo. Neste gráfico, a onda senoidal original é plotada em azul. Ruído é adicionado e plotado como a curva laranja. Uma média móvel é realizada em diferentes números de pontos para ver se a onda original pode ser recuperada. 5 e 10 pontos fornecem resultados razoáveis, mas não removem completamente o ruído, onde um número maior de pontos começa a perder detalhes de amplitude à medida que a média se estende por diferentes fases (lembre-se que a onda oscila em torno de zero e média (-1 1) 0) Uma abordagem alternativa seria construir um filtro lowpass que pudesse ser aplicado ao sinal no domínio da freqüência. Não entrarei em detalhes, pois vai além do escopo deste artigo, mas como o ruído é consideravelmente mais frequente do que a freqüência fundamental das ondas, seria bastante fácil, neste caso, construir um filtro de baixa freqüência do que removeria a alta freqüência. noise. Moving-Average Filter of Traffic Data Este exemplo mostra como suavizar os dados do fluxo de tráfego usando um filtro de média móvel com uma janela deslizante de 4 horas. A seguinte equação de diferença descreve um filtro que calcula a média da hora atual e das três horas anteriores de dados. Importe os dados de tráfego e atribua a primeira coluna de contagens de veículos ao vetor x. Crie os vetores de coeficiente de filtro. Calcule a média móvel de 4 horas dos dados e traça os dados originais e os dados filtrados. MATLAB e Simulink são marcas registradas da The MathWorks, Inc. Consulte a mathworks / trademarks para obter uma lista de outras marcas registradas de propriedade da The MathWorks, Inc. Outros nomes de produtos ou marcas são marcas comerciais ou registradas de seus respectivos proprietários. Escolha o seu país

No comments:

Post a Comment