FFT/IFFT Problem in Matlab

Gast #2876166
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; % Anzahl Abtastwerte
2
fa=20000; % Abtastfrequenz
3
t=(0:(Nfft-1))/fa; % Zeitachse
4

5
% Sinus erzeugen
6
f =1000;    % Sinus-Frequenz
7
y=sin(2*pi*f*t); % Sinus
8
subplot(3,1,1)
9
plot(t,y)
10
title('orginal Sinus')
11

12
% FFT anwenden
13
freq=abs(fft(y));
14
subplot(3,1,2)
15
plot(fa*(0:(Nfft/2-1))/Nfft,freq(1:Nfft/2))
16
title('FFT vom Sinus')
17

18
% IFFT anwenden
19
N = [freq(1:513) conj(fliplr(freq(2:512)))];
20
x = ifft(N);
21
subplot(3,1,3)
22
plot(x)
23
title('orginal Sinus rü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
Angehängte Dateien:
Gast
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
Gast
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:
1
Nfft = 1024; % Anzahl Abtastwerte
2
fa=20000; % Abtastfrequenz
3
t=(0:(Nfft-1))/fa; % Zeitachse
4

5
% Sinus erzeugen
6
f=1000;    % Sinus-Frequenz
7
y=sin(2*pi*f*t); % Sinus
8
subplot(4,1,1)
9
plot(t,y)
10
title('orginal Sinus')
11

12
% verrauschtes Signal
13
s=y+n;
14
subplot(4,1,2)
15
plot(t,s)
16
title('verrauschtes Signal')
17

18
% FFT gefiltert
19
mittenfrequenz=1000;
20
bandbreite=100;
21
filt=fft(s);
22
% Grenzen für Brickwallfilter
23
low1=floor((mittenfrequenz-bandbreite/2)*Nfft/fa);
24
high1=ceil((mittenfrequenz+bandbreite/2)*Nfft/fa) ;
25
low2=floor(Nfft-(mittenfrequenz+bandbreite/2)/(fa/2)*(Nfft/2)); 
26
high2=ceil(Nfft-(mittenfrequenz-bandbreite/2)/(fa/2)*(Nfft/2)); 
27
filt(1:low1)=0;
28
filt(high1:low2)=0;
29
filt(high2:end)=0;
30
subplot(4,1,3)
31
plot(fa * (0:(Nfft/2-1)) / Nfft,filt(1:Nfft/2))
32
title('FFT gefiltert')
33

34
% gefiltert Rücktransformiert
35
filt_zeit=ifft(filt);
36
subplot(4,1,4)
37
plot(t,filt_zeit)
38
title('gefilterter Sinus rücktransformiert')

Die Amplitude schwankt leider immmer noch...
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.