Matlab-Low-Pass-filter mit fft
Ich implementiert einen einfachen low-pass-filter in matlab mit Hilfe einer vorwärts-und rückwärts-fft.
Es funktioniert im Prinzip, aber die minimum-und maximum-Werte vom original unterscheiden.
signal = data;
%% fourier spectrum
% number of elements in fft
NFFT = 1024;
% fft of data
Y = fft(signal,NFFT)/L;
% plot(freq_spectrum)
%% apply filter
fullw = zeros(1, numel(Y));
fullw( 1 : 20 ) = 1;
filteredData = Y.*fullw;
%% invers fft
iY = ifft(filteredData,NFFT);
% amplitude is in abs part
fY = abs(iY);
% use only the length of the original data
fY = fY(1:numel(signal));
filteredSignal = fY * NFFT; % correct maximum
clf; hold on;
plot(signal, 'g-')
plot(filteredSignal ,'b-')
hold off;
das resultierende Bild sieht aus wie diese
Was mache ich falsch? Wenn ich Normalisiere beide Daten die gefilterte signal korrekt aussieht.
- Ihr filter muss symmetrisch sein, wie das signal ist. warum erwarten Sie, dass min und max nicht zu ändern? es gibt keinen Grund zu.
- Beachten Sie, dass man versucht, eine "ziegelwand" - filter, wie dies in der Frequenz-Domäne produzieren unschöne Artefakte - Sie brauchen, um eine glatte Funktion in den Frequenzbereich (in der Regel ein-Fenster-Funktion). Beachten Sie auch, dass Ihre filter-gain ist nicht normiert, und wie @thang Noten der filter sollte symmetrisch sein, sonst hat man komplexe time-domain-output-Daten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nur um uns zu erinnern, wie MATLAB speichert die Frequenzen für
Y = fft(y,N)
:Y(1)
ist der Konstante offsetY(2:N/2 + 1)
ist die Menge der positiven FrequenzenY(N/2 + 2:end)
ist die Menge der negativen Frequenzen... (normalerweise würden wir dieses Grundstück Links der vertikalen Achse)Um eine echte low-pass-filter, die wir erhalten müssen sowohl die niedrigen positiven Frequenzen und die niedrigen negative Frequenzen.
Hier ist ein Beispiel, dies zu tun mit einem multiplikativen Rechteck-filter in der Frequenz-Domäne, wie Sie getan haben:
Den vollen low-pass-fitler macht einen besseren job, aber Sie werden feststellen, dass der Wiederaufbau ist ein bisschen "wellig". Dies ist da die Multiplikation mit einem Rechteck-Funktion in der Frequenz-Domäne ist das gleiche wie ein Faltung mit einer sinc-Funktion im Zeitbereich. Faltung mit einer sinc-Funktion ersetzt jeden Punkt mit einer sehr ungleichen gewichteten Durchschnitt seiner Nachbarn, also die "wave" - Effekt.
Einem Gauß-filter hat schönere low-pass-filter-Eigenschaften, da die fourier-Transformation einer Gauß-eine Gauß. Eine Gauß-Zerfälle auf null schön, so dass es nicht weit entfernten Nachbarn, die in den gewichteten Durchschnitt der während der Faltung. Hier ist ein Beispiel mit einem Gauß-filter Erhaltung der positiven und negativen Frequenzen:
Wie Sie sehen können, ist die Rekonstruktion wird auf diese Weise viel besser.