Hi, ich würde gerne mit meinem TMS320VC5505 einen 1750 Hz Ton auswerten. Momentan habe ich mit dem DSP eine Audio Verzögerung von 200 ms + Hochpassfilter (600 Hz, 4. Ordnung) realisiert und zusätzlich sollte ein GPIO Pin geschaltet werden, wenn sich im Audio Signal ein 1750 Hz Ton befindet. Wie kann ich das am besten anstellen? Bin für jeden Tipp dankbar. Grüße Stephan
Könnte man evtl. auch durch extreme Unterabtastung das Signal in das Basisband verschieben und dann "nur" die sehr langsame Spiegelfrequenz detektieren. Im Extremfall wäre die ja grad bei f=0Hz (Gleichanteil).
Hi, vielen Dank für die Hinweise. Ich werde es mit dem Goertzel-Algorithmus probieren. Grüße Stephan
Ich hab so was für ein Rundsteuersignal-Messgerät gemacht. Die Frequenz war 121Hz bei wenigen Volt Amplitude aufmoduliert auf 230V 50Hz. Ging mit 2 hintereinandergeschalteten IIR Bandpassfiltern 2. Ordnung sehr gut und einfach. Eine gewisse Verzögerung fürs Einschwingen des Filters ergab sich allerdings auch daraus. Dieses Problem tritt aber auch bei einer FFT auf, weil du ja erst mal auf alle 2^n Abtastwerte warten musst, bis du mal anfangen kannst zu rechnen. Grüsse
Von Analog Devices gibt es eine ausführliche Application note zur Touchtone-Decodierung mittels Goertzel, auf deren Festkomma-DSP ADSP2100 auf die Schnelle habe ich nur ein ZIP-File MODTMF.ZIP gefunden: http://www.analog.com/en/processors-dsp/adsp-21xx/content/21xx_applications_handbook_file_area/fca.html "for the development of a multi-channel DTMF decoder using the ADSP-2100 Family DSP"
>>>>>>>>>>>>>>>
Eine gewisse Verzögerung fürs Einschwingen des Filters
ergab sich allerdings auch daraus. Dieses Problem tritt aber auch bei
einer FFT auf, weil du ja erst mal auf alle 2^n Abtastwerte warten
musst, bis du mal anfangen kannst zu rechnen.
<<<<<<<<<<
Das ist immer so, ob bei IIR oder Goertzel oder FFT: Je schmalbandiger,
umso länger das Einschwingen des Filters/Detektors.
Cheers
Detlef
Hier noch nen Goertzel in K&R C: Der macht Goertzel auf der Frequenz 9/64 (wenn die Abtastfrequenz 1 ist). Der Algorithmus nimmt 64 Abtastwerte, liefert also den gleichen Wert wie eine FFT der Länge 64 am 9. bin. Die Rechnung ist im relevanten Teil rein integer, die Umrechnung zum Schluss braucht allerdings float (aber ohne Sinus/cosinus Berechnung, das sind Konstanten). Der Algorithmus ist auch relativ einfach auf andere Frequenzen umrüstbar, siehe die Kommentare. Die Funktion 'winkel' ist 'atan2', also die Umrechnung von Imaginärteil/Realteil in den Winkel. Nicht ganz schön und elegant, z.B. das Umkopieren der q0/q1 und die Rechnung am Schluß, aber geht. /* ************************************************** */ uint16_t goertzel_9_64(int16_t r[],int32_t re[],int32_t im[]) /* ************************************************** */ { // macht goertzel auf der Frequenz 9/64 // 2*cos(9/64*2*pi) = 1.26878 // 2202/8192= 0.26879 int32_t q0,q1,q2; int16_t k; q1=0l; q2=0l; for(k=0;k<64;k++){ q0=q1+((q1*2202)>>13)-q2+r[k]; q2=q1; q1=q0; } q0=q1+((q1*2202)>>13)-q2; q2=q1; q1=q0; im[0]=(int32_t)(q2 *sin(2*M_PI*9/64.0)); re[0]=(int32_t)(q1-q2*cos(2*M_PI*9/64.0)); return (winkel(im[0],re[0])); }
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.