MATLAB: filter im Frequenzbereich mit FFT/IFFT mit einem IIR-filter
Ich versuche zu filtern, einen (echten) signal in Matlab unter Verwendung der FFT und die inverse FFT (IFFT). Ich habe ein IIR-filter (Koeffizienten 'b' und 'a'). Ich erwarte (ungefähr?) das gleiche Ergebnis, als hätte ich es einfach getan:
filteredSignal = filter(b,a,signal);
Also das ist, was ich getan habe:
NFFT = length(signal);
FFTsignal = fft(signal, NFFT);
FilterFreqResponse = freqz(b,a,NFFT);
FFTfilteredSignal = FFTsignal .* FilterFreqResponse;
filteredSignal = ifft(FFTfilteredSignal, NFFT);
Und das problem hier ist, dass das resultierende signal (filteredSignal
) ist Komplex. Und ich hätte gerne ein richtiges signal (wie mein input-signal). Die filter
Funktion gibt auch ein richtiges signal. So... was mache ich falsch? Ist es unmöglich zu verwenden, FFT-basierte Filterung mit einem IIR-filter? Ich meine: der Frequenzgang meiner filter ist nicht symmetrisch mit Bezug auf den Ursprung, also das Spektrum meiner gefilterte signal wird nicht symmetrisch sein, weder... also das gefilterte signal im Zeitbereich kann nicht real sein...?
PS: gibt es ein "symmetrisches" - option in der ifft-Funktion:
filteredSignal = ifft(FFTfilteredSignal, NFFT, 'symmetric');
Wenn ich das mache, die filteredSignal ist jetzt real... aber ist deutlich unterschiedlich (in amplitude und phase) von der, die ich bekommen über den "filter" - Funktion direkt. Und dieses "symmetrischen" option anscheinend verwirft den imaginären Teil oder etwas ähnliches, so dass es wahrscheinlich nicht eine gute Idee, es zu benutzen, denke ich....
Vielen Dank im Voraus! (und sorry für mein Englisch)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
FilterFreqResponse
ausgewertet, beiNFFT
Punkte in gleichem Abstand um nur die Obere Hälfte des Einheitskreises. Haben Sie versucht, dieFilterFreqResponse = freqz(b,a,NFFT,'whole')
?Ist es falsch, nur den reellen Teil des Ergebnisses,
dem Grund, dass Ihre Antwort ist Komplex, ist, dass die point-wise multiplication wurde nicht durchgeführt symmetrisch: d.h. für die Antwort auf den Sinn der Vektor FilterResponse ist symmetrisch um Ihr Zentrum element. Bauen Sie die Filter-Resonanz nur bis Fs/2 (also eine kleinere vector) und dann schreiben einige Logik anwenden, konjugiert-symmetrisch um die spiegelfrequenzen. Alternativ Matlab kann dies für Sie automatisch über:
FilterFreqResponse = freqz(b,a,NFFT,'whole')
Nur dann sollte die Option "symmetrisch" - option verwendet werden, mit ifft, da es sein Zweck ist zu verhindern, dass die kleine numerische Fehler, die bestehen zwischen der Symmetrie die Sie erstellt haben.
Verwenden Sie den Realteil der inversen FFT:
Multiplikation im Frequenzbereich ist die circular convolution in the time domain. Um loszuwerden circular convolution Artefakte, die Sie brauchen würde, um null-pad das signal durch die Länge des filter-Antwort, bevor die FFT, Spiegel Ihrer Frequenzgang-filter, so dass es Komplex ist konjugiert symmetrisch vor Multiplikation (vielleicht macht beiden Vektoren der Länge 2N in Ihrem Fall), dann nach der IFFT, wegwerfen, die zusätzlicher Polsterung, oder halten Sie es für zusätzliche overlap add/save-Verarbeitung.