Vorteil von Abrundung des FFT Fensters und Zeropadding?

Gast #2612073
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
Gast #2612097
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?
#2612111
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
Gast #2612125
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
Angehängte Dateien:
#2612246
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.
Gast #2612460
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.
Angehängte Dateien:
Gast #2612475
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.
Gast #2612488
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?
Angehängte Dateien:
Gast #2612578
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.
Gast #2612602
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.
Gast #2612607
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
Gast #2612642
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?
Angehängte Dateien:
#2612789
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
Gast #2612941
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.
#2613424
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
#2613443
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
#2613673
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
Gast #2613773
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.
Gast #2667000
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren