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.
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ß,
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));
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.
Was Lukas sagen will ist: Wenn du nicht willst, dass es wie ein Sinc aussieht, musst du eine andere Fensterfunktion (momentan keine = Rechteck) nehmen.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.