Ich brauche mal 1,2 tipps:
Ich möchte ein Signalgemisch analysieren, das aus verschiedenen Wellen
unterschiedlicher Frequenz besteht. Beispiel: 50Hz, 33.1/3 und 60Hz und
auch 80Hz, sowie Frequenzen zwischen 100 und 200 Hz können vorkommen.
Es geht dabei um die Erkennung einer variablen Frequenz innerhalb der
100Hz bis 200Hz mit der eine Information übertragen, welche aber durch
vorhandene Brummeinstreuungen der genannten Freuqenzen und deren
Oberwellen gestört sind. Ich muss also das Ausmass des Verhandenseins
all dieser Frequenzen messen und nach einem Kriterium festlegen, ob sie
vorhanden sind oder nicht.
Laut Mathematik kann ich das durch eine FFT machen, womit ich mich
einigermassen auskenne. Allerdings habe ich ein Problem, die Frequenz
sehr schnell zu detektieren und zu erfassen, weil auch die
Störfrequenzen nicht exakt sind. Besonders die 80Hz / 160Hz sind sehr
variabel. Ich muss ausgeben, ob es 80Hz, 79.9 etc sind, wie stark also
die Frequenz vom Ideal abweicht. Abtastrate möglichst 1kHz, d.h. bis zu
Tausend Datensätze je Sekunde als Tabelle ausgegeben, die etwa so
aussieht:
Satz 1
Norm Ist Level
33Hz 33.4 -30dB
50Hz 50.2 -13dB
60Hz 59.4 -30dB
80Hz 79.1 -13dB
XXHz 122.4 - 7dB
Satz2
Norm Ist Level
33Hz 33.3 -29dB
50Hz 50.1 -12dB
60Hz 59.2 -31dB
80Hz 80.4 -14dB
XXHz 122.4 - 7dB
D.h man kann anhand der Tabelle die Frequenz mitteln und eine Schwankung
erkennen und auch die Amplitude grob mitverfolgen. Geht das mit einer
FFT? Wie fein muss ich die detaillieren, um die Frequenz zu berechnen?
Wenn ich z.B. eine FFT mit 1Hz Abständen habe, dann würde ich bei einer
Änderung von 79.8 auf 79.9Hz eine leichte Verschiebung der Amplituden
der FFT-Werte um die 80Hz sehen. Kann ich da einfach Schwerpunkte
berechnen?
Wie könnte man es besser machen? - Wie berechne ich die Variable
Frequenz?
Bei einem Gemisch mit solchen Amplitudenunterschieden und unbekannten
Frequenzen dürfte die FFT am besten geeignet sein. Versuch doch mal das
Ganze zu simulieren (Python ist recht einfach dafür). Die Gewichtung der
einzelnen Bins kann für eine Abschätzung der Frequenz benutzt werden.
Dazu auch mal mit der Fensterfunktion rumspielen. Bau dir dein
Eingangsgemisch mathematisch zusammen , noch ein bisschen Rauschen dazu
rechnen und den PC den Rest machen lassen.
Schnell ist immer relativ. Es dauert eben 1 Sekunde bei 1000 Abtastungen
a 1kHz. Im späteren Betrieb kannst du ggf. die Abtastungen überlappen
lassen, z.B. nach 500 neuen Werten wieder rechnen.
Martin K. schrieb:> Besonders die 80Hz / 160Hz sind sehr> variabel. Ich muss ausgeben, ob es 80Hz, 79.9 etc sind,
Warum?
Ich denke das sind Störfrequenzen?
Dann interessieren sie doch niemanden.
Die anderen Festfrequenzen und deren Oberwellen kann man sehr einfach
und wirksam mit analogen Doppel-T-Filtern unterdrücken.
Das schafft einen besseren Störabstand für die Auswertung der
Signalfrequenzen, egal wie du diese nun letztendlich realisierst.
P.S.:
Martin K. schrieb:> Abtastrate möglichst 1kHz, d.h. bis zu> Tausend Datensätze je Sekunde als Tabelle ausgegeben,
Wie willst du denn eine Frequenz von 30Hz 1000Mal pro Sekunde messen?
Du hast pro Sekunde ja nur 60 Nulldurchgänge und vielleicht noch einmal
soviele Extrema, die du auswerten könntest.
Also mit einer Abtastfrequenz von 1KHz über eine Sekunde erhälst du eine
Frequenzauflösung von 1Hz - und nicht 0,1Hz.
Du müsstest also mit 10kHz abtasten oder 1kHz über 10 Sekunden...
Außerdem, musst du eine Fensterfunktion auf die Werte anwenden, sonst
stimmen die Amplituden nicht mehr.
Zudem nimmt man für FFT meist eine Zweierpotenz, z.B. 1024 Werte.
Martin K. schrieb:> Messen muss ich die 80Hz genau, weil in der Phase eine Information> steckt.
Bitte formuliere erst einmal dein Problem genau und ändere nicht
mittendrin deine Geschichte. Oben hast du uns erzählt:
Martin K. schrieb:> geht dabei um die Erkennung einer variablen Frequenz innerhalb der> 100Hz bis 200Hz mit der eine Information übertragen,
Also was? 80 Hz? 100 Hz ... 200 Hz?
Das Ganze sind zwei Systeme. Eines für einen Kunden, das andere für
mich. Die Signalverarbeitung ist recht ähnlich.
Ich kann da leider nicht mehr sagen, aber bei meinem System es ist so,
dass ich normal entaltenen Frequenzen benutzen möchte, um sie in
Echtzeit auszublenden. Dafür müssen die 50Hz genau in der Phase und
Amplitude gemessen und abgezogen werden. Abgezogen werden sie durch ein
ständig laufendes Filter, das in der Phase und Amplitude regelt wird.
Die Idee stammt aus einem Audioforum.
Wenn man so den 50Hz Brumm abzieht, wird er geringer, ohne die realen
Musikfrequenzen zu stören.
Für die Industrieapplikation geht es darum mehrere Frequenzen genau zu
messen. Von mir aus auch mit 10kHz Abtastrate.
Die FFT ist eben nur sehr aufwändig und ich müsste sehr viele FFTs
überlappen, um zeitnah neue Werte zu bekommen.
Also als Beispiel:
100 parallele FFTs zeitversetzt mit 1kHz Abtastrate und 1000 Punkten
würden mit 1Sekunde Latenz alle 10ms einen Amplituden- und Phasenwert
ausspucken.
Problem: 1000 Punkte sind gfs zu weit, um die Frequenzen fein genug
aufzulösen.
Moin,
Ich glaub - egal, was du machst - wenn du irgendwelche Frequenzen fein
aufgeloest messen willst, dann dauert das lange. Punkt. Klar FFT ist
halt die Holzhammermethode, damit wird man's schon irgendwie erschlagen
koennen.
Du kannst auch versuchen, dein Signal z.b. mit einem komplexen 50.000Hz
Signal durch einen Quadraturmischer runterzumischen, danach dann (sehr
tief) tiefpassfiltern (also wenn du z.b. mit Fehlern von +-1% in deinen
50Hz rechnest, koennte die Grenzfrequenz der Tiefpaesse bei 0.5Hz
liegen) und die Frequenz dann "messen". Aber das dauert halt auch
lange...
Gruss
WK
Du wirst ausserdem auch beim Überlappen von Messfenstern immer nur die
Frequenzen erhalten, die in dem vergangenen Messfenster da waren. Wenn
sich deine Stöfrequenzen aber über die Zeit ändern weisst du nicht wie
sie sich seither geändert haben.
Damit kannst du nicht in Echtzeit diese in Phase und Frequenz variablen
Störungen rausrechnen. Das funktioniert nur bei einem sehr stabilen
Signal wie dem Netzbrumm.
Sehe ich genau so. Mit der FFT hat man das Problem, daß man
allemöglichen Frequenzen bekommt, die man gar nicht braucht, bzw von
denen man viele nicht braucht. Das obere Spektrum ist relativ dicht
besetzt und unten fehlt es. Ich habe sowas daher für meine
Musikapplikationen so gemacht, dass ich nur die Frequenzen prozessiere,
die ich auch wirklich brauche, also z.B. einen 33Band-EQ oder auch ein
88-Tasten-Klavier.
http://www.96khz.org/htm/spectrumanalyzer2.htm
Wenn die Frequenzen genau gemessen werden sollen, reicht das aber noch
nicht. Da geht es nur entweder mit PLLs, die sich auf das Signal
selektiv einloggen und einen Phasenabgleich ermöglichen oder ansonsten
DFT mehrkanalig komplex, wie bei Radar / Ultraschalldiagenostik.
Abtastraten von 1kHz reichen da aber sicher nicht, um daraus
Amplitudenwerte genau zu ermitteln. Geht eher Richtung 100kHz!
Hier ist eine Lösung für einen Kanal in einem FPGA:
http://www.96khz.org/htm/audio2midifpga.htm
Das geht auch mit DSPs. Vielleicht geht es mit Goertzel, wenn Du Dich
auf einige wesentliche Frequenzen beschränkst und deren Umgebungen mit
direkten Nachbarn abdeckst:
https://de.wikipedia.org/wiki/Goertzel-Algorithmus
Genau wie die FFT braucht aber auch Goertzel eine gewisse Prozesslänge
um die Frequenzen selektiv zu finden, also u.U. mehrere Perioden. Und
man muss die genaue Frequenz noch nachberechnen.
Die 100-200 Hz wirst Du in jedem Fall mit einer FFT am Besten
hinbekommen.
Dergute W. schrieb:> Du kannst auch versuchen, dein Signal z.b. mit einem komplexen 50.000Hz> Signal durch einen Quadraturmischer runterzumischen,
Meinst Du damit 50Hz oder 50kHz? Wegen des Punktes?
Wieso wird das Signal runtergemischt und wohin?
Moin,
Ich meine 50Hz. Durch die .000 hintendran wollt' ich nur die Genauigkeit
dieser Referenzfrequenz vorgaukeln.
Durch dieses Verschieben im Spektrum durch den Mischvorgang wird dann
aus den z.b. tatsaechlich anliegenden 50.01Hz im Signal nach dem Mischer
0.01Hz. Die kann ich dann tiefpassfiltern, um alle anderen
Signalanteile, die mich gerade nicht interessieren, loszuwerden; danach
die Frequenz messen. Das sollte irgendwie zu machen sein, weil man dann
die Zeit zwischen Nulldurchgaengen detektieren kann. Aber es dauert
halt...
Gruss
WK
Moin,
ich würde zu einer Goertzel-Filterbank tendieren (also ein paar
IIR-Filter). Kann man auch modifizieren, wenn du laufend
Phasenaenderungen registrieren musst.
Phase kriegst du da sehr gut raus. Ist das eine SDR-Ähnliche Applikation
mit irgend nem Phase-Keying?
Bei der FFT schlagen halt die Überlapp-Probleme zu, die oft mühsam
rauszurechnen sind, für ne fortlaufende Phasendetektion ist das nicht so
ganz elegant.
Aber du kannst ansich bei fortlaufender, überlappender FFT eine gleich
effiziente "moving DFT" machen und brauchst kaum Werte puffern. Findet
man in div. FFT-Algo-Schinken.
Gruss,
- Strubi
"Phase Keying" ist zuviel gesagt, aber die Phasenlage wird verwendet, um
Zeitpunkte der Messung zu ermitteln und zu korrigieren.
Ich mache mich mal bezügl der Görzelmethode schlau.