Eu tenho um sinal medido em 100Hz e preciso aplicar o filtro de suavização Savitzky-Golay neste sinal. No entanto, em uma inspeção mais minuciosa, meu sinal não é medido a uma taxa perfeitamente constante, o delta entre as medições varia entre 9,7 e 10,3 ms.
Existe uma maneira de usar o filtro Savitzky-Golay em dados não igualmente espaçados? Existem outros métodos que eu poderia aplicar?
Respostas:
Um método seria reamostrar seus dados para que sejam igualmente espaçados, para que você possa fazer o processamento que quiser. A reamostragem ilimitada de banda usando filtragem linear não será uma boa opção, pois os dados não são uniformemente espaçados, portanto, você pode usar algum tipo de interpolação polinomial local (por exemplo, splines cúbicos) para estimar quais são os valores "exatos" do sinal subjacente Intervalos de 10 milissegundos.
fonte
Devido à maneira como o filtro Savitzky-Golay é derivado (ou seja, como o polinômio local dos mínimos quadrados se encaixa), existe uma generalização natural para a amostragem não uniforme - é apenas muito mais caro em termos computacionais.
Filtros Savitzky-Golay em geral
Para o filtro padrão, a idéia é ajustar um polinômio a um conjunto local de amostras [usando mínimos quadrados] e substituir a amostra central pelo valor do polinômio no índice central (ou seja, 0). Isso significa que os coeficientes de filtro SG padrão podem ser gerados invertendo uma matriz de Vandermonde de indicações de amostra. Por exemplo, para gerar um ajuste parabólico local em cinco amostras (com indicações locais -2, -1,0,1,2), o sistema de equações de design A c = yy0…y4 Ac=y seria o seguinte:
Acima, são os coeficientes desconhecidos do polinômio de mínimos quadrados c 0 + c 1 x + c 2 x 2 . Como o valor do polinômio em x = 0 é apenas c 0 , o cálculo do pseudo - inverso da matriz de projeto (ou seja, c = ( A T A ) - 1 A T y ) produzirá os coeficientes do filtro SG na linha superior. Nesse caso, eles seriamc0 0... c2 c0 0+ c1 1x + c2x2 x = 0 c0 0 c = ( ATA )- 1UMATy
Observe que, como a derivada de é c 1 + 2 c 2 x , a segunda linha da matriz (que avalia cc0 0+ c1 1x + c2x2 c1 1+ 2 c2x ) será um filtro de derivada suavizada. O mesmo argumento se aplica a linhas sucessivas - elas fornecem derivadas de ordem superior suavizadas. Observe que dimensionei a matriz em 35 para que a primeira linha correspondesse aos coeficientes de suavização fornecidos na Wikipedia (acima). Os filtros derivativos diferem por outros fatores de escala.c1 1
Amostragem não uniforme
Quando as amostras são espaçadas uniformemente, os coeficientes do filtro são invariantes à conversão, portanto, o resultado é apenas um filtro FIR. Para amostras não uniformes, os coeficientes diferem com base no espaçamento local da amostra, portanto, a matriz de projeto precisará ser construída e invertida em cada amostra. Se os tempos de amostra não uniformes são , e construímos coordenadas locais t n com cada tempo de amostra central fixo em 0 , ou seja,xn tn 0 0
cada matriz de design terá a seguinte forma:
A primeira linha do pseudoinverso deUMA pontilhado com os valores da amostra local produzirác0 0 , o valor suavizado nessa amostra.
fonte
"Como uma alternativa barata, pode-se simplesmente fingir que os pontos de dados estão igualmente espaçados ...f em toda a largura do N janela de ponto é menor que N/ 2----√ vezes o ruído de medição em um único ponto, o método barato pode ser usado ".
- Receitas Numéricas pp. 771-772
se a mudança no
(derivação alguém?)
("Finja igualmente espaçado" significa:± N/ 2 pontos em torno de cada t onde você quer SavGol (t ), tEu→ i . Isso pode ser óbvio, mas me pegou por um tempo.)
pegue a
não encaixe tudo
fonte
Eu descobri que existem duas maneiras de usar o algoritmo savitzky-golay no Matlab. Uma vez como filtro e outra como função de suavização, mas basicamente eles devem fazer o mesmo.
fonte
Se for de alguma ajuda, fiz uma implementação em C do método descrito pelo datageist. Livre para usar por sua conta e risco.
fonte