29 Setembro, 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 Média móvel é uma operação simples usada geralmente para suprimir o ruído de um sinal: ajustamos 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 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. Vamos usar o k kernel seguinte: Uma função simples fazendo a média móvel é: Um exemplo de uso é: Estou procurando um pouco de orientação sobre o uso de CONVN para calcular médias móveis em uma dimensão em uma matriz 3d. Estou ficando um pouco preso no lançamento do kernel sob o capô e estou esperando alguém pode ser capaz de esclarecer o comportamento para mim. Um post semelhante que ainda me tem um pouco confuso está aqui: Tenho diariamente rio e dados de fluxo de tempo para uma bacia hidrográfica em diferentes locais de origem. Assim, a matriz é assim, dim 1 (as linhas) representam cada site dim 2 (as colunas) representam a data dim 3 (as páginas) representam o tipo diferente de medição (altura do rio, fluxo, precipitação, etc.) É tentar usar CONVN para ter uma média móvel de 21 dias em cada local, para cada ponto de observação para cada variável. Como eu entendo, eu deveria ser capaz de usar um kernel como: Eu tentei brincar e criou outro kernel que também deve funcionar (eu acho) e definir ker2 como: Os resultados não coincidem e eu estou me perguntando se eu tenho o Dimensões incorretas aqui para o kernel. Qualquer orientação é muito apreciada. BTW, você tem um kernel simétrico, e assim lançando não deve ter nenhum efeito sobre a saída de convolução. O que você especificou é um kernel padrão de média móvel, e assim a convolução deve funcionar para encontrar a média móvel como você espera. Mas I39m um pouco confuso porque você disse que o doesn39t acima trabalho ndash rayryeng 31 de maio 15 at 20:17 Isso é completamente até você :). A pergunta que você tem é válida (sem trocadilhos) que as viagens de um monte de gente. Se você quer que ele fique, eu posso escrever uma resposta que resume o que nós falamos. Se você quiser retrair apagar a sua resposta, que não há nenhum problema em tudo. Deixe-me saber o que você quer fazer ndash rayryeng Julgamento a partir do contexto de sua pergunta, você tem uma matriz 3D e você quer encontrar a média móvel de cada linha de forma independente em todas as fatias 3D. O código acima deve funcionar (o primeiro caso). No entanto, o sinalizador válido retorna uma matriz cujo tamanho é válido em termos dos limites da convolução. Dê uma olhada no primeiro ponto do post que você ligou para mais detalhes. Especificamente, as primeiras 21 entradas para cada linha ficarão em falta devido ao sinalizador válido. Seu somente quando você começa à 22nd entrada de cada fileira faz o kernel da convolução fique completamente contido dentro de uma fileira da matriz e seu desse ponto onde você obtem resultados válidos (nenhuma chalaça pretendida). Se você gostaria de ver essas entradas nos limites, então você precisará usar o mesmo sinalizador se você quiser manter a mesma matriz de tamanho como a entrada ou o sinalizador completo (que é padrão), que lhe dá o tamanho da saída a partir de As bordas externas mais extremas, mas tenha em mente que a média móvel será feito com um monte de zeros e assim as primeiras 21 entradas wouldnt ser o que você espera de qualquer maneira. No entanto, se eu estou interpretando o que você está pedindo, então a bandeira válida é o que você quer, mas tenha em mente que você terá 21 entradas ausentes para acomodar os casos de borda. Tudo somado, seu código deve funcionar, mas tenha cuidado em como você interpreta os resultados. BTW, você tem um kernel simétrico, e assim lançando não deve ter nenhum efeito sobre a saída de convolução. O que você especificou é um kernel padrão de média móvel e, portanto, convolução deve trabalhar em encontrar a média móvel como você espera. Usando 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 Para essa matriz estou tentando calcular a média móvel de 3 dias de baixo para cima da matriz. Eu forneci o meu código: Dada a seguinte matriz a e máscara: Tentei implementar o comando conv, mas estou recebendo um erro. Aqui está o comando conv que eu tenho tentado usar na segunda coluna da matriz a: A saída que desejo é dada na seguinte matriz: Se você tiver alguma sugestão, eu gostaria muito. Obrigado Para a coluna 2 da matriz a, estou computando a média móvel de 3 dias da seguinte maneira e colocando o resultado na coluna 4 da matriz a (I renomeado como a matriz a 39desiredOutput39 apenas para ilustração). A média de 3 dias de 17, 14, 11 é 14 a média de 3 dias de 14, 11, 8 é 11 a média de 3 dias de 11, 8, 5 é 8 ea média de 3 dias de 8, 5, 2 é 5. Não há nenhum valor nas 2 linhas inferiores para a 4a 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 faz sentido ndash Aaron Jun 12 13 em 1:28 Em geral, seria útil 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) Segundo, observe o tamanho de c. Você não pode apenas caber c em um. 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ê quer. Em vez disso, você é forçado a usar um par de linhas: O cientista e engenheiros guia para processamento de sinal digital Por Steven W. Smith, Ph. D. Como o nome indica, o filtro de média móvel opera fazendo a média de um número de pontos a partir do sinal de entrada para produzir cada ponto no sinal de saída. Na forma de equação, isto é escrito: Onde está o sinal de entrada, é o sinal de saída, e M é o número de pontos na média. Por exemplo, num 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: Isto corresponde à alteração da soma em Eq . 15-1 de: j 0 para M -1, para: j - (M -1) 2 para (M -1) 2. Por exemplo, em um filtro de média móvel de 10 pontos, o índice, j. Pode variar 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. Programação é ligeiramente mais fácil com os pontos em apenas um lado no entanto, isso produz uma mudança relativa 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. Ou seja, o filtro de média móvel é uma convolução do sinal de entrada com um impulso rectangular que tem um comprimento de onda de 7,5 mm, Área de um. A Tabela 15-1 mostra um programa para implementar o filtro de média móvel.
No comments:
Post a Comment