Быстрый трюк для повторного использования объекта фильтра df, если вы хотите получить тот же вывод, что и для нижнего прохода в этом конкретном сценарии, и если время не на вашей стороне: lp3 = conv (x, df.Coefficients, 'same');
Пояснение: фильтр, который вы разработали с использованием lowpass.m, представляет собой фильтр с конечной импульсной характеристикой (FIR), который сдвигает фазы.Посмотрите еще раз на две кривые на рисунке, который создает ваш фрагмент кода, и вы поймете, что кривая, созданная filter.m, по сути является версией со смещением вправо версии, созданной lowpass.m.Вы можете попытаться исправить это, см. https://de.mathworks.com/help/signal/ug/compensate-for-the-delay-introduced-by-an-fir-filter.html. Удивительная часть, однако, в том, что lowpass.m автоматически исправляет задержку, которую не показало беглое чтение документов.
filterfilt.m выполняет фильтрацию дважды, один раз в прямом направлении, затем в обратном, и дополнительно «... минимизирует начальные и конечные переходные процессы ...».Поскольку фильтрация туда-сюда по существу отменяет задержки, но и фильтрует сильнее, результаты по определению будут отличаться от результатов lowpass.m и filter.m.
В долгосрочной перспективе вам будет лучшепотратив некоторое время на разработку ваших фильтров снизу вверх (документы Matlab превосходны в этом отношении), не используя относительно новые удобные функции-оболочки, такие как lowpass, которые, по-видимому, выполняют задачи, которые не запрашиваются в фоновом режиме.
% Test input data
x = rand([200,1]);
t = 1:200;
% Lowpass filter, and save the filter object to df:
[lp1, df] = lowpass(x,50,1000);
% Reuse the filter object:
lp2 = filter(df, x);
% Convolution of time series with filter coefficients
lp3 = conv(x, df.Coefficients, 'same');
% Plot
figure(1), clf;
subplot(2,1,1)
% Plot lp3 with a tiny offset so we can discern it from lp1
plot(t, lp1, t, lp2, t, lp3+0.01)
legend('lowpass.m','filter.m','convolution')
% Use filtfilt to obtain zero-lag, doubly filtered version (for comparison)
lp4 = filtfilt(df, x);
subplot(2,1,2)
plot(t, lp1, t, lp4)
legend('lowpass.m','filtfilt.m')