ПРИМІТКА
моя попередня відповідь (до цього редагування), що позначала фільтр Савіцького-Голая (СГ) як нелінійну залежність від вхідних даних, що змінюються часом, була помилковою, через передчасне неправильне тлумачення того, як фільтр Савіцького-Голая (СГ) обчислює свій вихід відповідно до наданого посилання на вікі. Тож тепер я виправляю це на користь тих, хто також бачить, як фільтри SG реалізуються за допомогою фільтра FIR-LTI. Завдяки @MattL за його виправлення, велике посилання, яке він надав, і терпіння, яке він мав (що я ніколи не міг би проявити) під час мого розслідування проблеми. Хоча я чесно віддаю перевагу більш детальному запереченню, яке, очевидно, не є необхідним. Також врахуйте, що правильна відповідь - інша, ця - лише для додаткового уточнення властивості LTI фільтрів SG.
Зараз не дивно, що коли хтось (хто раніше ніколи не використовував ці фільтри) стикається з визначенням фільтра SG як полінома LSE низького порядку, що відповідає даним даним, він / вона негайно перейде до висновку, що це залежні від даних, нелінійні та часовий (зсувний), адаптивний фільтри.
Тим не менш, процедура поліноміального пристосування спритно інтерпретується самими SG, таким чином, що вона дозволяє повністю незалежно від даних, лінійної фільтрації за часом можливої, отже, робить SG як фіксований фільтр LTI-FIR.
Нижче наведено найкоротший підсумок посилання, яке надає MattL. Про будь-які деталі, які, здається, відсутні, зверніться до оригінального документа або попросіть його уточнити. Але я не хотів би переробляти тут весь документ.
Тепер розглянемо значення вхідних даних які зосереджені навколо і в який ми хочемо помістити поліном порядку , при цьому - цілі показники часу: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
Класична процедура поліномічного прилягання LSE обчислює ці коефіцієнти щоб знайти оптимальний поліном порядку який мінімізує суму квадратів помилок.akNthp[n]
E=∑−MM(p[n]−x[n])2
над заданим вектором даних .x=[x[−M],x[−M+1],...,x[0],x[1],...,x[M]]T
Ці оптимальні коефіцієнти многочленів отримують, встановивши похідну на нуль:akE
∂E∂ai=0 , for i=0,1,..,N(1)
Тепер для тих, хто знайомий з процедурою LSE polyfit, я просто напишу отримане матричне рівняння (за посиланням), яке визначає набір оптимальних коефіцієнтів:
a=(ATA)−1ATx=Hx(2)
де - вектор вхідних даних, є матрицею , LSE polyfit і по матриці є моментом часу матриця (сили цілих моментів часу ); тобто зауважте, що і і, отже, залежать від вхідних значень даних, оскільки задається:x(2M+1)×1H2M+1NAnAHA
A=[αn,i]=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢(−M)0(−M+1)0(0)0(M)0(−M)1(−M+1)1...(0)1...(M)1............(−M)N(−M+1)N(0)N(M)N⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥
Тепер відкиньмося на мить і обговоримо точку тут.
Як виразно вказує рівняння (2), хоча і не залежать від вхідних даних і залежать лише від показників часу , оптимальні коефіцієнти полінома LSE залежать від вхідних даних. Крім того, вони також залежать від розміру вікна і порядок полінома . Крім того, коли вікно ковзає вздовж вхідних даних , коефіцієнт слід перераховувати (оновлювати), а отже, і залежати від часу. Саме так визначається фільтр SG у посиланні на сторінці наведеному нижче:AHnakMNx[n]ak2nd
... Це (поліфіт LSE) може повторюватися на кожному зразку вхідного сигналу, щоразу створюючи новий многочлен і нове значення вихідної послідовності y [n] ...
То як же ми подолаємо цей неприємний сюрприз? Інтерпретуючи та визначаючи вихідний фільтр SG таким чином:
SG-фільтр порядку для кожного зразка приймає набір входів і виробляє єдиний вихідний зразок визначений як поліном оцінений на ; тобтоNnx[n]y[n]p[n]n=0
y[n]=y[0]=∑m=0Namnm=a0
Тобто для кожного вхідного набору з зразків (в центрі приблизно ) фільтр SG виробляє вихід, позначений , що еквівалентно одиничному коефіцієнту оптимального LSE поліном пов'язаний з цим конкретним вікном зразків . Між іншим, коли вікно ковзає по довжині вхідних даних, кожного разу новий вивідний зразок обчислюється відповідно до вікна зразків . Ось це фільтрує нанкус.2M+1x[n]n=dy[n]a0p[n]x[n]n=dy[d]x[d−M],x[d−M+1],...,x[d−1],x[d],x[d+1],...x[d+M]
Тепер час показати, що коефіцієнт отримується як лінійна комбінація значень вхідного сигналу у вікні , а вихід фільтра є лінійною комбінацією вхідних значень . І це саме визначення згортання (LTI) за допомогою фільтра FIR; вихід на час - лінійна комбінація його вхідних і коефіцієнтів фільтра . Але тоді, які коефіцієнти фільтра для цього фільтра SG? Подивимось.a0x[n]y[n]x[n]nx[n]h[n]
Ще раз розглянемо обчислення :ak
a=Hx
⎡⎣⎢⎢⎢⎢a0a1⋮aN⎤⎦⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢h(0,0)h(1,0)h(N,0)h(0,1)h(1,1)...h(0,1).........h(0,2M)h(1,2M)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]
де в останній рівності ми інтерпретували суму крапкового добутку як суму згортки, розглядаючи імпульсну характеристику фільтра SG на ,h[n]=H(0,−n)
точніше, це імпульсна характеристика SG-фільтра порядку з довжиною вікна .N2M+1
І повний вихід фільтр SG N-го порядку з розміром вікна , для входу довжини отримується одним згортанням LTI з імпульсною характеристикоюy[n]2M+1x[n]LhN[n]
y[n]=x[n]⋆hN[n]
КОМЕНТАР
Той факт, що коефіцієнти поліномів залежать від вхідних даних, не перешкоджає фільтру бути LTI FIR. Оскільки імпульсна характеристика може бути визначена для відображення виходу що обчислюється з лінійних комбінацій вхідних вибірок. Лінійні комбінації вхідних вибірок невід'ємно випливає з матричного твори , який визначає коефіцієнти оптимальних з , отже , будь-яка лінійна комбінація б також призвести до КІМ LTI фільтра , щоб представити процедура поліномічного прилягання LSE.akh[n]y[n]xa=Hxakp[n]akh[n]
КОД МАТЛАБ / ОКТВЕ
Наступні прості MATLAB / OCTAVE можуть бути використані для обчислення цих імпульсних відповідей фільтра SG (Зауважте, що вбудований у нього конструктор SG може створити інший набір як зазначено в зв’язаному файлі pdf)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]');
Вихід:
Сподіваюся, що це прояснює проблему.