Filtro Savitzky – Golay vs. filtro linear IIR ou FIR

11
  • Um filtro IIR / FIR tradicional (passa-baixo para remover as oscilações de alta frequência), por exemplo, média móvel,

  • ou um filtro Savitzky-Golay

podem ser úteis para suavizar um sinal, como um sinal de envelope:

insira a descrição da imagem aqui

Para qual aplicação um filtro Savitzky-Golay seria mais interessante que um passa-baixo clássico?

O que o diferencia de um filtro padrão e o que ele adiciona em comparação aos filtros padrão?

Ele se adapta aos dados de entrada?

É melhor para preservação transitória?


Você já esteve em uma situação de engenharia um dia quando decidiu "Vamos usar um filtro SG em vez da média móvel ou outro passe baixo FIR! É melhor porque isso e isso e isso ..." ? Então esta pergunta é para você!

g6kxjv1ozn
fonte

Respostas:

4

Como a discussão nas respostas e comentários existentes se concentrou principalmente no que os filtros Savitzky-Golay realmente são (o que foi muito útil), tentarei adicionar às respostas existentes fornecendo algumas informações sobre como realmente escolher um filtro de suavização, que é, no meu entender, sobre o que a questão realmente é.

Antes de mais, gostaria de repetir o que ficou claro na discussão gerada por outras respostas: a categorização dos filtros de suavização na pergunta em filtros FIR / IIR lineares e invariantes no tempo (LTI), por um lado, e Os filtros Savitzky-Golay, por outro lado, são enganosos. Um filtro Savitkzy-Golay é apenas um filtro FIR padrão projetado de acordo com um critério específico (aproximação polinomial local). Portanto, todos os filtros mencionados na pergunta são filtros LTI.

A questão restante é como escolher um filtro de suavização. Se a complexidade computacional e / ou a memória são um problema, os filtros IIR podem ser preferíveis aos filtros FIR, porque eles normalmente alcançam uma supressão de ruído comparável (ou seja, atenuação da banda de parada) com uma ordem de filtro muito menor do que os filtros FIR. Mas observe que, se o processamento em tempo real for necessário, uma possível desvantagem dos filtros IIR é que eles não podem ter uma resposta de fase exatamente linear. Portanto, o sinal desejado sofrerá algumas distorções de fase. Para processamento offline, as distorções de fase podem ser evitadas, mesmo com filtros IIR, aplicando a filtragem de fase zero .

Além das considerações discutidas no parágrafo anterior, é principalmente o critério de projeto que importa, não tanto se o filtro for FIR ou IIR, porque qualquer filtro IIR (estável) pode ser aproximado com precisão arbitrária por um filtro FIR e qualquer O filtro FIR pode ser aproximado por um filtro IIR, mesmo que o último possa ser muito mais difícil. O critério de projeto apropriado obviamente depende das propriedades dos dados e do ruído. Quando se trata de suavização, geralmente assumimos dados suficientemente super amostrados (ou seja, suaves). Se o ruído tiver principalmente componentes de alta frequência, ou seja, se houver pouca sobreposição espectral entre os dados e o ruído, queremos maximizar a atenuação da banda de parada ou minimizar a energia da banda de parada, preservando o sinal desejado da melhor maneira possível. Nesse caso, poderíamos escolher um filtro FIR de fase linear projetado de acordo com um critério minimax usando o algoritmo Parks-McClellan. Também podemos minimizar a energia da banda de parada (ou seja, minimizar a potência do ruído na banda de parada) escolhendo um método de mínimos quadrados. É possível uma mistura entre os dois critérios (minimax e mínimos quadrados) escolhendo umdesign de mínimos quadrados restritos , o que minimiza a energia da banda de parada e restringe o erro máximo de aproximação na banda de passagem.

Se o espectro de ruído se sobrepuser significativamente ao espectro do sinal, é necessária uma abordagem mais cuidadosa, e a atenuação da força bruta não funcionará bem porque você deixa muito ruído (escolhendo a frequência de corte muito alta) ou distorce o desejado sinal demais. Nesse caso, os filtros Savitzky-Golay (SG) podem ser uma boa escolha. O preço a ser pago é a atenuação medíocre da banda de parada, mas uma vantagem é que algumas propriedades do sinal são preservadas muito bem. Isso tem a ver com o fato de os filtros SG terem uma resposta de banda de passagem plana, ou seja,

