Matlab filtre Passe-Bas à l'aide de la fft

J'ai mis en place un simple filtre passe-bas dans matlab à l'aide d'un en avant et en arrière de la fft.
Il fonctionne sur le principe, mais le minimum et le maximum des valeurs de différer de l'original.

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;

l'image qui en résulte ressemble à ceci

Matlab filtre Passe-Bas à l'aide de la fft

Ce que je fais mal? Si je normaliser à la fois les données du signal filtré semble correct.

votre filtre doit être symétrique que le signal est. pourquoi attendez-vous min et max à ne pas changer? il n'y a aucune raison de le faire.
Notez que d'essayer d'appliquer un "mur de briques" filtre comme ceci dans le domaine de fréquence produira méchant artefacts - vous besoin d'utiliser une fonction lisse dans le domaine des fréquences (typiquement une fonction de fenêtre). Notez également que votre filtre de gain n'est pas normalisée, et comme @thang notes, votre filtre doit être symétrique, sinon vous obtiendrez complexe domaine de temps de sortie de données.

OriginalL'auteur Matthias Pospiech | 2015-03-02