Existe um termo técnico para esse método simples de suavizar um sinal?


26

Em primeiro lugar, sou novo no DSP e não tenho nenhuma educação real, mas estou desenvolvendo um programa de visualização de áudio e estou representando uma matriz FFT como barras verticais como em uma visualização típica do espectro de frequências.

O problema que tive foi que os valores do sinal de áudio mudavam muito rapidamente para produzir uma saída visual agradável se eu apenas mapeasse os valores da FFT diretamente:

insira a descrição da imagem aqui

Portanto, aplico uma função simples aos valores para "suavizar" o resultado:

// pseudo-code
delta = fftValue - smoothedFftValue;
smoothedFftValue += delta * 0.2; 
// 0.2 is arbitrary - the lower the number, the more "smoothing"

Em outras palavras, estou pegando o valor atual e comparando-o com o último e adicionando uma fração desse delta ao último valor. O resultado fica assim:

insira a descrição da imagem aqui

Então, minha pergunta é:

  1. Esse é um padrão ou função bem estabelecido para o qual já existe um termo? É assim, qual é o termo? Eu uso o "suavização" acima, mas sei que isso significa algo muito específico no DSP e pode não estar correto. Fora isso, parecia estar relacionado a um envelope de volume, mas também não era exatamente a mesma coisa.

  2. Existem abordagens melhores ou um estudo mais aprofundado sobre soluções para isso que eu deveria examinar?

Obrigado pelo seu tempo e desculpas se esta for uma pergunta estúpida (lendo outras discussões aqui, estou ciente de que meu conhecimento é muito inferior à média que parece).


11
Agora estou me perguntando o que você ganha se pegar a FFT suavizada e a FFT inversa.
precisa saber é o seguinte

Seria mais simples fazer a primeira resposta em uma ordem diferente? valor atual = valor atual * decaimento; if (new_value> current_value) {current_value = new_value; }
Richard Forster

@immibis Este deve ser um reverb do meu entendimento. Corrija-me se eu estiver errado.
Andreas

Claro, e um compilador de otimização produzirá a mesma implementação. O ponto principal foi obter o resultado correto quando (valor_data atual * decaimento) <valor_ novo <valor_data.
Richard Forster

2
Eu realmente gosto desta pergunta. É um daqueles em que alguém que tenta algumas coisas acidentalmente se descobre no fundo de uma enorme árvore do conhecimento (filtros de resposta ao impulso infinito, especificamente). Enquanto isso, as pessoas que já estão subindo na árvore pode descrever todas as coisas legais que eles já descobriram entre os ramos ...
DrMcCleod

Respostas:


37

O que você implementou é um filtro passa-baixo unipolar, às vezes chamado de integrador com vazamento . Seu sinal tem a equação da diferença:

y[n]=0.8y[n1]+0.2x[n]

onde é a entrada (o valor do compartimento não suavizado) e é o valor do compartimento suavizado. Essa é uma maneira comum de implementar um filtro lowpass simples e de baixa complexidade. Eu escrevi sobre eles várias vezes antes em respostas anteriores; veja [1] [2] [3] .y [ n ]x[n]y[n]


4
Muito obrigado por isso. Tão útil. Googling por conta própria é como estar perdido no mar quando se trata de coisas DSP. Só ter alguns termos para pesquisar me dá algo a entender.
Michael Bromley

3
Eu me pergunto. Eu acho que o OP aplica esse filtro na série de valores nas caixas individuais no domínio da frequência. Um passa-baixo normal é aplicado nas séries de amostras no domínio do tempo. O efeito é o mesmo (acho que não, porque as partes de alta frequência ainda estão no sinal, mas ... sua intensidade muda mais devagar?)? Caso contrário, você poderia elaborar o que o filtro realmente faz com o sinal no domínio do tempo?
Jonas Schäfer

3
@JonasWielicki Eu acho que o objetivo é suavizar cada valor de posição individual, para que não mude muito rapidamente. também o filtro passa-baixo (conforme explicado na resposta) é aplicável a qualquer série temporal, independentemente de seu domínio (tempo ou frequência ou qualquer outra coisa).
Arpit Jain #

@arpitjain Eu entendo isso. Eu simplesmente gostaria de saber se existe algum entendimento (não necessariamente por você, pelo OP ou pelo responsável pela resposta) como isso afeta o domínio do tempo quando você faz isso.
Jonas Schäfer

@JonasWielicki A operação é uma convolução no domínio da frequência, por isso se traduz em uma multiplicação (das transformadas correspondentes (inversas) de Fourier) no domínio do tempo.
MBaz 2/11/16

17

Aviso: inclua um pouco de história, papéis velhos (eu os amo) e cartões perfurados!

Você usou, com o formato: às vezes escrito como: a=0.2

y(n)=y(n1)+a[x(n)y(n1)],
y(n)=ax(n)+(1a)y(n1).

