Forum: Digitale Signalverarbeitung / DSP / Machine Learning FFT Bins interpolieren


von cs (Gast)


Lesenswert?

Hallo,

ich bestimme mit einer FFT die Signalform der Netzspannung. Ich habe 
eine Frequenzauflösung von 2,5 Hz. Wenn die Netzfrequenz jetzt genau 50 
Hz hat dann habe ich für die 50 Hz ja genau einen Wert der dies 
repräsentiert. Schwankt die Frequenz jedoch (z.B. auf 50,5 Hz) dann 
trifft mein Bin ja diesen nicht mehr genau.
Die Frequenz selbst kann ich davon ableiten wie viel Samples ich 
zwischen den Nulldurchgängen habe und die Nullstellen dann linear 
interpoliere. Das funktioniert gut. Höhe und Winkel des Bins müsste ich 
aber im Frequenzbereich interpolieren.

Weiss da jemand einen Ansatz oder ein Paper wo dies beschrieben wird?

Viele Grüße,
Chris

von Nop (Gast)


Lesenswert?

Mit den Google-Stichworten 'triangle algorithm derivative sinusoids' 
findet man einiges.

Bei dem Dreieck fenstert man im Zeitbereich so, daß ein Sinus im 
Frequenzbereich ein sauberes Dreieck gibt (egal, wie die Bins sind). Die 
Idee bei der Ableitung ist, daß die Ableitung eines Sinus ein 
phasenverschobener Sinus ist.

von Detlef _. (detlef_a)


Lesenswert?

1) Mehr samples nehmen, dann liegen die bins näher zusammen
2) 'FFT bin interpolation' ist ein Standardproblem, da gibt es sehr 
viele hits.
3) Die Netzfrequnz kannst Du genauer und schneller so bestimmen

Beitrag "Frequenz, Amplitude und Phase eines Sinussignals bestimmen"

Cheers
Detlef

Beitrag #6582034 wurde von einem Moderator gelöscht.
von cs (Gast)


Lesenswert?

Hallo zusammen,

Nop schrieb:
> Mit den Google-Stichworten 'triangle algorithm derivative sinusoids'
> findet man einiges.

Hab schon einiges gefunden - aber noch nichts was mich erhellt hat...

Detlef _. schrieb:
> 1) Mehr samples nehmen, dann liegen die bins näher zusammen

Heisst aber auch mehr Rechenaufwand. Ist nicht ganz das was ich suche...

> 2) 'FFT bin interpolation' ist ein Standardproblem, da gibt es sehr
> viele hits.

Ja das hab ich auch schon gemerkt das ich mit dem Problem nicht allein 
bin

> 3) Die Netzfrequnz kannst Du genauer und schneller so bestimmen

