Я новичок в обработке сигналов и особенно в 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
содержит сложные значения, которые меня смущают.
fft
lowpass-filter
python
До б
источник
источник
Ответы:
Тот факт, что результат является сложным, следует ожидать. Я хочу указать на пару вещей:
Вы применяете к данным фильтр в частотной области с кирпичной стенкой, пытаясь обнулить все выходы БПФ, которые соответствуют частоте, превышающей 0,005 Гц, и затем выполнить обратное преобразование, чтобы снова получить сигнал во временной области. Чтобы результат был действительным, входной сигнал для обратного БПФ должен быть сопряженно-симметричным . Это означает, что для длины БПФ,N
Я вижу, что вы пытались сделать что-то подобное в своем коде выше, но это не совсем правильно. Если вы применяете вышеуказанное условие к сигналу, который вы передаете обратному БПФ, вы должны получить реальный сигнал.
Мое второе замечание носит скорее философский характер: то, что вы делаете, будет работать, поскольку оно будет подавлять контент в частотной области, который вам не нужен. Однако обычно это не тот способ, которым фильтр нижних частот будет реализован на практике. Как я уже упоминал ранее, вы, по сути, применяете фильтр, который имеет отклик в виде кирпичной стены (то есть идеально прямоугольной). Импульсная характеристика такого фильтра имеет форму . Поскольку умножение в частотной области эквивалентно (в случае использования DFT, круговой) свертки во временной области, эта операция эквивалентна свертке сигнала временной области с функцией .s i n csinc(x) sinc
Почему это проблема? Вспомним, как выглядит функция во временной области (ниже изображение бесстыдно позаимствовано из Википедии):sinc
Функция имеет очень широкую поддержку во временной области; он затухает очень медленно, когда вы отодвигаетесь во времени от своей основной доли. Для многих приложений это нежелательное свойство; когда вы свертываете сигнал с , эффекты медленно затухающих боковых лепестков часто будут проявляться в форме отфильтрованного выходного сигнала во временной области. Этот вид эффекта часто называют звонком . Если вы знаете, что делаете, в некоторых случаях этот тип фильтрации может быть уместным, но в общем случае это не то, что вам нужно.с я н сsinc sinc
Существуют более практичные способы применения фильтров низких частот как во временной, так и в частотной областях. Фильтры с конечной импульсной характеристикой и бесконечной импульсной характеристикой могут быть применены напрямую, используя их представление разностного уравнения . Или, если ваш фильтр имеет достаточно длинный импульсный отклик, вы часто можете получить выигрыш в производительности, используя методы быстрой свертки , основанные на БПФ (применение фильтра путем умножения в частотной области вместо свертки во временной области), например перекрытие методы сохранения и перекрытия-добавления .
источник