фильтр низких частот и БПФ для начинающих с Python

23

Я новичок в обработке сигналов и особенно в FFT, поэтому я не уверен, что я делаю правильные вещи здесь, и я немного запутался с результатом.

У меня есть дискретная реальная функция (данные измерений), и я хочу настроить фильтр низких частот. Инструментом выбора является Python с пакетом NumPy. Я следую этой процедуре:

  • вычислить результат моей функции
  • отрезать высокие частоты
  • выполнить обратное FFT

Вот код, который я использую:

import numpy as np
sampling_length = 15.0*60.0 # measured every 15 minutes
Fs = 1.0/sampling_length
ls = range(len(data)) # data contains the function
freq = np.fft.fftfreq(len(data), d = sampling_length)
fft = np.fft.fft(data)
x = freq[:len(data)/2] 
for i in range(len(x)):
if x[i] > 0.005: # cut off all frequencies higher than 0.005
    fft[i] = 0.0
    fft[len(data)/2 + i] = 0.0
inverse = np.fft.ifft(fft)

Это правильная процедура? Результат inverseсодержит сложные значения, которые меня смущают.

До б
источник
1
Когда я изучал БПФ, я нашел этот пост очень полезным. glowingpython.blogspot.com/2011/08/…
Дэвид Пул

Ответы:

23

Тот факт, что результат является сложным, следует ожидать. Я хочу указать на пару вещей:

Вы применяете к данным фильтр в частотной области с кирпичной стенкой, пытаясь обнулить все выходы БПФ, которые соответствуют частоте, превышающей 0,005 Гц, и затем выполнить обратное преобразование, чтобы снова получить сигнал во временной области. Чтобы результат был действительным, входной сигнал для обратного БПФ должен быть сопряженно-симметричным . Это означает, что для длины БПФ,N

X[k]=X[Nk],k=1,2,,N21(Neven)

X[k]=X[Nk],k=1,2,,N2(Nodd)
  • Обратите внимание, что для четного и в общем случае не равны, но оба они действительны. Для нечетных , должен быть реальным.NX[0]NX[0]X[N2]NX[0]

Я вижу, что вы пытались сделать что-то подобное в своем коде выше, но это не совсем правильно. Если вы применяете вышеуказанное условие к сигналу, который вы передаете обратному БПФ, вы должны получить реальный сигнал.

Мое второе замечание носит скорее философский характер: то, что вы делаете, будет работать, поскольку оно будет подавлять контент в частотной области, который вам не нужен. Однако обычно это не тот способ, которым фильтр нижних частот будет реализован на практике. Как я уже упоминал ранее, вы, по сути, применяете фильтр, который имеет отклик в виде кирпичной стены (то есть идеально прямоугольной). Импульсная характеристика такого фильтра имеет форму . Поскольку умножение в частотной области эквивалентно (в случае использования DFT, круговой) свертки во временной области, эта операция эквивалентна свертке сигнала временной области с функцией .s i n csinc(x)sinc

Почему это проблема? Вспомним, как выглядит функция во временной области (ниже изображение бесстыдно позаимствовано из Википедии):sinc

график функции sinc

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

Существуют более практичные способы применения фильтров низких частот как во временной, так и в частотной областях. Фильтры с конечной импульсной характеристикой и бесконечной импульсной характеристикой могут быть применены напрямую, используя их представление разностного уравнения . Или, если ваш фильтр имеет достаточно длинный импульсный отклик, вы часто можете получить выигрыш в производительности, используя методы быстрой свертки , основанные на БПФ (применение фильтра путем умножения в частотной области вместо свертки во временной области), например перекрытие методы сохранения и перекрытия-добавления .

Джейсон Р
источник
Функция sinc - идеальная фильтрация, правда? Это то, к чему стремятся все остальные фильтры, но не достигают. Это плохо для обработки изображений, потому что изображения сначала не сглаживаются, поэтому он производит звон, который выглядит ужасно, но для аудио или других сигналов, которые были отфильтрованы до сэмплирования, разве это не лучший фильтр, который вы можете получить?
Эндолит
1
Да, мой результат не был сопряженным симметричным. Я исправил код, теперь все отлично работает. Спасибо!
до B
3
@endolith - Sinc - это идеальный интерполятор для определенных видов интерполяции, но он может быть далек от идеального в качестве фильтра для большинства общих требований к фильтрам, таких как плоскостность отклика полосы пропускания, отклонение полосы останова и т. д.
hotpaw2
+1 за хорошее объяснение «почему люди не внедряют фильтр, как это делает ПО»
Sibbs Gambling
Вы должны использовать оконный синус. Если вы не ограничены во времени, это оптимальный фильтр, гораздо лучше, чем Чебичев.