Gast
#1459539
Hi, einige hier haben ja Erfahrung mit dem Goertzel-Algorithmus bzw. DTFM. Ich habe den Görtzel ähnlich dem Beispiel von Helmut Lenzen in folgendem Thread implementiert, um eine bestimmte Frequenz in einem Audiosignal zu detektieren (ATMega 1280): Beitrag "Wo Welchen DTMF Decoder" außerdem gut zur Auffrischung: http://www.answers.com/topic/goertzel-algorithm Leider habe ich jetzt das Problem, dass der Algorithmus nur für eine bestimmte Frequenz funktioniert, egal wie ich den Koeffizienten A setze. Das heißt, egal ob A 3 oder 7000 ist, ich bekomme immer nur für ca. 5,5 kHz ein Maximum. Sample-Frequenz ist konstant bei ca. 22038 Hz (16 Bit Timer1 triggert ADC-Wandlung, Algorithmus ist in der ADC-Interrupt-Routine). Ich habe den Code mal genau so in MATLAB reingehauen, da funktioniert er. Es muss also irgendwas 8bit-µC-Spezifisches sein, aber ich komme gerade echt nicht dahinter - irgendwie verscheindet die Wirkung des Faktors A. So sieht mein Code aus: #define N 200 // goertzel filter length; frequency resolution B = Fs/N #define A 54 // filter coefficient: 2*cos(4761Hz*2*pi/Fs)*128 // scaled with 128 [..] // goertzel algorithm in ADC conversion complete ISR ISR(ADC_vect) { uint16_t adclval, adchval; //read 16bit ADC value adclval = ADCL; adchval = ADCH<<8; adcval = adclval | adchval; //goertzel if (filtidx == N) // outer filter { filtidx = 0; v1 = v1/1024; // scaling with 1024 v2 = v2/1024; y = (v1*v2*A2)/2048; // scaling with 2048 y = v1*v1 + v2*v2 - y; v1 = 0; v2 = 0; } else // inner filter { v0 = A2*v1/128; // scaling with 128 v0 = adcval + v0 - v2; v2 = v1; v1 = v0; filtidx++; } } Die ganzen Divisionen/Multiplikationen mit Zweierpotenzen im Code bewirken nur eine Abbildung auf einen Integer-Wertebereich, wobei sie teilweise recht willkürlich gewählt sind. Ich habe schon ziemlich viel mit den Skalierfaktoren herumgespielt, an denen liegt es nicht, würde ich behaupten. Lasse mich aber gerne eines Besseren belehren, jegliche Ideen sind willkommen. Hat jemand einen Tipp? Danke, Grüße Raphael