Saya baru untuk pemrosesan sinyal dan terutama untuk FFT, maka saya tidak yakin apakah saya melakukan hal yang benar di sini dan saya agak bingung dengan hasilnya.
Saya memiliki fungsi nyata diskrit (data pengukuran) dan ingin mengatur low pass filter. Alat pilihan adalah Python dengan paket numpy. Saya mengikuti prosedur ini:
- hitung fft dari fungsi saya
- memotong frekuensi tinggi
- melakukan invers fft
Berikut adalah kode yang saya gunakan:
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)
Apakah ini prosedur yang benar? Hasilnya inverse
berisi nilai-nilai kompleks, yang membingungkan saya.
fft
lowpass-filter
python
Sampai b
sumber
sumber
Jawaban:
Fakta bahwa hasilnya rumit harus diharapkan. Saya ingin menunjukkan beberapa hal:
Anda menerapkan filter domain frekuensi brick-wall untuk data, mencoba untuk nol semua output FFT yang sesuai dengan frekuensi lebih besar dari 0,005 Hz, kemudian mengubah terbalik untuk mendapatkan sinyal domain-waktu lagi. Agar hasilnya menjadi nyata, maka input ke FFT terbalik harus simetris konjugat . Ini berarti bahwa untuk panjang- FFT,N
Saya melihat bahwa Anda mencoba melakukan sesuatu seperti ini dalam kode Anda di atas, tetapi itu tidak sepenuhnya benar. Jika Anda menerapkan kondisi di atas pada sinyal yang Anda berikan ke FFT terbalik, maka Anda harus mengeluarkan sinyal nyata.
Poin kedua saya lebih bersifat filosofis: apa yang Anda lakukan akan berhasil, karena hal itu akan menekan konten domain frekuensi yang tidak Anda inginkan. Namun, ini biasanya bukan cara filter lowpass akan diterapkan dalam praktiknya. Seperti yang saya sebutkan sebelumnya, apa yang Anda lakukan pada dasarnya adalah menerapkan filter yang memiliki respon magnitudo dinding-bata (yaitu persegi panjang sempurna). Respons impuls filter semacam itu memiliki bentuk . Karena penggandaan dalam domain frekuensi setara dengan (dalam kasus menggunakan konvolusi DFT, bundar) dalam domain waktu, operasi ini sama dengan menggabungkan sinyal domain waktu dengan fungsi .s i n csinc(x) sinc
Mengapa ini menjadi masalah? Ingatlah seperti apa fungsi dalam domain waktu (di bawah gambar dipinjam tanpa malu-malu dari Wikipedia):sinc
Fungsi memiliki dukungan yang sangat luas dalam domain waktu; itu meluruh sangat lambat saat Anda bergerak menjauh dari lobus utamanya. Untuk banyak aplikasi, ini bukan properti yang diinginkan; ketika Anda memadukan sinyal dengan , efek dari sidelobes yang perlahan membusuk akan sering terlihat dalam bentuk domain waktu dari sinyal output yang difilter. Efek semacam ini sering disebut sebagai dering . Jika Anda tahu apa yang Anda lakukan, ada beberapa kasus di mana jenis penyaringan ini mungkin sesuai, tetapi dalam kasus umum, itu bukan yang Anda inginkan.s i n csinc sinc
Ada cara yang lebih praktis untuk menerapkan filter lowpass, baik dalam domain waktu dan frekuensi. Respons impuls terbatas dan filter respons impuls tak terbatas dapat diterapkan langsung menggunakan representasi persamaan perbedaannya . Atau, jika filter Anda memiliki respons impuls yang cukup lama, Anda seringkali dapat memperoleh manfaat kinerja menggunakan teknik konvolusi cepat berdasarkan FFT (menerapkan filter dengan mengalikan dalam domain frekuensi alih-alih konvolusi dalam domain waktu), seperti tumpang tindih- simpan dan tumpang tindih-tambahkan metode.
sumber