Hallo,
ich nehme mit einem ADC(f_ab= 1MHZ) ein periodisches Signal auf und
bekomme so um die 500 Abtastwerte. Diese möchte ich dann mit einer FFT
auswerten.
Die Frequenzauflösung wäre ja dann 2kHZ. Die würde ich gern erhöhen,
dabei bin ich auf das Zero-Padding gestoßen.
Meine Frage nun: Wieviel Nullen darf man denn anhängen, also wo ist da
die Grenze?
Muss ich sonst noch was beachten?
Soweit ich das verstanden habe, kannst du nur so viele Nullen anhängen,
sodass die Gesamtzahl der Samples nicht größer als die Genauigkeit der
FFT ist. Beispielsweise möchtest du eine 1024 FFT machen, hast aber nur
die 500 Abtastwerte. Also kannst du maximal 524 Nullen anhängen. Mehr
würde die FFT dann sowieso nicht ausspucken.
Das ist jetzt vielleicht nicht in jeder Hinsicht exakt korrekt erklärt,
dürfte deine Frage aber erstmal beantworten.
Nik084,
das Zero-padding wurde erfunden, um Messreihen auf ganze 2er-Potenzen zu
erweitern (z.B. von 500 Messpunkten auf 512). Die FFT ist halt auf 2^N
Messwerte angewiesen. Aber! Die FFT hält alles, was man ihr zur Analyse
vorwirft, für echte Messwerte. Entsprechend "sieht" sie, wenn man z.B.
ein periodischen Signal mit Nullen erweitert, ein periodisches Signal
mit Unterbrechung; d.h. das Nutzsignal, multipliziert mit einer
Rechteckfunktion. Entsprechend bekommt man dann als Ergebnis das
Spektrum des periodischen Signals, gefaltet mit dem des
Recheck-Impulses.
Die zusätzliche Auflösung, geht also nicht auf Dein Nutzsignal zurück,
sondern ist, genaugenommen, ein Artefakt. Genausogut könntest Du Dein
Spektrum per Interpolation spreizen. Die Menge an Information, die in
einer Messreihe enthalten ist (grob gesagt die Anzahl binärer Stellen),
wird durch die Fouriertransformation nicht grösser. Bestenfalls bleibt
sie konstant.
mare_crisium
Hi also wie Harald F. schon sagte kriegst du das durch Interpolation hin
und zwar wird dein Spektrum nicht beeinflusst jedoch die Nyquist-Grenze
erhöht sich. Da das Spektrum periodisch ist musst du dann dein
Nutzsignal mit einem Tiefpass filtern.
Gruß
Gamon
Hi,
schonmal danke für die Antworten.
Ok also zeropadding ist wohl die falsche Wahl.
Würde das denn was bringen wenn ich einfach mehrere Perioden des
Nutzsignals aufnehme?
Dann hätte ich ja mehr Abtastwerte, aber die Information würde dadurch
ja auch nicht wirklich steigen.
Ansonsten beschäftige ich mich mal mit Interpolation.
Das Aufaddieren von Einzelsignalen kann die Messung verbessern. Es wird
z.B. bei Pulse-FT-NMR-Spektroskopie oder der FTIR-Spektroskopie gemacht,
um das Signal/Rausch-Verhältnis zu vergrößern.
also nur so mal grundsätzlich dein SNR Wert ist bei dieser Abtastung
wirklich super da brauchst du dir gar keine gedanken zu machen.
Aber eine Frage möchtest du jetzt die Abtastung erhöhen oder die
Frequenz deines Signals?
Hi ...
Also mir hat in der Hinsicht sehr geholfen ... das man sich vorstellt
das die FFT(DFT) eigentlich die DTFT abtastet ... je länger dein Signal
ist desto schmäler wird die Mainlobe in der DTFT, durch anfügen der
Nullen wird die DTFT dann nur noch öfter abgetastet ... was an der
Mainlobebreite nichts ändert. Auch bezgl. Fensterung ist das
Rechteckfenster (das du ja indirekt andwendest) optimal hinsichtlich der
Mainlobebreite.
Was jedoch passiern kann ist, das wenn die Abtastung der DTFT zu gering
ist das zb. bei Ermittlung der Signalfrequenz (Aufgrund des Maximums im
Frequenzbereich) ein Fehler auftritt, weil eben gerade der Abtastpunkt
nicht am Maximum der Sincfunction liegen kann -> deshalb benötigst du
Zeropadding.
.) Um Auflösung zu erhöhen -> mehr Signalinformation
.) Um Frequenzgenaugigkeit zu erhöhen -> Zeropadding
Hab dir auch 2 Plots angehängt (nicht wirklich sehr professionell, ohne
Beschriftung aber sollen ja nur die Auswirkung von Zerropadding zeigen).
Hoffe ich hab dich nicht zu sehr verwirrt :-)
lg Peter
Ja genau der Plot stellt den Betragsfrequenzganz eines Sinussignals dar
(sig=sin(0:0.1:10*pi)) -> deshalb auch die halbe Sincfunktion.
Um den Effekt zu zeigen kann man sich auch einfach die
Fouriertransformierte der Fensterfunktion (Rechteck) anschaun.
Einfaches Programm dazu: (in Matlab)
%%
rect_sig=ones(1,500); % Fensterfunktion -> Signalauschnitt
sig_freq=fft(rect_sig,1024); % Auffüllen auf 1024 Werte -> Zeropadding
sig_freq=fftshift(sig_freq);
plot(sig_freq,'-*')
%%
lg Peter
> Hi also wie Harald F. schon sagte kriegst du das durch Interpolation hin> und zwar wird dein Spektrum nicht beeinflusst
Doch, es wird verändert; oft nur wenig, aber manchmal auch stärker:
Du kannst ja mal einen sinusförmigen Puls von 1 Wellenlänge nehmen, mit
der FFT transformieren und dann unterschiedlich viele Nullen anhängen.
Je nachdem, wieviele Nullen Du anhängst, ändert sich die Frequenz mit
der maximalen Amplitude sehr stark.
Der Grund ist, daß die FFT das periodisierte Signal transformieren will.
Wenn Dein Signal mit Nullen eine Länge hat, die ein Vielfaches einer
Periodendauer ist, wird die richtige Frequenz angezeigt, sonst eine
falsche.
Gruß,
Michael
Michael Lenz schrieb:> Beitrag melden | Bearbeiten | Löschen | MarMichael Lenz schrieb:>> Hi also wie Harald F. schon sagte kriegst du das durch Interpolation hin>> und zwar wird dein Spektrum nicht beeinflusst> Doch, es wird verändert; oft nur wenig, aber manchmal auch stärker:>> Du kannst ja mal einen sinusförmigen Puls von 1 Wellenlänge nehmen, mit> der FFT transformieren und dann unterschiedlich viele Nullen anhängen.> Je nachdem, wieviele Nullen Du anhängst, ändert sich die Frequenz mit> der maximalen Amplitude sehr stark.>> Der Grund ist, daß die FFT das periodisierte Signal transformieren will.> Wenn Dein Signal mit Nullen eine Länge hat, die ein Vielfaches einer> Periodendauer ist, wird die richtige Frequenz angezeigt, sonst eine> falsche.>>>> Gruß,> Michael
Das nennt man leakage-effect - dein Spektrum "läuft" aus. Wikipedia
zeigt das sehr schön:
http://de.wikipedia.org/wiki/Leck-Effekt
Bei Bilddatenkompressionen, die mit ähnlichen Faltungsalgorithmen
arbeiten, z. B. Wavelet (SPIHT, JPEG-2000), wird vor der Transformation
(2-D-Faltung) der Bildinhalt zur Aufrundung auf die erforderlichen n x
2^m (m = wave-levels) an beiden Bildrändern (rechts und unten)
gespiegelt, nicht gepadded.
Bei 500 Messwerten würde man dann a[500] = a[498], a[501] = a[497] etc.
setzen, um auf 512 zu kommen.
Das Spiegeln hat weniger Einfluss auf das Kompressionsergebnis
(erzielbarer Kompressionsfaktor für verlustfreie Kompression) als es das
Anhängen von Nullen hätte.
Zur reinen Frequenzanalyse hingegen weiß ich nicht, ob hier Spiegeln
ggf. nicht auch besser wäre, als Nullen anzuhängen.