Каковы на самом деле передаточные функции в FilterFilt (фильтр смещения нуля Matlab)? - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь адаптировать некоторый код, который генерирует среднесуточные временные ряды из ввода средних значений за 6 часов, чтобы вместо этого использовать данные со средними значениями за 1 час. Кажется, что это делается с помощью функции Matlab filtfilt с b=[0.5 1 1 1 0.5]/4 и a=[1 0 0 0 0], которые, по-видимому, являются передаточными функциями фильтра. Проблема в том, что я абсолютно не представляю, что такое функция переноса фильтра (и большинство найденных мной объяснений требуют инженерного образования, которого у меня нет), и поэтому я не уверен, как адаптировать этот фильтр для использования 1 - ежечасно - значит.

Наивно, так как временной ряд 6-часового среднего имеет 4 точки данных в день, мне интересно, если это причина, почему числа в b складываются до 4, и так как у меня теперь есть 24 точки данных в день, если значения, которые мне нужны, поэтому:

b=[0.5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0.5]

a=[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

Но я действительно не уверен !

1 Ответ

1 голос
/ 17 марта 2020

когда a = 1, filter просто применяют свертку (в одном направлении) и filtfilt применяют свертку в обоих направлениях (вперед и затем назад).

Итак, filtfilt - не более чем свертка в обоих направлениях, вот пример 1D непрерывной свертки в прямом направлении.

enter image description here

источник: Википедия, анимация Лаутаро Кармона

Так, например:

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')

Вывести эту цифру:

enter image description here

Свертка и функция фильтрафильта выдают, как и ожидалось, одинаковые значения (кроме границы, поскольку filtfilt компенсирует эффект границы).

можно даже получить точно такой же результат, если вы также компенсируете граничный эффект.

Теперь стало ясно, что нам нужно разделить b на sum(b), чтобы применить скользящее среднее.

Так что, действительно, если вам нужно применить скользящее среднее, чтобы учесть последние 12 значений и следующие 12 значений, ваш вектор b должен быть [0.5 ones(1,23) 0.5].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...