A primeira versão acima é menos natural, mas evita a multiplicação e é de alguma forma mais eficiente. Ambas as fórmulas produzem um filtro de resposta de impulso linear , causal e infinito . A história remonta a Poisson, Filtros Adaptativos Kolmogorov-Zurbenko , Brown (Previsão Estatística para Controle de Inventário. McGraw-Hill, 1959), Holt (1957) e Winters (1960). É implementado como um esquema de filtragem recursiva conhecido sob diferentes nomes na literatura:

  • filtro passa-baixa de média exponencial de primeira ordem ,
  • média exponencial,
  • suavização exponencial ,
  • média móvel exponencial (EMA),
  • média móvel ponderada exponencialmente (EWMA),
  • A suavização exponencial simples (linear) de Brown (às vezes chamada de SES),
  • Modelo ARIMA (0,1,1) .

O "exponencial" no nome está relacionado à resposta ao impulso com a progressão geométrica, que mostra uma deterioração exponencial: .h[n]=(1a)u[n]an

Para uma nota histórica, Robert G. Brown e Arthur D. Little usaram esse método em 1956 em Suavização exponencial para prever a demanda , aparentemente para a indústria do tabaco. Um pouco mais de história e explicações podem ser encontradas no Holt-Winters Previsão for Dummies (ou desenvolvedores) - Parte I . Peter Zehna oferece uma revisão crítica em Algumas observações sobre suavização exponencial , 1966. Um capítulo de R. Brown na Encyclopedia of Operations Research and Management Science (Google books) remonta a história em 1944, e as páginas legíveis são reproduzidas aqui:

Suavização exponencial, p.  205, Enciclopédia de Pesquisa Operacional e Ciência de Gerenciamento

Suavização exponencial, p.  206, Enciclopédia de Pesquisa Operacional e Ciência de Gerenciamento

Muitos métodos estendem essa suavização, que não tem validade quando os dados têm uma tendência ou sazonalidade. Alguns deles são conhecidos como suavização exponencial dupla ou tripla e filtros Holt-Winters .

Você também pode verificar: Como esse "filtro simples" funciona?


11
Obrigado, isso é excelente. Como mencionado, sou totalmente novo nisso, portanto algumas das suas respostas precisarão de mais pesquisas para que eu aprecie totalmente, mas certamente respondem à minha pergunta e mais algumas. Se não for para a outra resposta, mais cedo, isso também é, naturalmente, digno de aceitação como a resposta.
Michael Bromley

11
Pequena correção, Winters 1 (960) deve ser Winters (1960) Presumo
SGR

9

Existem abordagens melhores ou um estudo mais aprofundado sobre soluções para isso que eu deveria examinar?

A abordagem normal para medidores de áudio é um "detector de pico com perdas".

if new_value > current_value
  current_value = new_value;
else
 current_value = current_value * decay;  

Isso reage imediatamente a qualquer novo ou pico ou transitório no sinal, mas permanece por um tempo, criando uma imagem muito menos agitada. A deterioração deve ser uma constante entre 0 e 1. Ele controla a rapidez com que as barras são executadas, sendo 0 instantâneo e 1 nunca.


Observo que isso tem semelhanças com uma tarefa que fiz na faculdade, um MIDI com um timbre muito baixo (criado em uma tarefa anterior) foi aprimorado pela convolução (e dimensionamento para combinar picos e durações) os sinais de nota (completamente retangular) com um triângulo. sinal que aumentou muito acentuadamente (embora não instantaneamente) e depois se deteriorou gradualmente, para produzir uma nota aguda que desapareceu "naturalmente". Vastas melhorias no som da música (neste caso, Fur Elise).
KRyan #

Eu acho que você gostaria de manter new_valuese for maior do quecurrent_value * decay
user276648

6

Nos círculos de contratados do Departamento de Defesa dos EUA, esse filtro específico é freqüentemente chamado de "filtro alfa", porque pode ser caracterizado com um parâmetro que é tradicionalmente chamado de "alfa".

É diretamente análogo a um filtro passa-baixo RC analógico simpe.

Eles são extremamente simples, têm sérias limitações, mas têm a vantagem inegável sobre filtros mais complexos (e complicados!) Que, se você se afastar das áreas problemáticas, eles realizam o trabalho.


3

Como mencionado em outras respostas, este é um filtro recursivo de pólo único, um tipo de filtro de resposta ao impulso infinito (IIR).

Um excelente recurso para obter informações sobre esse e outros recursos do DSP é o Guia do cientista e do engenheiro para processamento de sinais digitais de Steven W. Smith : resposta ao impulso infinito (IIR)

... cada ponto no sinal de saída é encontrado multiplicando os valores do sinal de entrada pelos coeficientes "a", multiplicando os valores calculados anteriormente a partir do sinal de saída pelos coeficientes "b" e adicionando os produtos. que não existe um valor para b0, porque corresponde à amostra que está sendo calculada. A equação 19-1 é chamada de equação de recursão e os filtros que a utilizam são chamados de filtros recursivos. Os valores "a" e "b" que definem o filtro são chamados de coeficientes de recursão.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.