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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Gout (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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 Joggel E. (jetztnicht)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.