2013-11-20 129 views
2

我試圖用FFT和逆FFT(IFFT)在Matlab中過濾(真實)信號。我有一個IIR濾波器(係數'b'和'a')。我期待(約?)相同的結果,如果我只是做到了這一點:MATLAB:使用帶有IIR濾波器的FFT/IFFT在頻域中進行濾波

filteredSignal = filter(b,a,signal); 

所以這是我做過什麼:

NFFT = length(signal); 
FFTsignal = fft(signal, NFFT); 
FilterFreqResponse = freqz(b,a,NFFT); 
FFTfilteredSignal = FFTsignal .* FilterFreqResponse; 
filteredSignal = ifft(FFTfilteredSignal, NFFT); 

而且這裏的問題是,所產生的信號( filteredSignal)是複雜的。我想要一個真實的信號(作爲我的輸入信號)。 filter函數也返回一個真實信號。所以......我做錯了什麼?用IIR濾波器進行基於FFT的濾波是不可能的?我的意思是:我的濾波器的頻率響應相對於原點不是對稱的,所以我的濾波信號的頻譜也不會是對稱的,所以時域中的濾波信號不能是真實的...?

PS:有在IFFT功能的「對稱」選項:

filteredSignal = ifft(FFTfilteredSignal, NFFT, 'symmetric'); 

如果我這樣做,是filteredSignal現在真正...但顯然是不同的(幅度和相位)從一個我直接使用「過濾器」功能。而這個「對稱」選項顯然丟棄虛構的部分,或類似的東西,所以它可能不是一個好主意,我想用它...

非常感謝提前! (和抱歉,我的英語水平)

回答

1

FilterFreqResponse的點只在單位圓的上半部分等距離分佈。您是否嘗試過FilterFreqResponse = freqz(b,a,NFFT,'whole')

+0

謝謝!我首先嚐試了詹姆斯的解決方案,然後我看到了你的評論,並且都給出了相同的結果(幸運的是!)。現在我明白了:) – user3015199

1

使用逆FFT的實部:

filteredSignal = real(ifft(FFTfilteredSignal, NFFT)); 
+0

我試過這個,但不幸的是它不起作用。如果我這樣做了,那麼所得到的信號會失去或多或少一半的幅度,並且與使用「濾波器」函數得到的濾波信號不同相。 – user3015199

3

這是不正確的只使用結果的實部,

,你的答案是複雜的原因是點對點乘法沒有被對稱地執行:即爲了有意義的答案,矢量FilterResponse必須是關於它的中心元素對稱的。您應該只在Fs/2(即較小的矢量)之前建立濾波器響應,然後編寫一些邏輯將其共軛對稱地應用於鏡像頻率。或者,Matlab可以自動通過以下方式爲您執行此操作:FilterFreqResponse = freqz(b,a,NFFT,'whole')

只有'對稱'選項與ifft一起使用時,它的目的是防止您創建的對稱性之間可能存在的小數字錯誤。

+0

非常感謝!我按照你所說的「手動」嘗試了它,並且它工作:)並且它產生與lennon310建議的'whole'完全相同的結果。 – user3015199

0

頻域中的乘法是時域中的循環卷積。爲了擺脫循環卷積僞影,您需要在FFT之前將濾波器響應的長度填充到信號的零點上,鏡像您的頻率響應濾波器,以便它在乘法之前是複共軛對稱的(可能使得兩個矢量長度均爲2N case),然後在IFFT之後,丟棄添加的填充,或者保留它以進行額外的重疊添加/保存處理。

+0

謝謝!我不知道它或多或少是同一件事,但我這樣做了:我用自己填充了我的信號(但是相反):signal = [flipud(signal);信號; flipud(信號)];然後保留輸出的中間部分。這是否正確? – user3015199