Forum: Digitale Signalverarbeitung / DSP / Machine Learning Vorteil von Abrundung des FFT Fensters und Zeropadding?


von FFT-Anfänger (Gast)


Lesenswert?

Hi,

ich würde gerne die Frequenz eines ca. 3 Hz Signals ermitteln und dafür 
ggf. eine FFT verwenden.

Die Abtastfrequenz liegt bei ca. 50Hz.
Ich wollte dafür wohl 512 Abtastpunkte nehmen, so dass etwas mehr als 10 
Perioden des Signals betrachtet werden würden.

Eine Frage nun dazu: Ich habe mal gehört, dass es sich lohnt, die Ränder 
des Fenstern "abgerundet" zu gestalten, so dass der erste Messwert und 
der letzte Messwert Null wird, also so ähnlich als würde man die 
Funktion mit einem DreieickFenster multiplizieren.

Welchen Zweck besitzt so ein Vorgehen? Wo sind die Vorteile?

Vereinfacht sich die Berechnung, wenn man nur die mitleren Datenpunkte 
von 129 bis 385 nutzt, und die anderen duch Null ersetzt? (ich glaube so 
etwas nennt man ZeroPadding, wo wieviel Genauigkeit büßt so ein Vorgehen 
ein und um wieviel reduziert man den Berechnungsaufwand?

mfg und vielen Dank

: Verschoben durch Admin
von Werner (Gast)


Lesenswert?

Wenn du einen Ausschnitt von 512 Samples aus deinem Signal 
transformierst, bekommst du die Faltung von diesem 512 Punkte Rechneck 
mit deinem Nutzsignal. Schau dir die FFT von einem Rechteck an. Das 
willst du nicht wirklich in deinem Spektrum um jede Spektrallinie sehen.

Guck mal hier:
http://de.wikipedia.org/wiki/Fensterfunktion#Beispiele_von_Fensterfunktionen

von FFT-Anfänger (Gast)


Lesenswert?

Das heisst, wenn ich die Seitenbereiche meines 512-Punkte Fensters 
abflache, dann werde ich die tatsächlich enthaltene Frequenz von ca. 3Hz 
deutlicher erkennen können, als wenn ich nur einen scharfen Cutt-setze, 
ist das richtig?

von Karel M. (marsalek)


Lesenswert?

Das mit FFT berechnete Spektrum ist Spektrum eines periodischen Signals, 
wessen eine Periode Du als Input (Deine 512 Samples) genommen hast.

Bei Fsampling = 50 Hz, Fsignal = 3 Hz und N = 512 bekommst Du gerade 
16,7 Perioden Deines Nutzsignals. Und das berechnete Spektrum ist 
Spektrum von diesen 16,7 Sinusoiden, die sich undendlich wiederholen, 
auch mit dem Knick in der 17. Periode. Durch die "Windows" glättest Du 
Anfang und Ende des Signals, wodurch weniger "Mist" im berechneten 
Spektrum entsteht.

Die Frequenz-Auflösung wird dann 50 Hz/512 = ca. 0,1 Hz sein.

Karel

von FFT-Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

hm ok,

Wie muss ich mir denn die Ausgabe so eines Spektrum vorstellen?

Mein uC berechnet mir für jede Frequenz einen Wert und packt diesen Wert 
in ein Fach. Das Fach, wo am Ende am meisten drin liegt, zeigt mir an 
welches die dominierende Frequenz gewesen ist, richtig?

Bei einer Frequenzauflösung von 0,1 müssten bei einer Signalfrequenz von 
ca. 3Hz dann in dem 30. Fach das Naximum auftauchen? ist das richtig?

Ich habe mal ein paar Daten aufgenommen und der Einfachheit halber 
erstmal einen halben Sinus als Fensterfunktion rübermultipliziert.

Wie müsst eich mir nun den digitalen Output eines uC vorstellen?
Vielleicht mag einer von euch mal rein qualitativ einzeichnen, wie das 
Ergebnis so einer FFF aussehen würde?

mfg und schonmal ein dickes Danke für die bisherige Hilfe

von Anja (Gast)


Lesenswert?

FFT-Anfänger schrieb:
> Ich habe mal ein paar Daten aufgenommen und der Einfachheit halber
> erstmal einen halben Sinus als Fensterfunktion rübermultipliziert.

Mhm, ich würde erst den Gleichspannungsoffset eliminieren.

Gruß Anja

von Purzel H. (hacky)


Lesenswert?

>ich würde gerne die Frequenz eines ca. 3 Hz Signals ermitteln und dafür
ggf. eine FFT verwenden.

Das ist overkill. Eine FFT bedeutet in dieser konfiguration, das signal 
wird mit saemtlichen Frequenzen in 0.1Hz Abstand bis 50Hz mutipliziert.
Das Resultat ist ein Spektrum. Wenn nur die 3Hz interessieren, sollte 
man auch nur das rechnen, ausser man beliebig zuviel Rechenpower. Und 
beliebig zuwenig Ahnung.

von Karel M. (marsalek)


Lesenswert?

Anja schrieb:

> Mhm, ich würde erst den Gleichspannungsoffset eliminieren.
>
> Gruß Anja

Isch auch :-)

