когда a = 1
, filter
просто применяют свертку (в одном направлении) и filtfilt
применяют свертку в обоих направлениях (вперед и затем назад).
Итак, filtfilt
- не более чем свертка в обоих направлениях, вот пример 1D непрерывной свертки в прямом направлении.
источник: Википедия, анимация Лаутаро Кармона
Так, например:
close all
% make the example reproductible
rng('default')
% random vector
x = rand(72,1);
% a, the trailing zero are totally useless.
a = 1;
% b
b = [0.5 1 1 1 0.5];
% filtfilt
Xfilt = filtfilt(b/4,a,x);
% forward and then backward convolution
Xconv = fliplr(conv(fliplr(conv(x,b/4,'same')),b/4,'same'));
% plot the result
hold on
plot(Xfilt)
plot(Xconv)
legend('filtfilt','convolution')
Вывести эту цифру:
Свертка и функция фильтрафильта выдают, как и ожидалось, одинаковые значения (кроме границы, поскольку filtfilt
компенсирует эффект границы).
можно даже получить точно такой же результат, если вы также компенсируете граничный эффект.
Теперь стало ясно, что нам нужно разделить b
на sum(b)
, чтобы применить скользящее среднее.
Так что, действительно, если вам нужно применить скользящее среднее, чтобы учесть последние 12 значений и следующие 12 значений, ваш вектор b должен быть [0.5 ones(1,23) 0.5]
.