Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT/IFFT Problem in Matlab


von Frederik (Gast)


Angehängte Dateien:

Lesenswert?

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

von Enrico (Gast)


Lesenswert?

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

von Frederik (Gast)


Lesenswert?

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...

von Enrico (Gast)


Lesenswert?

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

von Frederik (Gast)


Lesenswert?

Hallo Enrico,

du hattest natürlich Recht, jetzt scheint der Filter das zu machen was 
ich wollte!
Danke für deine Hilfe!

Gruß, Frederik

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.