Полосовая фильтрация на низких частотах

Я хотел бы знать, есть ли какая-либо передовая практика для решения следующей проблемы, которая, я думаю, может представлять общий интерес.

У меня есть сигнал с частотой 40 кГц в течение примерно 60 с. Этот сигнал содержит частоты до 5 кГц, но меня интересует только его 40-герцовая составляющая.

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

Вычислительные усилия не являются проблемой.


person Rickson    schedule 09.01.2019    source источник
comment
В Matlab я бы попробовал butter разработать фильтр. Используйте выход с нулевым коэффициентом усиления (вместо числителя и знаменателя передаточной функции, которые вызывают числовую нестабильность даже для низких порядков фильтра). Затем конвертируйте в формат SOS. Затем вы можете использовать filtfilt, который применяет фильтр дважды: обычно и в обратном порядке. Это обеспечивает линейную фазу; он также эффективно удваивает порядок фильтра и возводит в квадрат абсолютное значение передаточной функции. См. примеры здесь и здесь   -  person Luis Mendo    schedule 10.01.2019
comment
Разработка и применение фильтра — хороший подход, если вы хотите отфильтровать какой-либо сигнал в режиме реального времени. Если вы просто заинтересованы в манипулировании определенным фрагментом сигнала, может быть целесообразно применить окно перед выполнением БПФ, а затем просто установить нежелательные частотные элементы на ноль и преобразовать обработанный спектр обратно во временную область с помощью IFFT. В некотором смысле этот подход подобен применению идеального фильтра нижних частот к вашему сигналу.   -  person Mouse On Mars    schedule 10.01.2019
comment
Это очень интересные подходы. Однако мне нужно фильтровать в реальном времени, так как мне нужен новый сигнал, который состоит только из 40-герцовой составляющей исходного сигнала для дальнейшей обработки. Не только кусок исходного сигнала. Я попытаюсь реализовать это, как предложил @LuisMendo для дальнейшего обсуждения.   -  person Rickson    schedule 10.01.2019
comment
Требование реального времени меняет все. В вопросе не было ясно, что вам нужно реальное время. В этом случае я не могу предложить никакой помощи   -  person Luis Mendo    schedule 10.01.2019
comment
Извините, я думаю, что ошибся. Я имею в виду, что я захватил сигнал, а затем хочу обработать его так, чтобы новый сигнал имел только компонент исходного сигнала с частотой 40 Гц, но с той же временной базой и линейной фазой. Однако мне нужно обработать весь сигнал, а не только его часть.   -  person Rickson    schedule 10.01.2019
comment
Я думаю, что мой комментарий с упоминанием куска вводит в заблуждение. Я имел в виду, что вы можете просто использовать FFT/IFFT для постобработки всего записанного вами сигнала. Напротив, если вы хотите построить систему, которая непрерывно фильтрует сигнал, который записывается в режиме реального времени (например, с микрофона или любого источника данных/датчика), вы можете разработать фильтр и сделать все возможное, чтобы подавить нежелательные частоты. в вашем сигнале.   -  person Mouse On Mars    schedule 10.01.2019
comment
Спасибо за разъяснение. В этом случае я попробую оба рекомендуемых подхода.   -  person Rickson    schedule 11.01.2019


Ответы (1)


Создайте узкополосный фильтр, используя: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.iirpeak.html, а затем примените его к сигналу, используя фильтр прямого-обратного направления, filtfilt: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.signal.filtfilt.html.

Прямая-обратная фильтрация требует секционирования сигнала, но вы всегда можете создавать секции с большим перекрытием.

person Gideon Kogan    schedule 15.01.2019