Использование объекта Matlab digitalfilter из lowpass () в filter () - PullRequest
0 голосов
/ 28 января 2019

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

Кажется, что lowpass() - это медленная операция, и я могу ускорить ее, если повторно используюобъект фильтра, который создан.Справка для lowpass() говорит, что:

[Y, D] = нижний проход (...) возвращает цифровой фильтр, D, используемый для фильтрации сигнала.[...] Вызовите фильтр (D, X) для фильтрации данных.

Однако, когда я пытаюсь использовать объект фильтра таким образом, я получаю результаты, отличные от того, что возвращает lowpass().Я ожидаю, что lp1 и lp2 будут идентичны в этом примере:

% Test input data
x = rand([200,1]);
% Lowpass filter, and save the filter object to df:
[lp1, df] = lowpass(x,50,1000);
% Reuse the filter object:
lp2 = filter(df, x);

% Plot to show that they are clearly different results
figure;plot(lp1);hold on;plot(lp2);

Я также пытался использовать filtfilt(), но это не дает идентичный результат.

1 Ответ

0 голосов
/ 28 января 2019

Быстрый трюк для повторного использования объекта фильтра 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...