фільтр низьких частот і FFT для початківців з Python


23

Я новачок в обробці сигналів і особливо в FFT, отже, я не впевнений, чи роблю я тут правильно, і я трохи заплутаний у результаті.

У мене є дискретна реальна функція (дані вимірювань) і хочу встановити на ній фільтр низьких частот. Вибір інструменту - Python з пакетом numpy. Я дотримуюся цієї процедури:

  • обчислити ффт моєї функції
  • відрізати високі частоти
  • виконати зворотний ффт

Ось код, який я використовую:

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
Коли я вивчав FFT, мені ця публікація була дуже корисною. glowingpython.blogspot.com/2011/08/…
Девід Пул

Відповіді:


23

Те, що результат складний, слід очікувати. Я хочу зазначити кілька речей:

Ви застосовуєте фільтр доменної частоти для цегляної стіни до даних, намагаючись зняти нуль всі виходи FFT, що відповідають частоті більше 0,005 Гц, а потім зворотне перетворення, щоб знову отримати сигнал часової області. Для того, щоб результат був реальним, тоді вхід до зворотного FFT повинен бути сполученим симетричним . Це означає, що для довжини - FFT,N

Х[к]=Х[N-к],к=1,2,,N2-1(Nеvен)

Х[к]=Х[N-к],к=1,2,,N2(Nогг)
  • Зауважте, що для парних, і загалом не рівні, але вони обидва реальні. Для непарних , повинен бути реальним.X [ 0 ] X [ NNХ[0]Х[N2]NХ[0]

Я бачу, що ви намагалися зробити щось подібне у своєму коді вище, але це не зовсім правильно. Якщо ви застосовуєте вищевказану умову щодо сигналу, який ви передаєте на зворотний FFT, тоді ви повинні отримати реальний сигнал.

Мій другий пункт більш філософський: те, що ви робите, буде працювати, оскільки воно придушить вміст доменних частот, який ви не хочете. Однак це, як правило, не фільтр низьких частот, який би реалізувався на практиці. Як я вже згадував, те, що ви робите, - це по суті застосувати фільтр, який має величину реакції величини цегляної стіни (тобто ідеально прямокутної форми). Імпульсна характеристика такого фільтра має форму . Оскільки множення в частотній області еквівалентно (у випадку використання DFT, кругової) згортки у часовій області, ця операція еквівалентна згортанню сигналу часової області з функцією .сiнc(х)сiнc

Чому це проблема? Згадаймо, як виглядає функція у часовій області (нижче зображення безсоромно запозичене у Вікіпедії):сiнc

сюжет функції sinc

Функція має дуже широку підтримку у часовій області; воно затухає дуже повільно, коли ви віддаляєтесь вчасно від його основної частки. Для багатьох застосувань це не бажана властивість; коли ви перетворюєте сигнал на , наслідки повільно згасаючих бічних кульок часто будуть помітні у формі часової області відфільтрованого вихідного сигналу. Цей ефект часто називають дзвоном . Якщо ви знаєте, що ви робите, є деякі випадки, коли цей тип фільтрації може бути доречним, але в загальному випадку це не те, що ви хочете.сiнcсiнc

Існують більш практичні засоби застосування фільтрів низьких частот, як у часовій, так і в частотній областях. Кінцеві імпульсні реакції та нескінченні імпульсні фільтри можуть застосовуватися безпосередньо, використовуючи їх різницеве ​​рівняння . Або якщо ваш фільтр має досить тривалий імпульсний відгук, ви часто можете отримувати переваги від продуктивності, використовуючи швидкі методи згортки , засновані на FFT (застосовуючи фільтр шляхом множення в частотній області замість згортки у часовій області), наприклад перекриття- збереження та перекриття-додавання методів.


Функція sinc - це ідеальна фільтрація, хоча, ні? Ось до чого прагнуть усі інші фільтри, але не досягають цього. Це погано для обробки зображень, тому що зображення спочатку не антиалізировані, тому він створює дзвінок, який виглядає жахливо, але для аудіо чи інших сигналів, які були відфільтровані перед відбором антиалій, чи це не найкращий фільтр, який можна отримати?
ендоліт

1
Так, мій результат був не сполученим симетричним. Я виправив код, зараз все працює добре. Дякую!
до B

3
@endolith - Sinc є ідеальним інтерполятором для певних видів інтерполяції, але може бути далеко не ідеальним як фільтр для більшості видів загальних вимог до фільтра, таких як рівність реакції смуги пропускання, відхилення смуги зупинки тощо.
hotpaw2

+1 за приємне пояснення на тему "чому люди не застосовують фільтр, як це робить PO"
Сіббс Азартні ігри

Ви повинні використовувати віконний синхроніка. Якщо ви не обмежені часом, це оптимальний фільтр, набагато кращий, ніж Чебічев.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.