Sunday 20 May 2018

Weighted moving average matlab code


O que é suavizar e como posso fazer isso? Eu tenho um array em Matlab que é o espectro de magnitude de um sinal de fala (a magnitude de 128 pontos de FFT). Como faço para suavizar isso usando uma média móvel De que eu entendo, eu deveria ter um tamanho de janela de um determinado número de elementos, pegue a média, e isso se torna o novo primeiro elemento. Em seguida, desloque a janela para a direita por um elemento, pegue a média, que se torna o segundo elemento, e assim por diante. É assim que funciona? Não tenho certeza, porque se fizer isso, no meu resultado final, terei menos de 128 elementos. Então, como isso funciona e como isso ajuda a suavizar os pontos de dados? Ou existe alguma outra maneira que eu possa fazer a suavização dos dados? 15 de outubro às 14:51 Esta pergunta veio da nossa site para programadores profissionais e entusiastas. para um espectro que você provavelmente deseja calcular em média (na dimensão temporal), vários espectros, em vez de uma média ao longo do eixo de frequência de um único espectro, endolito de 16 de outubro de 12 a 1:04 endólito, são técnicas válidas. A média no domínio da frequência (às vezes chamado de Danielle Periodogram) é o mesmo que o uso de janelas no domínio do tempo. A média de vários periodogramas (quotspectraquot) é uma tentativa de imitar a média do conjunto exigida do periodograma verdadeiro (isso é chamado de Welch Periodogram). Além disso, por uma questão de semântica, eu argumentaria que quotsmoothing é uma filtragem de passagem baixa não causal. Veja filtragem de Kalman vs alisamento de Kalman, filtragem de Wiener v suavização de Wiener, etc. Existe uma distinção não trivial e dependente da implementação do mesmo. O alisamento pode ser feito de várias formas, mas em termos muito básicos e gerais significa que você dá um sinal, misturando seus elementos com os vizinhos. Você borrar / desfocar o sinal um pouco para se livrar do ruído. Por exemplo, uma técnica de suavização muito simples seria recalcular cada elemento de sinal f (t) para 0.8 do valor original, mais 0.1 de cada um dos seus vizinhos: Observe como os fatores de multiplicação, ou pesos, somam um. Então, se o sinal é razoavelmente constante, suavizar não muda muito. Mas se o sinal contiver uma mudança brusca, a contribuição de seus vizinhos ajudará a esclarecer um pouco esse ruído. Os pesos que você usa nesta função de recálculo podem ser chamados de kernel. Uma função gaussiana unidimensional ou qualquer outro kernel básico deve fazer no seu caso. Bom exemplo de um tipo particular de suavização: Acima: sinal não suavizado Abaixo: sinal suavizado Exemplos de alguns kernels: Além da boa resposta da Junuxx, gostaria de fazer algumas anotações. Suavização está relacionada à filtragem (infelizmente muito vago artigo da Wikipedia) - você deve escolher o mais suave com base em suas propriedades. Um dos meus favoritos é o filtro mediano. Este é um exemplo de um filtro não linear. Tem algumas propriedades interessantes, preserva bordas e é bastante robusto sob grande ruído. Se você tem um modelo como o seu sinal se comporta um filtro de Kalman vale a pena dar uma olhada. Sua suavização é, na verdade, uma estimativa bayesiana de máxima verossimilhança do sinal baseada em observações. respondido outubro 15 12 at 11:07 1 para mencionar o ndash do filtro de Kalman Diego Dec 13 12 em 18:48 Suavizar implica usar a informação das amostras vizinhas a fim mudar o relacionamento entre amostras vizinhas. Para vetores finitos, nas extremidades, não há informação vizinha de um lado. Suas escolhas são: não suavizar / filtrar as extremidades, aceitar um vetor suavizado resultante mais curto, compor dados e suavizar com isso (depende da precisão / utilidade de qualquer previsão fora das extremidades), ou talvez usando diferentes kernels de suavização assimétrica nas extremidades (que acaba encurtando o conteúdo de informação no sinal de qualquer maneira). respondido outubro 15 12 em 19:44 Outros mencionaram como você faz suavização, gostaria de mencionar por que o alisamento funciona. Se você sobreavaliar corretamente o seu sinal, ele variará relativamente pouco de uma amostra para a próxima (exemplos de pontos no tempo, pixels, etc), e espera-se que tenha uma aparência geral suave. Por outras palavras, o seu sinal contém poucas frequências altas, isto é, componentes de sinal que variam a uma taxa semelhante à sua taxa de amostragem. No entanto, as medições são frequentemente corrompidas pelo ruído. Em uma primeira aproximação, geralmente consideramos que o ruído segue uma distribuição gaussiana com média zero e um certo desvio padrão que é simplesmente adicionado em cima do sinal. Para reduzir o ruído em nosso sinal, comumente fazemos os seguintes quatro pressupostos: o ruído é aleatório, não está correlacionado entre as amostras, tem uma média de zero e o sinal é suficientemente sobreamostrado. Com essas suposições, podemos usar um filtro médio deslizante. Considere, por exemplo, três amostras consecutivas. Como o sinal é altamente oversampled, o sinal subjacente pode ser considerado para mudar linearmente, o que significa que a média do sinal entre as três amostras seria igual ao sinal verdadeiro na amostra do meio. Em contraste, o ruído tem média zero e não é correlacionado, o que significa que sua média deve tender a zero. Assim, podemos aplicar um filtro médio deslizante de três amostras, onde substituímos cada amostra pela média entre si e seus dois vizinhos adjacentes. Naturalmente, quanto maior for a janela, mais o ruído terá uma média de zero, mas menor será a nossa suposição de linearidade do verdadeiro sinal. Assim, temos que fazer um trade-off. Uma forma de tentar obter o melhor dos dois mundos é usar uma média ponderada, onde damos amostras de pesos menores, para que possamos calcular a média de efeitos de ruído de faixas maiores, sem pesar muito o sinal verdadeiro quando se desvia da nossa linearidade. suposição. Como você deve colocar os pesos depende do ruído, do sinal e da eficiência computacional, e, claro, do trade-off entre se livrar do ruído e cortar o sinal. Note que tem havido muito trabalho feito nos últimos anos para nos permitir relaxar algumas das quatro suposições, por exemplo, projetando esquemas de suavização com janelas de filtro variáveis ​​(difusão anisotrópica), ou esquemas que realmente não usam janelas em tudo (meios não-locais). O que é isso? Respondeu dezembro 27 12 às 15: 10 Eu tenho uma matriz de dados de séries temporais para 8 variáveis ​​com cerca de 2500 pontos (10 anos de segunda-feira) e gostaria de calcular a média, variância, assimetria e curtose em uma base de média móvel. Vamos dizer quadros 100 252 504 756 - Gostaria de calcular as quatro funções acima sobre cada um dos quadros (tempo), em uma base diária - então o retorno para o dia 300 no caso com 100 dias, seria médio variância skewness curtose do período day201-day300 (100 dias no total). e assim por diante. Eu sei que isso significa que eu iria obter uma matriz de saída, e o primeiro número de dias de quadros seria NaNs, mas eu não consigo descobrir a indexação necessária para fazer isso. perguntou 24 de março às 0:07 Esta é uma questão interessante porque eu acho que a solução ótima é diferente para a média do que para as outras estatísticas da amostra. Eu forneci um exemplo de simulação abaixo que você pode trabalhar. Primeiro, escolha alguns parâmetros arbitrários e simule alguns dados: Para a média, use filter para obter uma média móvel: Eu tinha pensado originalmente em resolver esse problema usando conv da seguinte forma: Mas como PhilGoddard apontou nos comentários, a abordagem de filtro evita necessidade do loop. Observe também que escolhi fazer com que as datas na matriz de saída correspondam às datas em X, então, em trabalhos posteriores, você pode usar os mesmos índices para ambos. Assim, as primeiras observações do WindowLength-1 em MeanMA serão nan. Para a variância, não consigo ver como usar filtro ou conv ou mesmo uma soma contínua para tornar as coisas mais eficientes, então, em vez disso, executo o cálculo manualmente em cada iteração: poderíamos acelerar um pouco as coisas explorando o fato de já termos calculou a média móvel média. Simplesmente substitua a linha dentro do loop acima com: No entanto, duvido que isso faça muita diferença. Se qualquer outra pessoa puder ver uma maneira inteligente de usar o filtro ou conv para obter a variação da janela em movimento, o Id ficará muito interessado em vê-la. Deixo o caso de assimetria e curtose para o OP, uma vez que eles são essencialmente os mesmos que o exemplo da variância, mas com a função apropriada. Um último ponto: se você estivesse convertendo o acima em uma função geral, você poderia passar uma função anônima como um dos argumentos, então você teria uma rotina de média móvel que funciona para a escolha arbitrária de transformações. Final, ponto final: Para uma seqüência de comprimentos de janela, basta fazer um loop sobre todo o bloco de código para cada comprimento de janela. Sim, a função de filtro é de fato melhor para a média - mas eu queria fazer isso por várias funções diferentes, não apenas pela média. Acabei de postar minha resposta porque funcionou para mim e achei que poderia ajudar outra pessoa também. ndash Dexter Morgan Apr 15 14 at 12: 40 Preciso computar uma média móvel sobre uma série de dados, dentro de um loop for. Eu tenho que pegar a média móvel durante N9 dias. A matriz Im computing in é 4 séries de 365 valores (M), que em si são valores médios de outro conjunto de dados. Eu quero plotar 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 e o comando conv e encontrei algo que eu tentei implementar no meu código: Então, basicamente, eu computo minha média e ploto com uma média móvel (errada). Eu escolhi o valor wts direto do site mathworks, de modo que está incorreto. (fonte: mathworks. nl/help/econ/moving-average-trend-estimation. html) Meu problema é que eu não entendo o que é isso. 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 maneira. E se eu estou fazendo isso completamente errado, eu poderia obter alguma ajuda com isso? Meus sinceros agradecimentos. perguntou conv 23 de setembro à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 um. Se você quiser ponderar cada valor uniformemente e fazer um filtro em movimento de tamanho N, então você deve fazer. Usar o argumento válido em conv resultará em ter menos valores em Ms do que em M. Use o mesmo se você não se importar com os efeitos de preenchimento zero. Se você tiver a caixa de ferramentas de processamento de sinal, você pode usar o cconv se você quiser tentar uma média móvel circular. Algo como Você deve ler a documentação conv e cconv para mais informações, se você ainda não tiver. Você pode usar o filtro para encontrar uma média de execução sem usar um loop for. Este exemplo encontra a média de execução de um vetor de 16 elementos, usando um tamanho de janela de 5. 2) suave como parte da caixa de ferramentas Ajuste de Curva (que está disponível na maioria dos casos) yy suavizar (y) suaviza os dados no vetor de coluna y usando um filtro de média móvel. Os resultados são retornados no vetor da coluna yy. O período padrão para a média móvel é 5.

No comments:

Post a Comment