Karel

von FFT-Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

ok,

ich habe nun von den Ursprungsdaten das Minimum ermittelt und dieses von 
allen Werten subtrahiert, so dass nur noch der AC-Anteil vorhanden ist.

Das daraus resuliterende Signal habe ich jetzt nochmal mit einem halben 
Sinus multipliziert und dabei das Bild aus dem Anhang erhalten.


Nochmal die Frage:
Wie würde qualitativ das Spektrum aussehen?

Mein uC füllt bei dem Durchlaufen einer 512 Punkte FFT ein Array mit 512 
Einträgen? richtig?
Eintrag Null wäre dann ca. 0,1 Hz und Eintrag 50 wäre ca. 51,2Hz ?

Ist das korrekt?



@Delta Oschi:
Wieso ist es der Overkill? Das Signal sieht überaus verwackelt aus, wie 
den Aufnahmen zu entnehmen ist. Eine Suche nach den Hoch- und 
Tiefpunkten wird schwierig, zumindest ebenfalls nur mit erhebblichem 
Rechenaufwand verbunden sein.

von Daniel (Gast)


Lesenswert?

Mit einer Fensterfunktion zu multiplizieren bedeutet das Spektrum mit 
dem Spektrum der Fensterfunktion zu falten. Bei einem Flat-Top Fenster 
wird das z.B. ausgenutzt, um die Amplitude eines Signals herauszufinden 
ohne sicherstellen zu müssen, dass die Frequenz genau in einen FFT Bin 
fällt.

Da du aber an der genauen Frequenz interessiert bist, willst du ein 
Fenster haben, das ein sehr schmales Spektrum hat. Wenn das Signal ein 
reiner Sinus ohne Störsignale ist, spricht nichts gegen ein 
Rechteckfenster. Die Frequenz kann genauer bestimmt werden, wenn man 
sich die Nachbarn des Maximums im Spektrum anguckt.

von FFT-Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

Also ich meinte eigentlich nicht, ein Sinusfenster wie bei einer Faltung 
über alle Werte hinüberzuschieben, sondern es nur mittig einmal mit der 
Funktion zu multiplizieren, so wie den Abbildungen zu entnehmen ist.
...oder ist soetwas sinnfrei?


Ich habe mal die Ergebnisse von Matlab ausrechnen lassen, kann aber Mit 
den Spektren irgendwie nichts anfangen.


Der Code sieht wie folgt aus:
y=[...hier 512 Elemente ]';

subplot(2,1,1)
plot(y,':r');

z = fft(y,512)

subplot(2,1,2)

plot(z,'.b')


Ich habe das viermal für meine Eingangsdaten gemacht, wobei ich diese im 
ersten Veruch unbehandelt liess, im zweiten nur den DC-Anteil entfertn 
habe, im dritten die unbehandelten Daten mit einem Sinus multipliziert 
und im vierten die vom Gleichanteil entfernten Daten mit einem Sinus 
multipliziert hatte.

