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

Matlab-Low-Pass-filter mit fft

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.
Schreibe einen Kommentar