Конструкция фильтра и извлечение частоты в Python

Я работаю над проектом, чтобы найти мгновенную частоту многокомпонентного аудиосигнала в Python. В настоящее время я использую полосовой фильтр Butterworth в сочетании с scipy.signal.lfilter извлечь около нужной частоты. Затем я использую аналитический сигнал (от scipy.signal.hilbert) получить мгновенный участок, который можно развернуть для того чтобы дать частоту.

как относительный новичок в обработке сигналов, у меня есть два основных вопроса:

  1. Я читал что во многих приложениях предпочтительнее использовать scipy.signal.filtfilt над scipy.signal.lfilter. Конечно, когда я применяю filtfilt к моим данным, я получаю значительно более гладкий мгновенный частотный сигнал. Я хотел бы знать основные различия между ними, имея в виду, что я хотел бы получить выход, который как можно ближе к "истинной" мгновенной частоте.

  2. мгновенные частотные данные нестационарны, что означает, что в некоторых случаях я должен используйте более широкий полосовой фильтр, чтобы захватить все необходимые данные. Это, по-видимому, вводит дополнительный шум и случайные нестабильности в мой сигнал. Есть ли способы справиться с такими проблемами, например, с помощью лучше разработанного фильтра?

редактировать

в ответ на flebool ниже приведены некоторые изображения данных, на которые я смотрю. Во-первых, сравнение filt и filtfilt: Comparison of <code>filt</code> and <code>filtfilt</code> Оба вышеуказанных сигнала имели то же самое Применен фильтр Баттерворта (хотя функция фильтра отличается), с последующим извлечением мгновенной частоты (что и строится, как функция времени). filtfilt кажется, сдвигает и сглаживает данные. Является ли один из этих сигналов лучшим приближением "истинного" сигнала?

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

во-вторых, эффект увеличения размера фильтра Баттерворта : Widening the filter Это для того же подмножества данных, что и рис. 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, когда вы знаете, где находятся данные, которые вы хотели бы