Alle vier Ergebnisse sind der Abbildung zu entnehmen.

Was ich dabei nciht verstehe:
Warum streckt Mir MATLAB meine X-Achse auf mehrere 10tausend Elemente? 
Ich hatte gehofft, dass dort nur 512 Stück auftauchen würden. Wie muss 
also der Matlabcode modifiziert werden?

von Daniel (Gast)


Lesenswert?

FFT-Anfänger schrieb:
> Also ich meinte eigentlich nicht, ein Sinusfenster wie bei einer Faltung
> über alle Werte hinüberzuschieben, sondern es nur mittig einmal mit der
> Funktion zu multiplizieren, so wie den Abbildungen zu entnehmen ist.

Das meinte ich auch so.

Lass es mich anders ausdrücken:
Mit einer Fensterfunktion zu multiplizieren ist äquivalent dazu Spektrum 
mit dem Spektrum der Fensterfunktion zu falten.


> im zweiten nur den DC-Anteil entfertn habe,

Das ist bei einer FFT sinnfrei, außer du arbeitest mit Fließkommazahlen 
und DC-Anteil >> AC-Anteil. Der gesammte DC-Anteil landet im FFT Bin 0, 
den du nicht anguckst, wenn du dich für 3kHz interessierst.

von Daniel (Gast)


Lesenswert?

Ah, jetzt verstehe ich die blauen Diagramme.
Da ist für jeden FFT Wert ein Punkt in der komplexen Ebene 
eingezeichnet, also für jedes z[k] ein Punkt bei (Re{z[k]}, Im{z[k]}).
Daraus kann man die Frequenz nicht mehr ablesen.
Du brauchst ein Diagramm das Punkte bei (k, abs(z[k])) hat.

von FFT-Anfänger (Gast)


Lesenswert?

...also ich bin mehr und mehr verwirrt.

Also nochmal von vorne:

ich möchte die Frequenz eines sehr sehr niederfrequenten Signals 
ermitteln. Es ist im Bereich von ca. 3Hz (nicht drei khz).

Es ist mit ca. 50Hz abgetastet. Ich möchte die FFT aus 512 Werten 
ermitteln.


Euren Ausführungen nach bringt es nun doch nichts? diese Daten zum Rand 
hin abflachen zu lassen und auch die Entfernung des DCs ist eher 
unwichtig, könnte höchstens Relevanz haben, wenn die Zahlen sehr groß 
werden und der DC im Verhältnis zum AC groß ist. richtig?


Wie sieht so ein Spektrum nun aus?
es gibt 512 Fächer. Ist die Frequenz "0" nun im 256-ten Fach, oder ist 
sie im 0-ten Fach zu suchen?

mfg

von FFT-Anfänger (Gast)


Lesenswert?

aaaah, ok der Hinweis mit den Abolutwerten brgint mich weiter.

Ich habe schon etwas schickere Ausgaben und zeige sie gleich mal, etwas 
Geduld

von FFT-Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

so,

hab den MatlabCode nun angepasst:

y=[512 Werte]';

subplot(2,1,1)
plot(y,':r');
hold on
%plot(y,':g');
hold off

z = fft(y,512) %,y);
z=abs(z)/1000

subplot(2,1,2)
plot(z(2:1:85),'.b')


Ich sehe nun ein Maximum bei ca. dem 13. / 14. Eintrrag.

Nun erhalte ich meine Frequenz mit der Frequenzauflösung * 14. richtig?

von Daniel (Gast)


Lesenswert?

Ja, nur dass das eher nach 1,4Hz aussieht.
Würde auch zum roten Diagramm passen, wo knapp drei Perioden in 100 
Samples sind.

von Karel M. (marsalek)


Lesenswert?