(1)dkH(ejω)dωk|ω=0=0k=1,2,,r

rH(ejω)(1)r

ω=0

Para os interessados ​​na teoria dos filtros SG, as referências mais relevantes que posso recomendar são as seguintes:

Matt L.
fonte
2

Como em qualquer coisa, algumas vezes algumas ferramentas são melhores que outras.

Os filtros de média móvel (MA) podem ser usados ​​para suavizar os dados e são FIR. Eles são praticamente o filtro mais simples que você pode criar e funcionam bem para muitas tarefas, desde que você não esteja tentando modelar saltos repentinos ou tendências polinomiais. No entanto, lembre-se de que esses filtros são basicamente apenas passa-baixas, portanto, eles funcionam melhor quando os dados de que você gosta no sinal são de baixa frequência e banda bastante estreita.

Os filtros Savitzky-Golay (SG) são um grupo especial de filtros FIR que essencialmente ajustam um polinômio à sua série temporal, à medida que a convolução desliza ao longo do sinal. Os filtros SG são úteis para sinais onde as coisas com as quais você se importa não são necessariamente de baixa frequência e banda bastante estreita.

Eu acho que você descobrirá que, se você ler a página da Wikipedia que vinculou bastante, isso explica a diferença entre os filtros SG e MA com detalhes bastante rigorosos. No entanto, lembre-se: no final, elas são apenas ferramentas para fazer coisas semelhantes; você decide quando usar a ferramenta certa.

EDIT :

Como parece haver alguma confusão de que os filtros SG são "adaptáveis" de alguma forma em um nível básico, incluí um exemplo simples do MATLAB. Como Dan apontou, eles podem ser adaptados, mas sua implementação básica geralmente não é. Ao inspecionar o código, você verá que isso é apenas uma consulta de matriz com um tratamento especial. Nada neste filtro é "adaptável" no sentido tradicional; você simplesmente escolhe um ajuste polinomial e o comprimento sobre o qual esse polinômio será ajustado ao sinal por convolução; SG é FIR essencial. O script que eu tenho abaixo produz este enredo: Comparação de filtros SG com MA

Olhando para esta figura, você pode ver que o MA e o SG realizam essencialmente a mesma coisa, mas com algumas distinções importantes:

  1. O MA faz um ótimo trabalho para suprimir o ruído, mas faz um mau trabalho capturando os saltos transitórios no sinal. Podemos suprimir ainda mais ruído aumentando o comprimento do filtro, mas ele terá um desempenho ainda pior nos transientes; esse efeito será visto como "mancha" perto de qualquer transiente, o que você poderá ver na figura mostrada.
  2. O SG faz um ótimo trabalho de captura dos transitórios do sinal, mas não muito bom de suprimir o ruído (pelo menos em comparação com um MA do mesmo tamanho). Podemos melhorar a supressão de ruído perto de não-transitórios, aumentando o comprimento do quadro, mas isso apresentará um toque análogo ao fenômeno de Gibb próximo a quaisquer transitórios.

Para que você entenda melhor como esses filtros funcionam, recomendamos que você pegue o código aqui e manipule-o e veja como todas as partes individuais do filtro SG funcionam.

Código para o exemplo MATLAB:

% Generate a signal "s" that has square waves, and scale it with a
% polynomial of order 5
up = 1*ones(1,100);
down = zeros(1,150);
s = [down down up up down up down up down up up up down down down down down];
n = numel(s);
nn = linspace(0,4,numel(s));
s = s .* (nn .^5);
sn = (s + 4*randn(size(s))).';

% smooth it with SMA of length 15
sz = 15;
h = 1/sz * ones(1,sz);
sn_sma = conv(sn,h,'same');

% smooth it with sgolay of frame length 15
m = (sz-1)/2;
% look up the SG matrix for this order and size
B = sgolay(5, sz);

% compute the steady state response for the signal, i.e. everywhere that
% isnt the first or last "frame" for the SG filter
steady = conv(sn, B(m+1,:), 'same');
% handle the transiet portion at the start of the signal
y_st   = B(1:m,:)*sn(1:sz);
% handle the transient portion at the end of the signal
y_en   = B(sz -m+1 : sz, :) * sn(n - sz+1:n);

