Wednesday 29 November 2017

Moving average code matlab


Usando o MATLAB, como posso encontrar a média móvel de 3 dias de uma coluna específica de uma matriz e acrescentar a média móvel a essa matriz, estou tentando calcular a média móvel de 3 dias de baixo para o topo da matriz. Eu forneci meu código: dada a seguinte matriz a e máscara: tentei implementar o comando conv, mas recebo um erro. Aqui está o comando conv que eu tentei usar na 2ª coluna da matriz a: A saída que eu desejo é dada na seguinte matriz: Se você tiver alguma sugestão, eu apreciaria muito. Obrigado Para a coluna 2 da matriz a, estou informando a média móvel de 3 dias da seguinte forma e colocando o resultado na coluna 4 da matriz a (Eu renomeado a matriz a como 39desiredOutput39 apenas para ilustração). A média de 3 dias de 17, 14 e 11 é de 14 a média de 3 dias de 14, 11, 8 é 11, a média de 3 dias de 11, 8, 5 é de 8 e a média de 3 dias de 8, 5, 2 é 5. Não há valor nas 2 linhas inferiores para a 4ª coluna porque a computação para a média móvel de 3 dias começa na parte inferior. A saída 39valid39 não será mostrada até pelo menos 17, 14 e 11. Espero que isso faça sentido ndash Aaron 12 de junho 13 às 1:28 Em geral, isso ajudaria se você mostrar o erro. Neste caso, você está fazendo duas coisas erradas: primeiro sua convolução precisa ser dividida por três (ou o comprimento da média móvel) Em segundo lugar, observe o tamanho de c. Você não pode simplesmente se encaixar em c. A maneira típica de obter uma média móvel seria usar o mesmo: mas isso não se parece com o que você deseja. Em vez disso, você é obrigado a usar algumas linhas: preciso calcular uma média móvel em uma série de dados, dentro de um loop for. Eu tenho que obter a média móvel em N9 dias. A matriz Im computação é uma série de 365 valores (M), que em si é 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 procurei um pouco sobre as médias móveis e o comando conv e encontrei algo que eu tentei implementar no meu código. Então, basicamente, eu calculo o meu significado e traço-o com uma média móvel (errada). Eu escolhi o valor de Wts diretamente do site Mathworks, então isso é incorreto. (Fonte: mathworks. nlhelpeconmoving-average-trend-estimation. html) Meu problema, porém, é que eu não entendo o que é esse wts. Alguém poderia explicar Se isso tem algo a ver com os pesos dos valores: isso é inválido neste caso. Todos os valores são ponderados da mesma forma. E se eu estiver fazendo isso inteiramente errado, eu poderia obter alguma ajuda com ele Meus mais sinceros agradecimentos. Perguntou 23 de setembro 14 às 19:05 Usando conv é uma excelente maneira de implementar uma média móvel. No código que você está usando, é o quanto você está pesando cada valor (como você adivinhou). A soma desse vetor deve ser sempre igual a uma. Se você deseja pesar cada valor de forma uniforme e fazer um filtro móvel N de tamanho, então você gostaria de fazer. Usando o argumento válido em conv resultaria em ter menos valores na Ms do que em M. Use o mesmo se você não se importar com os efeitos de Zero preenchimento. Se você tiver a caixa de ferramentas de processamento de sinal, você pode usar o cconv se quiser testar uma média móvel circular. Algo como Você deve ler a documentação conv e cconv para obter mais informações se você não tiver já. Descarregue movAv. m (veja também movAv2 - uma versão atualizada que permite a ponderação) Descrição O Matlab inclui funções chamadas movavg e tsmovavg (média móvel em séries temporais) no Financial Toolbox, movAv foi projetado para replicar a funcionalidade básica destes. O código aqui fornece um bom exemplo de gerenciar í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. MovAv executa uma média móvel simples que pode ser usada para recuperar dados ruidosos em algumas situações. Ele 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 de passagem baixa - 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 a pena testar valores diferentes para ver o que é apropriado. Lembre-se também de que n pontos são perdidos em cada média se n for 100, os primeiros 99 pontos do vetor de entrada não contêm dados suficientes para uma média de 100pt. Isso pode ser evitado um pouco ao empilhar médias, por exemplo, o código e o gráfico abaixo comparam uma série de médias de largura de comprimento diferentes. Observe o quão suave 1010pt é comparado a uma única média de 20pt. Em ambos os casos, 20 pontos de dados são perdidos no total. Criar xaxis x1: 0.01: 5 Gerar ruído ruído Reps 4 repag ruido (randn (1, ceil (numel (x) noiseReps)), noiseReps, 1) ruim remodelar (ruído, 1, comprimento (ruído) noiseReps) Gerar ydata noise yexp ( X) 10noise (1: comprimento (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 Y6 movAv (y, 100) 100 pt Plot figura trama (x, y, y2, y3, y4, y5, y6) lenda (dados brutos, 10pt de média móvel, 1010pt, 20pt, 40pt, 100pt) xlabel (x) ylabel ( Y) título (Comparação de médias móveis) MovAv. m código execução de saída de função 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 executar a média em, n deve ser o número de pontos para executar a média sobre a saída irá conter a média de dados retornados pela função. Prealocar output outputNaN (1, numel (y)) Encontrar ponto médio de n round do midPoint (n2) O trabalho principal da função é feito no loop for, mas antes de iniciar duas coisas são preparadas. Em primeiro lugar, o resultado é pré-alocado como NaNs, isso serviu para dois propósitos. Em primeiro lugar, a pré-alocação geralmente é uma boa prática, pois reduz a manipulação de memória que a Matlab precisa 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. Isso 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 (saída de saída (O midPoint variável será usado 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 ter uma média de 10 pontos. Como o resultado será menor do que a entrada, ele precisa estar alinhado corretamente. O MidPoint irá Ser usado para que uma quantidade igual de dados seja perdida no início e no final e a entrada é mantida alinhada com a saída pelos buffers de NaN criados ao pré-alocar a saída. Para um comprimento de 1: comprimento (y) - n Alcance do índice para levar a média Sobre (a: b) ban Calcule a média de saída (amidPoint) mean (y (a: b)) end No próprio loop for, uma média é tomada em cada segmento consecutivo da entrada. O loop será executado para a. Which is 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 é 10, o loop será executado a partir de (a) 1 a 90. Isso significa que a fornece o primeiro índice do segmento a ser calculado como média. O segundo índice (b) é simplesmente um-1. Então, na primeira iteração, a1. N10. Então 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. Então a média é tomada em 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 para que a média seja tomada sobre x (91: 100) e armazenada na saída (95). Isso 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 elas nem sempre são a melhor escolha. Aqui estão dois exemplos em que 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 registrada por um microfone com uma resposta linear conhecida. A saída do alto-falante varia com a freqüência, mas podemos corrigir esta variação com os dados de calibração - a saída pode ser ajustada em nível para atender as flutuações na calibração. Observe que os dados brutos são ruidosos - isso significa que uma pequena alteração na freqüência parece exigir uma grande, errática, mudança no nível a ser considerada. Isso é realista Ou isso é um produto do ambiente de gravação. É razoável, neste caso, aplicar uma média móvel que suaviza a curva de freqüência de nível para fornecer uma curva de calibração que é ligeiramente menos errática. Mas por que isso não é ótimo neste exemplo Mais dados seriam melhores - as calibrações múltiplas correm em média juntos destruirão o ruído no sistema (desde que seja aleatório) e proporcionem uma curva com menos detalhes sutis perdidos. A média móvel só pode se aproximar disso, e pode remover alguns mergulhos de freqüência mais altos e picos da curva que realmente existem. Ondas sinusoidais A utilização de uma média móvel em ondas senoticas destaca dois pontos: a questão geral de escolher um número razoável de pontos para realizar a média. É simples, mas existem métodos de análise de sinal mais efetivos que a média de sinais oscilantes no domínio do tempo. Neste gráfico, a onda senoidal original é plotada em azul. O 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 proporcionam resultados razoáveis, mas não eliminam completamente o ruído, onde, à medida que 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 da onda oscilar em torno de zero e significar (-1 1) 0) . Um enfoque alternativo seria a construção de um filtro de passagem 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 é uma freqüência consideravelmente maior do que a freqüência fundamental das ondas, seria bastante fácil, neste caso, construir um filtro de passagem baixa do que remover a alta freqüência barulho.

No comments:

Post a Comment