Hallo, das Eliminieren vom Gleichspannungsoffset ist noch nicht OK. Das 
resultierende Signal muss danach Mittelwert von 0 haben. D.h. Du 
müsstest von jedem Sample den Mittelwert aller 512 Samples abziehen, 
wenn ich mich nicht irre ;-)

Und Deine 512 Ausgangswerte...? Spektrum eines diskreten realen Signals 
ist nur bis Fsampling/2 "sinnvoll", um Fsampling/2 ist es gespiegelt und 
um Fsampling periodisch. Deine 512 Werte sind dann entweder komplexe 
Zahlen (Real + Imag) oder Amplitude und Phase für Frequenzen 0 bis 
Fsampling/2.

Was genau Deine Output-Werte bedeuten, muss Du in der Beschreibung der 
Routine finden.

Karel

von Daniel (Gast)


Lesenswert?

Karel Marsalek schrieb:
> Das resultierende Signal muss danach Mittelwert von 0 haben.

Wozu?

> Und Deine 512 Ausgangswerte...? Spektrum eines diskreten realen Signals
> ist nur bis Fsampling/2 "sinnvoll", um Fsampling/2 ist es gespiegelt und
> um Fsampling periodisch. Deine 512 Werte sind dann entweder komplexe
> Zahlen (Real + Imag) oder Amplitude und Phase für Frequenzen 0 bis
> Fsampling/2.

Matlab liefert 512 komplexe Ausgangswerte. Bei reelen Eingangswerten ist 
es ab Fsampling/2 in der Tat gespiegelt (war da nicht auch was mit 
komplex konjugiert?), aber da Matlab auch mit komplexen Eingangswerten 
rechnet, wo das nicht zwangsläufig der Fall ist, sollte man ihm diese 
Ineffizienz nachsehen.

von Purzel H. (hacky)


Lesenswert?

Man kann sich natuerlich immer viel Arbeit machen. Ich wuerd mal den 
uninteressanten Muell wegfiltern. Zb ein 3Hz Filter 6. Ordnung, und dann 
noch die Nulldurchgaenge messen.

von Stefanie B. (sbs)


Lesenswert?


von Karel M. (marsalek)


Lesenswert?

Daniel schrieb:
> Karel Marsalek schrieb:
>> Das resultierende Signal muss danach Mittelwert von 0 haben.
>
> Wozu?

Damit das mit Window gewichtete Signal wie eine Spindel aussieht und 
nicht wie eine aufmodulierte 3Hz Welle auf einer Trägerfrequenz von 
50/(512*2) Hz = 0,049 Hz. Das könnte (cleverere Kollegen bitte um 
Überprüfung) das resultierende Spektrum etwas verschmieren.

Habe schon seit Ewigkeiten nicht mehr mit Matlab ein Spektrum berechnet, 
aber warum spuckt er mehr als 512 Werte aus?

Karel

von A. R. (redegle)


Lesenswert?

Ich habe dir mal einen Code für Matlab zusammengestellt.
Wenn du die Daten als csv-Datei hochstellen kannst könnte ich dir eine 
FFT davon machen. Das hilft vielleicht zum Vergleichen.

%Einzugebende Werte
Daten=csvread('Daten.csv');

%FFT Diagramm Parameter
xAxismin = 0.00045;
xAxismax = 0.005;
yAxismin = 0;
yAxismax = 10^6;

%FFT mit einem Rechteck als Fenster. Also keine Fensterfunktion gewählt
fs = 1000000;  %Abtastfrequenz in Hz
A=1; % A=1 --> kein Zeropadding A=2 --> Zeitbereich wird durch Nullen 
verdoppelt

%FFT berechnen
m = length(Daten)*A; %Liefert Anzahl der Werte
Daten=Daten(:,2); %Liefert 2te Zeile
FFT = fft(Daten,m);
%In FFT liegt für jede Frequenz eine komplexe Zahl

f = (0:m-1)*(fs/m);     % Frequency range
FFT_Betrag= abs(FFT)*1/fs;
figure(1);
semilogx(f,20.*log10(FFT_Betrag))
xlabel('Frequency [Hz]')
ylabel('Amplitude in dB')
title('{\bf FFT des Kraftverlaufs}')
axis([xAxismin xAxismax yAxismin yAxismax])
grid on