% combine our results
sn_sg  = steady;
sn_sg(1:m) = y_st;
sn_sg(n-m+1:n) = y_en;

% plots
figure(1);
hold off;
plot(sn,'Color',[0.75 0.75 0.75]);
hold on;
plot(sn_sma,'b');
plot(sn_sg,'r');

legend('Noisy Signal','MA Smoothing','SG Smoothing, order 5','Location','NorthWest');
matthewjpollard
fonte
11
O ponto parece ser (ao ver a outra resposta) que o filtro SG é "um filtro não - linear , variável no tempo, totalmente dependente de dados, cujos coeficientes são recalculados para cada segmento curto de sua entrada".
precisa saber é o seguinte
11
O filtro SG, pelo que entendi ao implementá-lo várias vezes, não é um filtro adaptativo, especialmente em comparação com o filtro adaptativo médio, como um LMS ou RLS. Eu discordo completamente da afirmação de que os pesos dos filtros variam no tempo. Os filtros SG são essencialmente uma pesquisa de tabela, você filtra com valores da tabela para calcular uma resposta transitória e depois volta e lida com os casos extremos no início / fim do sinal. Vou editar minha postagem com um exemplo do MATLAB para mostrar isso a você.
matthewjpollard
2
@matthewjpollard Para observar, eu pessoalmente não tenho experiência significativa no uso desse filtro, mas para mim o filtro SG como melhor implementado parece muito ser uma implementação de filtro adaptável, com coeficientes variáveis ​​no tempo. A maneira como você aplicou o filtro no seu código não é (como você tratou a sequência inteira como o "subconjunto" de dados), mas a maneira especificamente conforme descrito em Wikipedia en.wikipedia.org/wiki/Savitzky%E2%80% 93Golay_filter e no próprio papel por Savitzky e Golay é realmente adaptativo: pdfs.semanticscholar.org/4830/...
Dan Boschen
2
@matthewjpollard Em seus sistemas em tempo real, seus dados estão sempre em fluxo contínuo, para que você recalcule os coeficientes em intervalos mais curtos ou sempre trabalha em pequenos blocos de dados?
Dan Boschen 27/09/18
2
Obrigado Matt. Portanto, talvez pudéssemos associar o que você está fazendo como adaptável / variável no tempo, no sentido de que os coeficientes são calculados para cada coleta de dados (os mesmos coeficientes dentro de uma coleta de dados, no entanto, com o tratamento adequado do início e do final, mas variando de uma coleta para a próxima - se eu entender corretamente). Obrigado por compartilhar seu código e aplicativo de exemplo.
Dan Boschen 27/09/18
2

NOTA

minha resposta anterior (antes desta edição) que indica o filtro Savitzky-Golay (SG) como um dependente não linear dos dados de entrada com variação de tempo estava errado, devido a uma interpretação incorreta prematura de como um filtro Savitzky-Golay (SG) calcula sua saída de acordo com o link wiki fornecido. Portanto, agora estou corrigindo isso para o benefício daqueles que também veriam como os filtros SG são implementáveis ​​pela filtragem FIR-LTI. Graças a @MattL. por sua correção, o grande vínculo que ele forneceu e a paciência que ele tinha (que eu nunca poderia ter demonstrado) durante minha investigação do problema. Embora honestamente prefira uma objeção mais detalhada, que claramente não é necessária. Observe também que a resposta correta é a outra, esta é apenas para esclarecimentos adicionais das propriedades LTI dos filtros SG.

Agora, não é de surpreender que quando alguém (que nunca usou esses filtros antes) enfrenta a definição do filtro SG como um ajuste polinomial de LSE de baixa ordem para dados fornecidos, ele imediatamente salta para a conclusão de que esses dados são dependentes, não lineares e filtros adaptativos com variação de tempo (turno).

No entanto, o procedimento de ajuste polinomial é inteligentemente interpretado pelo próprio SG, de modo que permite uma filtragem linear completamente independente dos dados, invariável no tempo e possível de dados, tornando o SG um filtro LTI-FIR fixo.

