Descrição O Matlab inclui funções chamadas movavg e tsmovavg (média móvel de séries temporais) na Caixa de Ferramentas Financeira, 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 Ruído. Criado em Quarta-feira, 08 de Outubro de 2008 20:04 Última Atualização em Quinta, 14 Março 2013 01:29 Escrito por Batuhan Osmanoglu Hits: 41486 Moving Average Em Matlab Muitas vezes eu me encontro na necessidade de calcular a média dos dados que tenho para reduzir o ruído um pouco. Eu escrevi funções de casal para fazer exatamente o que eu quero, mas matlabs construído em função de filtro funciona muito bem também. Aqui Ill escrever sobre 1D e 2D média de dados. 1D filtro pode ser realizado usando a função de filtro. A função de filtro requer pelo menos três parâmetros de entrada: o coeficiente do numerador para o filtro (b), o coeficiente do denominador para o filtro (a) e os dados (X), é claro. Um filtro de média em execução pode ser definido simplesmente por: Para dados 2D, podemos usar a função Matlabs filter2. Para obter mais informações sobre como o filtro funciona, você pode digitar: Aqui está uma implementação rápida e suja de um filtro de média móvel 16 por 16. Primeiro precisamos definir o filtro. Uma vez que tudo o que queremos é a contribuição igual de todos os vizinhos, podemos apenas usar a função uns. Nós dividimos tudo com 256 (1616) desde que nós não queremos mudar o nível geral (amplitude) do sinal. Para aplicar o filtro podemos simplesmente dizer o seguinte Abaixo estão os resultados para a fase de um interferograma SAR. Neste caso Range está no eixo Y e Azimuth é mapeado no eixo X. O filtro era de 4 pixels de largura em Gama e 16 pixels de largura em Azimute. Estou tentando concluir um projeto de atribuição matlab com a seguinte pergunta: Escrever uma função chamada movimentação que leva um escalar chamado x como um argumento de entrada e retorna um escalar. A função usa um buffer para armazenar entradas anteriores, eo buffer pode conter um máximo de 25 entradas. Especificamente, a função deve salvar as mais recentes 25 entradas em um vetor (o buffer). Cada vez que a função é chamada, ela copia o argumento de entrada para um elemento do buffer. Se já houver 25 entradas armazenadas no buffer, descarta o elemento mais antigo e salva o atual no buffer. Depois de ter armazenado a entrada no buffer, ele retorna a média de todos os elementos no buffer. A solução que eu forneço é a seguinte: De acordo com o auto grader minha função funciona corretamente quando os valores 1-50 estão passando consecutivamente, mas falha quando os valores de uma onda senoidal barulhenta estão passando consecutivamente (o que eu tenho sido informado que pode ser devido a alguns Tipo de um erro de arredondamento). Gostaria de ser grato se algum de vocês pudesse me fornecer algumas dicas sobre os possíveis passos de erro no meu código (anexado acima). Obrigado antecipadamenteMoving Average Function resultmovingmean (dados, janela, dim, opção) calcula uma média móvel centralizada dos dados da matriz de dados usando um tamanho de janela especificado na janela na dimensão dim, usando o algoritmo especificado na opção. Dim e opção são entradas opcionais e padrão para 1. Dim e opção opcional entradas podem ser ignoradas completamente ou podem ser substituídas por a. Por exemplo, movingmean (dados, janela) dará os mesmos resultados que movingmean (data, window, 1,1) ou movingmean (data, window ,, 1). O tamanho ea dimensão da matriz de dados de entrada são limitados apenas pelo tamanho máximo da matriz para a sua plataforma. A janela deve ser um número inteiro e deve ser ímpar. Se a janela é mesmo então é arredondado para baixo para o próximo número impar mais baixo. Função calcula a média móvel incorporando um ponto central e (janela-1) 2 elementos antes e depois na dimensão especificada. Nas bordas da matriz, o número de elementos antes ou depois é reduzido de modo que o tamanho real da janela seja menor que a janela especificada. A função é dividida em duas partes, um algoritmo 1d-2d e um algoritmo 3D. Isto foi feito para optimizar a velocidade da solução, especialmente em matrizes menores (isto é, 1000 x 1). Além disso, vários algoritmos diferentes para o problema 1d-2d e 3d são fornecidos como em certos casos o algoritmo padrão não é o mais rápido. Isto tipicamente acontece quando a matriz é muito larga (isto é 100 x 100000 ou 10 x 1000 x 1000) e a média móvel está a ser calculada na dimensão mais curta. O tamanho onde o algoritmo padrão é mais lento dependerá do computador. MATLAB 7.8 (R2009a) Tags para este arquivo Por favor, faça o login para marcar arquivos. Faça o login para adicionar um comentário ou avaliação. Comentários e Avaliações (8) A função lida com as extremidades, cortando a porção de arrasto ou líder da janela e fazendo a transição para uma média móvel inicial ou descendente em vez de uma centrada. Para ir com o exemplo que você deu no seu comentário se o tamanho da janela é 3, em seguida, em um centro de 1 a média da função de dados de pontos 1 e 2 em um centro de 2 pontos 1, 2 e 3 são calculados em um centro de 9 Os pontos 8, 9 e 10 são médios e num centro de 10 (permite assumir que o vector tem 10 entradas) os pontos 9 e 10 são calculados em média. Como é que movemean lidar com as extremidades Começa com um tamanho de janela que abrange apenas o ponto 1 em 1, em seguida, 3 pontos no ponto 2, em seguida, aumentando no tamanho da janela até que o tamanho da janela é o especificado na entrada de função Obrigado. Agradável e simples. Obrigado. Bom trabalho Muito útil como disse Stephan Wolf. Apenas o que eu estava procurando. Média móvel centrada que é capaz de trabalhar em um enredo em toda a largura, sem ter que olhar para o tamanho da janela do filtro e mover o início. Great Acelerando o ritmo da engenharia e da ciência MathWorks é o desenvolvedor líder de software de computação matemática para engenheiros e cientistas.
No comments:
Post a Comment