Hallo zusammen!
Ich habe eine ziemlich grundlegende Frage bzgl. FFT/IFFT in Matlab. Hab
dazu schon sämtlich Foren durchsucht, werde aber einfach nicht schlau
draus, vielleicht könnt ihr mir helfen.
Mein Ziel ist es eine wave-Datei in Matlab einzulesen, mit einer FFT zu
transformieren, darauf einen Brickwall-Filter anzuwenden (also alle
nicht gewünschten Frequenzen=0 zu setzen) und mittels IFFT wieder das
Zeitsignal zu erhalten.
Dazu hab ich mir erstmal mit einem einfachen Sinus rangetastet und stoß
da leider schon an meine Grenzen...
1
Nfft=1024;%AnzahlAbtastwerte
2
fa=20000;%Abtastfrequenz
3
t=(0:(Nfft-1))/fa;%Zeitachse
4
5
%Sinuserzeugen
6
f=1000;%Sinus-Frequenz
7
y=sin(2*pi*f*t);%Sinus
8
subplot(3,1,1)
9
plot(t,y)
10
title('orginalSinus')
11
12
%FFTanwenden
13
freq=abs(fft(y));
14
subplot(3,1,2)
15
plot(fa*(0:(Nfft/2-1))/Nfft,freq(1:Nfft/2))
16
title('FFTvomSinus')
17
18
%IFFTanwenden
19
N=[freq(1:513)conj(fliplr(freq(2:512)))];
20
x=ifft(N);
21
subplot(3,1,3)
22
plot(x)
23
title('orginalSinusrücktransformiert')
Unklar ist mir, wieso
1) Der Dirac nicht sauber bei 1000Hz erscheint
2) Die Amplitude beim zurücktransformierten Signal schwankt (hängt ja
evtl. mit dem "unsauberen" Dirac zusammen?)
Wahrscheinlich wird der Beitrag bei vielen Experten für Kopfschütteln
sorgen, aber ich bin über jede Hilfestelle froh :)
Gruß, Frederik
Hallo Frederik,
zu deiner ersten Frage: bei dir tritt der Leckeffekt auf. Der Grund
dafür ist, dass deine Signalfrequenz fs = 1000 Hz nicht eine der
Analysefrequenzen der FFT entspricht. Die Analysefrequenzen berechnen
sich mit f = k*fs/N, N = Ordnung der FFT.
zu deiner zweiten Frage: Du bekommst nicht das Originalsignal nach der
iFFT da du nach der FFT sofort den Betrag nimmst. Dadurch ist die
folgende Zeile flasch: N = [freq(1:513) conj(fliplr(freq(2:512)))];
Wenn du den Betrag vorher nicht nehmen würdest wäre es richtig.
Grüße,
Enrico
Hallo Encrio,
danke für die schnelle Antwort! Punkt 1 ist mir jetzt klar ... deine
Begründung bei Punkt 2 auch, aber es scheitert leider an der
Durchführung.
Ich poste hier mal kurz meinen Code für den Brickwall-Filter, vielleicht
siehst du ja den Fehler:
Hallo,
Das ist wohl wieder auf den Leckeffekt zurückzuführen. Wenn du die
Bandbreite des Filters vergrößerst, wirst du merken das der
rekonstruierte Sinus immer besser aussieht. Der Grund dafür ist die FFT,
die im Bezug auf den Leckeffekt eine äußerst schlechte Transformation
ist. Der Leckeffekt sorgt dafür, dass die Signalenergie über einen
breiten Spektralbereich verstreut wird. Das ist auch in deinem Beispiel
der Fall. Wenn du dann mittels dem Filter bestimmte Frequenzanteile auf
Null setzt, gehen somit einzelne Komponenten verloren.
Versuche doch einfach mal einen Sinus mit der Frequenz 996.0938 Hz, die
liegt genau auf deinem DFT-Raster. Du wirst merken, dass der Effekt dann
nicht mehr auftritt.
Gruß,
Enrico