Mir gehts nicht um die Netzfrequenz an sich, sondern um die Oberwellen 
welche ja immer vielfache der Netzfrequenz sind. Ist diese minimal 
verschoben (z.B. um 0.1 Hz dann ist die 10. Oberwelle ja schon um 1 Hz 
daneben. Ich möchte den Betrag der Oberwellen berechnen, eigentlich 
sogar ohne die Grundfrequenz.

Al Caput schrieb im Beitrag #6582034:
> mach doch einch zero padding bro

Mach ich schon, muss ich ja sowieso wenn ich z.B. 10 Perioden abtaste 
und die Frequenz nicht genau 50 Hz ist dann ist die Anzahl der Werte ja 
nicht eine Zahl zur Basis 2 was die FFT braucht. Aber Für das genaue 
Bestimmen der Frequenzen ist das auch nicht wirklich die Lösung...

https://indico.cern.ch/event/132526/contributions/128902/attachments/99707/142376/Meeting1-06-11_FFT_corrections_for_tune_measurements.pdf
Hier auf Seite 8 habe ich ein Beispiel gefunden wie mit sin(x)/x 
angenähert wird, leider funktioniert mein Beispielcode nicht. Ich hab 
einen Sinus mit 49,3 Hz und 325V Peak simuliert, Dann bekomme ich 
folgende Werte:

Y(47,5Hz) = 267
Y(50Hz) = 320
Y(52,5Hz) = 140

Als Amplitude bei 49,3 Hz kommt bei der Formel dann 0,17838 raus - weiss 
jemand was ich hier falsch mache?

Viele Grüße,
Chris

von Detlef _. (detlef_a)


Lesenswert?

cs schrieb:
>> 3) Die Netzfrequnz kannst Du genauer und schneller so bestimmen
>
> Mir gehts nicht um die Netzfrequenz an sich, sondern um die Oberwellen
> welche ja immer vielfache der Netzfrequenz sind. Ist diese minimal
> verschoben (z.B. um 0.1 Hz dann ist die 10. Oberwelle ja schon um 1 Hz
> daneben. Ich möchte den Betrag der Oberwellen berechnen, eigentlich
> sogar ohne die Grundfrequenz.

Das ist doch egal, Du bestimmst die Grundwelle und ziehst die dann ab, 
dann hast Du deine Oberwellen.

Mail mal Deine Abtastwerte dann zeig ich wies' geht.
Und auf die Zweierpotenz bist Du sowieso nicht festgenagelt, FFT geht 
auch ohne Zweierpotenz.

Cheers
Detlef

: Bearbeitet durch User
von cs (Gast)


Lesenswert?

Hallo,

Detlef _. schrieb:
> Und auf die Zweierpotenz bist Du sowieso nicht festgenagelt, FFT geht
> auch ohne Zweierpotenz.

Was für Algorithmen gibts da in C? Auf Python geht das super, aber 
später soll es mal auf einem Cortex M Controller laufen.

Viele Grüsse

von Nop (Gast)


Lesenswert?

cs schrieb:

> Hab schon einiges gefunden - aber noch nichts was mich erhellt hat...

Die beiden ersten Hits meinte ich. Da geht's genau darum. Wenn man den 
ganzen Mathe-Senf ignoriert und sich nur die Bilder anschaut, ist leicht 
verständlich, wie das vom Prinzip her funktionieren soll.

von Detlef _. (detlef_a)


Lesenswert?

cs schrieb:
> Hallo,
>
> Detlef _. schrieb:
>> Und auf die Zweierpotenz bist Du sowieso nicht festgenagelt, FFT geht
>> auch ohne Zweierpotenz.
>
> Was für Algorithmen gibts da in C? Auf Python geht das super, aber
> später soll es mal auf einem Cortex M Controller laufen.
>
> Viele Grüsse

Sowohl C als auch Python sind turing-vollständig, was in Python super 
geht geht auch in C super.

Schick mal samples.

Cheers
Detlef

von Thilo L. (bc107)


Lesenswert?

Wenn man sich nur für eine einzige Frequenz interessiert, dann ist man 
mit einem Goertzel-Algorithmus evtl. besser dran. Ich hatte den mal zum 
Stimmen einer Geige implementiert, da ich ja nur die 440 Hz (Kammerton 
a) maximieren wollte, das war um einiges schneller als eine volle FFT.

von Burkhard K. (buks)


Lesenswert?

cs schrieb:
> Hier auf Seite 8 habe ich ein Beispiel gefunden wie mit sin(x)/x
> angenähert wird, leider funktioniert mein Beispielcode nicht.

Welches Fenster für die FFT und welche der beiden Formeln (Rechteck oder 
von Hann) hast benutzt?

Wenn ich ein "Rechteckfenster" annehme und delta_m mit Ym-1 = 267 und Ym 
= 320 berechne, bekomme ich Xc = 50 - (0,455 * 2.5) = 48.9Hz statt 49,3 
Hz. Mit der von-Hann-Formel bekomme ich auf Fc = 49,1.

: Bearbeitet durch User
von Detlef _. (detlef_a)


Angehängte Dateien:

Lesenswert?

Hier ist ein Beispiel des TO, 49,3Hz mit 4.Oberwelle. Ich habe erstmal 
die Grundwelle mit einem schmalen Bandpass rausgeholt, dann deren 
Frequenz bestimmt (49,303 :)) ) . Dann mit der bekannten  Frequenz 
runtergemischt um Amplitude ( 325V) und Phase zu bestimmen. Dann die 
Energie dieser Grundwelle bestimmt und die Fehlerenergie ( Verzerrung ) 
als Signal-Grundwelle.

Details im pdf. Das kann auch ein Cortex.

Cheers
Detlef

von Michael W. (Gast)


Lesenswert?

Man kann auch die nächstliegende Frequenz hernehmen und dann in diesem 
Bereich nochmals genauer offline nachrechnen. Dann entgehen einem auch 
keine peaks, die noch nicht erfasst wurden und die keine Interpolation 
liefern kann.

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.