Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT Blocklänge Verständissfrage Matlab


von Gout (Gast)



Lesenswert?

allo Zusammen,
einmal eine Frage an die FFT experten.
Anbei einmal der FFT Code, damit ihr micht nicht
auspeitscht.

Code:
Y = fftshift(abs(fft(vRecSignal,iNfft)));


Nun zu meiner Frage, ich habe mal drei Screenshots angehangen. Alle sind 
ein Sinus mit 5 kHz und 44,1 kHz abtastrate. iNfft ist einmal 100 Hz 
einmal 1kHz und einmal 10 kHz. Nun Verändert sich die FFT recht Stark 
durch iNfft verändert. Ich hab nur keine Ahnung warum. Die

Hat da jemand eine Idee?

Soweit ich weiß ist es ja so, wenn iNfft länger mache als  vRecSignal 
(Ist in diesem Fall 100) dann wird mir nullen Aufgefüllt. Wie kommt es 
dann das hier in den Bildern die FFT so aussieht als würde sie 
Schwingen.

von Al3ko -. (al3ko)


Lesenswert?

Gout schrieb:
> Anbei einmal der FFT Code, damit ihr micht nicht
> auspeitscht.

Das ist nur ein Teil des Codes. Der Rest des Codes ist als Text 
beschrieben.

Gruß,

von Gout (Gast)


Lesenswert?

So, einmal der Code bzw. der "spannende" Teil.
Den eigentlich wichtigen teil hab ich aber oben schon raus gesucht.


iNum  = get(handles.popupmenu1,'Value');
switch iNum
  case 1
    iSamplFreq = 4000;
  case 2
    iSamplFreq = 8000;
  case 3
    iSamplFreq = 11025;
  case 4
    iSamplFreq = 22050;
  case 5
    iSamplFreq = 44100;
end
iNoSampl      = str2num( get(handles.edit1,'String') );
iSourceInput  = get(handles.popupmenu2,'Value');
switch iSourceInput
  case 1
    oRecAudio   = audiorecorder(iSamplFreq,16,1);
    record(oRecAudio,iNoSampl/iSamplFreq);
    pause(iNoSampl/iSamplFreq*1.1+0.5);
    vRecSignal  = getaudiodata(oRecAudio);
    sInput      = 'Micro';
  case 2
    fFreq       = str2num(get(handles.edit4,'String'));
    vRecSignal  = 0.2*sin(2*pi*fFreq*[0:iNoSampl-1]/iSamplFreq);
    sInput      = 'Sin';
  case 3
    fFreq       = str2num(get(handles.edit4,'String'));
    vRecSignal  = 0.2*square(2*pi*fFreq*[0:iNoSampl-1]/iSamplFreq);
    sInput      = 'Square';
  case 4
    fFreq       = str2num(get(handles.edit4,'String'));
    vRecSignal  = 
0.2*sawtooth(2*pi*fFreq*[0:iNoSampl-1]/iSamplFreq,0.5);
    sInput      = 'Triangle';
  case 5
    fFreq       = str2num(get(handles.edit4,'String'));
    vRecSignal  = 
0.2*chirp([0:iNoSampl-1]/iSamplFreq,200,(iNoSampl-1)/iSamplFreq,fFreq);
    sInput      = 'Chirp';
  case 6
    vRecSignal  = 0.2*randn(1,iNoSampl);
    sInput      = 'AWGN';
  case 8
    fFreq       = str2num(get(handles.edit4,'String'));
    sInput      = 'Modulated pulse';
    vRecSignal  = 
0.2*(square(2*pi/10e-3*[0:iNoSampl-1]/iSamplFreq)>0).*...
      cos(2*pi*fFreq*[0:iNoSampl-1]/iSamplFreq);
end
save Data vRecSignal iNoSampl iSamplFreq sInput;
plot_time_signal(hObject, eventdata, handles);





function pushbutton2_Callback(hObject, eventdata, handles)

load Data;
axes(handles.axes2);
iNfft = str2num(get(handles.edit2,'String'));
Y = fftshift(abs(fft(vRecSignal,iNfft)));
f = [-iSamplFreq/2:iSamplFreq/iNfft:iSamplFreq/2-iSamplFreq/iNfft];
axis([min(f),max(f),min(Y(:)),max(Y(:))]);
plot(f,Y);
xlabel('Frequency [Hz]');
ylabel('Amplitude');
grid on;
zoom on;
[dummy,iInd] = max(Y(end/2+1+1:end));
set(handles.edit3,'String',int2str(iInd*iSamplFreq/iNfft));