von Heiner (Gast)


Lesenswert?

Wenn man die Frequenz kennt, reichen auch 5 Frequenzen um die gesuchte 
herum. Die kann man dann enger setzen, als die 0,1HZ der FFT, die nur F 
liefert die man eh nicht braucht.

von Harald M. (mare_crisium)


Lesenswert?

Dein hoher DC-Anteil macht Deine Peaks unnötig breiter. Warum folgst Du 
nicht dem guten Rat von Anja und Karel und eliminierst den erstmal? Den 
Mittelwert über alle Messpunkte bilden und den dann von jedem Messpunkt 
subtrahieren (und zwab VOR der Multiplikation mit der Fensterfunktion!). 
Keine Bange: Die FFT kommt mit negativen Messwerten sehr gut klar ;-).

Ciao,

mare_crisium

von bb84 (Gast)


Lesenswert?

FFT-Anfänger schrieb:
> Das heisst, wenn ich die Seitenbereiche meines 512-Punkte Fensters
> abflache, dann werde ich die tatsächlich enthaltene Frequenz von ca. 3Hz
> deutlicher erkennen können, als wenn ich nur einen scharfen Cutt-setze,
> ist das richtig?

Das Fenster verbessert das Signal gegenüber Leckmoden, siehe 
Post@(Stefan B.). Wenn deine Abtastung Periodisch zur "zu messenden 
Frequenz" sind entstehen keine Leckmoden.

DC-offset  differenziertes Eingangssignal  Fensterfunktion / Filter 
sollten je nach Bedarf und Nutzen möglichst sinnvoll eiungesetzt werden.

Das oben genannte Flat-Top-Fenster hat bspw. eine ganz andere Funktion 
als Hamming.

von Oswald (Gast)


Lesenswert?

Harald M. schrieb:
> Dein hoher DC-Anteil macht Deine Peaks unnötig breiter.
Nö, das kann er auch im Frequenzbereich rausnehmen.

von Daniel (Gast)


Lesenswert?

Sei y(t)=Eingabedaten, c=DC-Anteil, W(t)=Fenster, dann gilt
FFT{(y(t)-c)W(t)}=FFT{y(t)W(t)}-cFFT{W(t)}

Den DC-Anteil vorher abzuziehen bringt also nur etwas, wenn die FFT der 
Fensterfunktion in der Nähe von 3Hz ungleich 0 ist.

Wie war das noch mit den Nullstellen der Spektren der üblichen 
Fenster?...
http://de.wikipedia.org/w/index.php?title=Datei:Windowfunctions.jpg

von Oswald (Gast)


Lesenswert?

Die Nullstellen sind doch identisch, egal, wie ich fenstere.

von Daniel (Gast)


Lesenswert?

Nein, wie man z.B. dem von mir verlinkten Bild ansehen kann, hat das 
Hamming-Fenster in den ersten zwei Spektralkomponenten Werte != 0.

von Peter K. (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe vor einiger Zeit eine nützliche Freeware im Internet gefunden. 
Die Software nennt sich SignalAnalyzer und kann Werte aus dem 
Zeitbereich mit Hilfe der FFT in den Frequenzbereich transformierten. Es 
gibt eine große Auswahl an Fensterfunktionen und auch Zero-Padding. So 
kann man anhand seiner eigenen Werte mal die Fenster testen und sich das 
Spektrum ansehen.

http://www.downloads.de/a/Schule/1192/SignalAnalyzer-14.html

von MMS (Gast)


Lesenswert?


von Wolfgang (Gast)


Lesenswert?

Wenn es nur um wenige Frequenzen geht, würde man statt der FFT eher den 
Goertzel-Algorithmus verwenden. Das entlastet den µC. Threads gibt es 
dzu hier genug.
http://en.wikipedia.org/wiki/Goertzel_algorithm

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.