Hallo, wenn ich in einem zeitdiskreten Signal nur ein bestimmtes, sehr schmales Band rausfischen möchte, welchen Algorithmus nehme ich da am besten? Ich habe ein Signal, welches 30.000 mal pro Sekunde abgetastet wird. Ich möchte jetzt gerne die Signalstärke bei 5500 Hz +-50Hz wissen. Auch wichtig ist, dass ich die ganzen anderen Bänder verwerfen kann. Eine volle FFT ist also eigentlich nicht notwendig.
:
Verschoben durch Moderator
Google mal nach Goertzel-Algorithmus. Der berechnet eine FFT nur für eine gesuchte Frequenz.
Wie wär´s mit Görtzel oder ich würde es mal mit einigen Biquads hintereinander versuchen. Eine Güte von ca. 100 sollte doch mit 2-3 Filtern 2. Ordnung zuverlässig zu machen sein. Die Frage wäre, wie schnell die Erkennung sein soll. Die Einschwingzeit ist eben auch von der Bandbreite abhängig. Etwas mehr als 16 Bit sollten es aber schon sein, sonst fällt das Signal irgendwann hinten runter.
Goertzel sagt aber wenig über die Amplitude aus. Besser ist, was man analogtechnisch als Heruntermischen auf Zwischenfrequenz (und eventuell wieder hochmischen) ausführt. Digital entspricht das dem Multiplizieren mit einem digitalen "local oscillator", der nahe neben der gesuchten Frequenz liegt. Mit I/Q- Mischung kann man auch gleich die Spiegelfrequenz unterdrücken.
Moin, Christoph K. schrieb: > Goertzel sagt aber wenig über die Amplitude aus. Mit bisschen nachrechnen sagt der ziemlich viel ueber die Leistung aus - damit auch ueber die Amplitude. Guggstu hier: https://en.wikipedia.org/wiki/Goertzel_algorithm#Power-spectrum_terms Wenn die Trennschaerfe/"Nebenzipfeldaempfung" vom Goertzel reicht, ist das das Verfahren der Wahl. Erst wenn der Analysefilterfrequenzgang genauer (z.B. rechteckiger) sein muss, dann wuerd' ich mit 'runtermischen und tiefpassfiltern anfangen. Gruss WK
Christoph K. schrieb: > Goertzel sagt aber wenig über die Amplitude aus. > Besser ist, was man analogtechnisch als Heruntermischen auf > Zwischenfrequenz (und eventuell wieder hochmischen) ausführt. > Digital entspricht das dem Multiplizieren mit einem digitalen "local > oscillator", der nahe neben der gesuchten Frequenz liegt. Mit I/Q- > Mischung kann man auch gleich die Spiegelfrequenz unterdrücken. Aus reiner Neugier: wie würdest du denn den digitalen LO realisieren? mit DDS? wenn man eine einigermassen gute Signalqualität mit DDS erzielen will, muss das ganze ja ordentlich flott laufen.
Wieso Görzel? Wieso kann man nicht mit FIR genau die gesuchte Frequenz nehmen? ein gewisser Bereich ist damit ja mit abdeckt. ?
Analoger schrieb: > Wieso Görzel? Wieso kann man nicht mit FIR genau die gesuchte Frequenz > nehmen? ein gewisser Bereich ist damit ja mit abdeckt. Für einen Bandpass braucht es zwei filter (überlappende Tief- und Hochpass) und Goertzel ist im Prinzip zwei Filter, ein FIR und ein IIR. https://en.wikipedia.org/wiki/Goertzel_algorithm#The_algorithm
C. A. Rotwang schrieb: > Für einen Bandpass braucht es zwei filter (überlappende Tief- und > Hochpass) Ja und? Das paßt alles in einen einzigen Filterkernel hinein, so daß man den nur einmal durchrennen muß. Nochmal zum Mitschreiben: mit einem einzigen Filterkernel kannst du ohne jegliche Längenänderung Hoch- Tief- und Bandpass sowie Bandsperre machen. W.S.
Görzel halte Ich hier nicht für zielführend. Ein FIR definierter Tiefe sollte die Anforderung erfüllen. Die Bandbreite lässt sich ja darüber leicht festlegen. Beim Beispiel oben mit schon gegebener Abtastrate nimmt man einfach eine entsprechende Anzahl an Perioden. Mit dem Fenster muss man ein wenig aufpassen.
Hi, mit nem IIR Filter als elliptischen Bandpass geht das ganz gut. Anbei der Matlab Entwurf für die gewünschten Bandbreiten, 8.Ordnung, 3dB ripple und 60dB Dämpfung.Das Bild zeigt den Frequenzgang und die Impulsantwort. Das Filter schwingt 200ms oder so nach, schnell ist das nicht. Ausserdem sind die Beträge der Pole so nahe an eins, dass man eventuell mit 32Bit float Rechengenauigkeit nicht mehr hinkommt, sodass man auf 64 Bit upgraden muss. Das gilt auch für eine integer Implementation. Cheers Detlef clear fs=30000; fsh=fs/2; wp=[(5500-50)/fsh (5500+50)/fsh]; n=4; rp= 3; rs=60; f=5000:6000; [fb,fa]=ellip(n,rp,rs,wp); [H f]=freqz(fb,fa,f,fs); subplot(2,1,1) plot(f,20*log10(abs(H))); grid subplot(2,1,2) plot(filter(fb,fa,[1 zeros(1,10000)])) return
Also ich würde auch den Görtzel nehmen, da es am wenigsten rechenaufwand nimmt. Und wenn man es mit Floating Point rechnet, lässt sich die Amplitude sehr gut bestimmen. Habe das sogar schon auf einem Xmega8E5 mit Software Floating Point für CTCSS Tonerkennung gemacht. Zuerst habe ich das mit Fix Point berechnet, war damit nicht zufrieden, weil die Rundungsfehler durch die Iterationen zu heftig waren. Bei Floating Point aber klasse ging. Ein IIR-Filter hat eine zu lange Einschwingzeit, besonders je schmalbandiger der Bandpass ist. Ein elliptischen Bandpass ist aber schon der beste Steilflankige Filter den ich auch kenne. FIR-Filter wird man nur mit sehr viel Rechenaufwand hinbekommen. Gruß Sascha PS. Die Methode mit dem heruntermischen ist sicherlich auch nicht schlecht, habe ich aber noch nicht ausprobiert. Das würde sich aber auch in Software realisieren lassen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.