Конструкция фильтра и извлечение частоты в Python
Я работаю над проектом, чтобы найти мгновенную частоту многокомпонентного аудиосигнала в Python. В настоящее время я использую полосовой фильтр Butterworth в сочетании с scipy.signal.lfilter
извлечь около нужной частоты. Затем я использую аналитический сигнал (от scipy.signal.hilbert
) получить мгновенный участок, который можно развернуть для того чтобы дать частоту.
как относительный новичок в обработке сигналов, у меня есть два основных вопроса:
Я читал что во многих приложениях предпочтительнее использовать
scipy.signal.filtfilt
надscipy.signal.lfilter
. Конечно, когда я применяюfiltfilt
к моим данным, я получаю значительно более гладкий мгновенный частотный сигнал. Я хотел бы знать основные различия между ними, имея в виду, что я хотел бы получить выход, который как можно ближе к "истинной" мгновенной частоте.мгновенные частотные данные нестационарны, что означает, что в некоторых случаях я должен используйте более широкий полосовой фильтр, чтобы захватить все необходимые данные. Это, по-видимому, вводит дополнительный шум и случайные нестабильности в мой сигнал. Есть ли способы справиться с такими проблемами, например, с помощью лучше разработанного фильтра?
редактировать
в ответ на flebool ниже приведены некоторые изображения данных, на которые я смотрю. Во-первых, сравнение filt
и filtfilt
:
Оба вышеуказанных сигнала имели то же самое Применен фильтр Баттерворта (хотя функция фильтра отличается), с последующим извлечением мгновенной частоты (что и строится, как функция времени). filtfilt
кажется, сдвигает и сглаживает данные. Является ли один из этих сигналов лучшим приближением "истинного" сигнала?
обратите внимание, что этот график показывает только часть конкретного сигнала.
во-вторых, эффект увеличения размера фильтра Баттерворта :
Это для того же подмножества данных, что и рис. 1. Легенда показывает нижнюю и верхнюю границу фильтра соответственно (Красная трассировка -filt
версия данных на рис. 1).
хотя здесь может быть неясно, почему я буду использовать большую полосу пропускания, в некоторых случаях данные могут быть расположены в разных точках между, скажем, 600 и 800Hz. Именно здесь мне потребуется более широкий дизайн фильтра. Вы можете видеть, что дополнительный шум входит в трассировку по мере расширения фильтра; я хотел бы знать, есть ли способ оптимизация / улучшение дизайна фильтра.
2 ответов
некоторые редкие комментарии:
1) на верхней картинке: я не могу комментировать, что лучше между filt и filtfilt, хотя сдвиг частоты filtfilt вызывает беспокойство. Аналогичный результат можно получить, применив фильтр нижних частот к сигналу фильтра.
2) нет" истинной " мгновенной частоты, если сигнал не был специально сгенерирован с определенным тоном. По моему опыту разворачивание фазы преобразования Гильберта делает хорошую работу во многих случаях, хотя. Он становится все менее и менее надежным по мере роста отношения шума к интенсивности сигнала.
3) Что касается нижнего изображения, вы говорите, что иногда вам нужен большой полосовой фильтр. Это потому, что сигнал очень длинный, а мгновенная частота перемещается между 500 и 800 Гц? Если это так, вы можете продолжить оконный сигнал до длины, при которой фильтрованный сигнал имеет определенный пик в спектре Фурье, извлечь этот пик, адаптировать полосовой фильтр к этот пик, примените Гильберта к оконному сигналу, извлеките фазу, отфильтруйте фазу.
Это стоит сделать, если вы уверены, что сигнал имеет другие гармоники, кроме шума и тот, который вас интересует, и это занимает некоторое время. Прежде чем сделать это, я хотел бы убедиться, что данные, которые я получаю, неверны.
Если это просто 1 гармоника + шум, я бы lowpass + Гильберт + извлечь мгновенную фазу + lowpass снова на мгновенной фазе
к вашей первой проблеме я не могу говорить разумно, но scipy, как правило, хорошо документирован, поэтому я бы начал читать некоторые из их вещей.
к вашей второй проблеме лучше разработанный фильтр, безусловно, поможет. Вы говорите, что данные "нестационарны", вы знаете, где они будут? Или какие частоты он может занимать? Например, если сигнал центрирован вокруг 1 из 3 частот, которые вы знаете a-priori, вы можете иметь три разных фильтра и запускать сигнал через все 3 (только один дает вам выход, который вы хотите, конечно).
Если вы не знаете, что у вас есть такие знания о сигнале, я бы сначала сделал более широкий BPF, а затем сделал некоторое пиковое обнаружение и применил более строгий BPF, когда вы знаете, где находятся данные, которые вы хотели бы