Abaixo está um resumo mais curto do link fornecido por MattL. Para detalhes que parecem estar faltando, consulte o documento original ou peça esclarecimentos. Mas eu não gostaria de reproduzir todo o documento aqui.

2M+1x[M],x[M+1],...,x[0],x[1],...,x[M]n=0p[n]Nn=M,M+1,...,1,0,1,...M

p[n]=k=0Naknk=a0+a1n+a2n2+...+aNnN

akNthp[n]

E=MM(p[n]x[n])2

x=[x[M],x[M+1],...,x[0],x[1],...,x[M]]T

akE

(1)Eai=0   ,   for    i=0,1,..,N

Agora, para aqueles que estão familiarizados com o procedimento polyfit LSE, simplesmente escreverei a equação da matriz resultante (no link) que define o conjunto ideal de coeficientes:

(2)a=(ATA)1ATx=Hx
x(2M+1)×1H2M+1NAnAHA

A=[αn,i]=[(M)0(M)1...(M)N(M+1)0(M+1)1...(M+1)N...(0)0(0)1...(0)N...(M)0(M)1...(M)N]

Agora vamos recuar por um momento e discutir um ponto aqui.

AHnakMNx[n]ak2nd

... Este (o polifit LSE) pode ser repetido em cada amostra da entrada, produzindo sempre um novo polinômio e um novo valor da sequência de saída y [n] ...

Então, como superamos essa surpresa intrigante? Ao interpretar e definir a saída do filtro SG para o seguinte:

Nnx[n]y[n]p[n]n=0

y[n]=y[0]=m=0Namnm=a0

2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[dM],x[dM+1],...,x[d1],x[d],x[d+1],...x[d+M]

a0x[n]y[n]x[n]nx[n]h[n]. Mas então, quais são os coeficientes de filtro para esse filtro SG? Vamos ver.

ak

a=Hx

[a0a1aN]=[h(0,0)h(0,1)...h(0,2M)h(1,0)h(1,1)...h(1,2M)...h(N,0)h(0,1)...h(0,2M)][x[M]x[M+1]...x[M]]

a0Hx

a0=H(0,n)x=H(0,k)x[k]=H(0,n)x[n]

h[n]=H(0,n)

N2M+1

y[n]2M+1x[n]LhN[n]

y[n]=x[n]hN[n]

COMENTE

akh[n]y[n]xa=Hxakp[n]akh[n]

CÓDIGO MATLAB / OCTVE

h[n]h[n]

% Savitzky-Golay Filter
% 
clc; clear all; close all;

N = 3;                      % a0,a1,a2,a3 : 3rd order polynomial
M = 4;                      % x[-M],..x[M] . 2M + 1 data

A = zeros(2*M+1,N+1);
for n = -M:M
    A(n+M+1,:) = n.^[0:N];
end

H = (A'*A)^(-1)* A';        % LSE fit matrix

h = H(1,:);                 % S-G filter impulse response (nancausal symmetric FIR)

figure,subplot(2,1,1)
stem([-M:M],h);
title(['Impulse response h[n] of Savitzky-Golay filter of order N = ' num2str(N), ' and window size 2M+1 =  ' , num2str(2*M+1)]);

subplot(2,1,2)
plot(linspace(-1,1,1024), abs(fftshift(fft(h,1024))));
title('Frequency response magnitude of h[n]');

A saída é:

insira a descrição da imagem aqui

Espero que isso esclareça a questão.

Fat32
fonte
2
@ Fat32 Eu acho que é porque era uma longa lista de comentários, portanto, para manter a diretoria limpa, eles geralmente a movem "para conversar". Ainda está tudo lá, apenas não bagunçando a página principal. É por isso que o sistema sugere movê-lo para o bate-papo quando o tempo vai e volta. Não se preocupe, todo mundo ainda te ama.
Dan Boschen 28/09/18
11
@ g6kxjv1ozn Estou chegando nesse ponto ... por favor aguarde ...
Fat32
2
@ Fat32 Ótimo trabalho! Eu o li, mas preciso ler e está escrito com muita clareza. Precisarei seguir com lápis e papel passo a passo para ver totalmente como você agora. Obrigado por colocar tudo isso aqui.
Dan Boschen 29/09/18
4
1ω=0
2
akh[n]