von Lukas (Gast)


Lesenswert?

Du hast im Zeitbereich eine Multiplikation mit einer Rechteckfunktion. 
Dies entspricht im Frequenzbereich einer Faltung mit einer 
Sinc-Funktion. Das ist letztlich was du da siehst.

Was erhoffst du dir durch das auffüllen mit Nullen des Zeitsignals? 
Dadurch errechnest du das Spektrum einer Periodischen Funktion die 
zyklisch zwischen deinem Sinus und 0 wechselt.

von Daniel (Gast)


Lesenswert?

Was Lukas sagen will ist:
Wenn du nicht willst, dass es wie ein Sinc aussieht, musst du eine 
andere Fensterfunktion (momentan keine = Rechteck) nehmen.

von Gout (Gast)


Lesenswert?

Hallo Und danke für die Antwort.

Jetzt mal ne kurze Frage, wenn ich den Sinus
nun so Anpasse, das er bei Null Startet und bei Null endet
(Also Quasi eine Genaue Periode) müsste das Fenstern doch Überflüssig 
sein oder?
Man Fenstert ja nur weil intern Matlab bei einer FFT den Sinus so wie 
der vorkommt wieder nimmt und den Sinus dann fortsetzt?


So und jetzt zu euren Fragen,
naja es ist einfach ne Aufgabe:
 Erzeuge einen Sinus mit Frequenzz 5kHz und einer Abtastfrequenz von 
44.1 kHz, mit 100 Abtastwerten.
Führe eine FFT mit 100, 1000 und 10000 durch und Interpretiere das 
ergebnis.


Der Quellcode den ihr oben seht ist aus vroherigen aufgaben immer mehr 
enstanden und so bin ich jetzt beim Interpretieren und komme nicht 
weiter.

von Gout (Gast)


Angehängte Dateien:

Lesenswert?

Achso,
hab ich also richtig verstanden das mit Nullen aufgefült wird?
Ich seh halt das gleiche Ergebnis selbst wenn ich genau eine Periode 
abschneide und viel höher Abtaste. Also Quasi keine "Ecken" mehr im 
Sinus habe.
Da wäre das Rechte Winkel der die Sign Funktionen verursacht durch das 
zero Padding quasi am Ende und am Anfang der Sinus Funktion.


Ich hab es mal versucht dazustellen, in der mitte ist ein Sinus,
erkennt man halt nicht weil da ich Links un Rechts 4500 Nullen eingefügt 
habe. Und man siehe da, ich kriege das Gleiche ergebnis.

Grüße
Gout

von Lukas (Gast)


Lesenswert?

siehst du denn bei den 1000 oder 10000 noch einen Unterschied?

Was durch das Zero-padding im Zeitbereich passiert, ist das das Spektrum 
interpoliert wird. Durch die FFT mit 100, 1000 oder 10000 änderst du 
hier nichts an deinem 100 Punkte Rechteckfensters. Und das Spektrum 
dieses Fensters siehst du bei mehr FFT-Punkten feiner aufgelöst. Die 
Frequenzauflösung deines Nutzsignals wird dadurch jedoch nicht 
verbessert.

Wenn dein Fenster genau in N Perioden deines Nutzsignals passt, sind die 
FFT-Bins in den Nullstellen der sinc-Funktion des Fensters.

von Pandur S. (jetztnicht)


Lesenswert?

Irgendwie scheint der Unterschied zwischen Fourier Reihe und Fourier 
Transformierten, sowie Fourier Transformation und FFT nicht angekommen 
zu sein.

Eine periodische Funktion ergibt eine Fourier Reihe, eine Funktion 
bestehend aus einzelnen Linien. Waehrend die Fouriertransformierte einer 
nicht periodischen Funktion, zb zB aus einzelnen Pulsen, eine 
kontinuierliche Funktion ist.

Die Fouriertransformation hat ein paar Randbedingungen. zB muss das 
Signal gegen unendlich schneller abfallen wie jede Potenz. Daraus gilt 
dann, dass die Fourierreihe kein Output der Fouriertransformation ist.

Die FFT ist dann eine gesampelte abgespeckte Version, mit zusaetzlichen 
Randbedingungen.

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.