Estou tentando concluir um projeto de atribuição Matlab com a seguinte pergunta: Escreva uma função chamada movingaverage 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 antecipadamente 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. 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,29 setembro de 2013 Média móvel por convolução O que é média móvel e para que é bom Como a média móvel é feita usando a convolução A média móvel é uma operação simples usada geralmente para suprimir o ruído de um sinal: nós Defina o valor de cada ponto para a média dos valores em sua vizinhança. Por uma fórmula: Aqui x é a entrada ey é o sinal de saída, enquanto o tamanho da janela é w, suposto ser ímpar. A fórmula acima descreve uma operação simétrica: as amostras são tomadas de ambos os lados do ponto real. Abaixo está um exemplo da vida real. O ponto em que a janela é colocada realmente é vermelho. Valores fora de x são supostos ser zeros: Para brincar e ver os efeitos da média móvel, dê uma olhada nesta demonstração interativa. Como fazê-lo por convolução Como você pode ter reconhecido, o cálculo da média móvel simples é semelhante à convolução: em ambos os casos, uma janela é deslizada ao longo do sinal e os elementos na janela são resumidos. Então, dar-lhe uma tentativa de fazer a mesma coisa usando convolução. Use os seguintes parâmetros: A saída desejada é: Como primeira aproximação, vamos tentar o que obtemos ao converter o sinal x pelo k kernel seguinte: A saída é exatamente três vezes maior do que o esperado. Também pode ser visto que os valores de saída são o resumo dos três elementos na janela. É porque durante a convolução a janela é deslizada ao longo, todos os elementos nele são multiplicados por um e, em seguida, resumido: yk 1 cdot x 1 cdot x 1 cdot x Para obter os valores desejados de y. A saída deve ser dividida por 3: Por uma fórmula incluindo a divisão: Mas não seria ótimo para fazer a divisão durante convolução Aqui vem a idéia, reorganizando a equação: Então vamos usar o k kernel seguinte: Desta forma, vamos Obter a saída desejada: Em geral: se queremos fazer a média móvel por convolução tendo um tamanho de janela de w. Nós usaremos o k kernel a seguir: Uma função simples que faz a média móvel é: Um exemplo de uso é: Criado em quarta-feira, 08 de outubro de 2008 20:04 Atualizado em Quinta, 14 de Março de 2013 01:29 Escrito por Batuhan Osmanoglu Hits: 41473 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 tinha 4 pixels de largura em Gama e 16 pixels de largura em Azimute.
No comments:
Post a Comment