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
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.
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
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
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
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
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.
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
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.
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.
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
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.