Datum: 08.02.2010 15:11
Hallo an alle, ich habe anhand dieses Beispiels meine Goertzel Methode entwickelt. http://ptolemy.eecs.berkeley.edu/papers/96/dtmf_ic...
double goertzel(double* x, int N, double freq, double samplerate) { double Skn, Skn1, Skn2; Skn = Skn1 = Skn2 = 0; for (int i=0; i<N; i++) { Skn2 = Skn1; Skn1 = Skn; Skn = 2*cos(2*M_PI*freq/N)*Skn1 - Skn2 + x[i]; } double WkN = exp(-2*M_PI*freq/samplerate); return (Skn - WkN*Skn1); } |
Benötige diesen zur Detection von DTMF Tönen. Wie bekomme ich den nun aus dem Ergebnis heraus um was für einen DTMF Ton es sich handelt? Gruß k-a
Datum: 08.02.2010 15:19
Diese Application Note von Maxim ist verständlicher: http://pdfserv.maxim-ic.com/en/an/AN3386.pdf Info zur DTMF-Detektion steht auf der letzten Seite.
Datum: 08.02.2010 16:24
@Xenu: Da hast du recht, ist verständlicher...so ist der Algo auch der gleiche wie aus Wikipedia zum Goertzel Filter. Und auch klar erklärt wie ich den entsprechenden DTMF Ton ermittle. Besten Dank. Gruß k-a
Datum: 09.02.2010 10:44
Ebenfalls danke @ helmi1, jetzt habe ich allerdings noch ein Problem. Für 16bit Signale gehts jetzt wunderbar...allerdings benötige ich das auch für 8bit Signale...wie wende ich denn Goertzel darauf an? gruß k-a
Datum: 09.02.2010 11:10
Ok, doch erledigt:) Einfach als char Array übergeben während der Ausführung die einzelnen chars in double konvertieren und denn Rückgabewert wieder mit static_cast<unsigned char>(128 + 63.75 * retval) in unsigned casten. Allerdings wird 0 für die geprüfte Frequenz zurückgegeben
Datum: 09.02.2010 12:16
k-a schrieb: > Ok, doch erledigt:) > > Einfach als char Array übergeben während der Ausführung die einzelnen > chars in double konvertieren und denn Rückgabewert wieder mit > static_cast<unsigned char>(128 + 63.75 * retval) in unsigned casten. > > Allerdings wird 0 für die geprüfte Frequenz zurückgegeben Code zeigen. BTW: Du willst NIE einen char verwenden, wenn du es mit Bytes im Sinne von Zahlen zu tun hast. char benutzt du dann, wenn es sich um Zeichen im Sinne von Text handelt. In allen anderen Fällen benutzt du entweder unsigned char oder signed char, je nachdem. Ob ein char ein Vorzeichen hat oder nicht, ist Compilerabhängig. Und da willst du dich NIEMALS auf irgendwelche Vorgaben einlassen sondern immer selbst bestimmten, ob ein Vorzeichen berücksichtigt wird oder nicht.
Datum: 09.02.2010 13:25
Jup...du hast ja recht...sorry. Natürlich unsigned char. Jetzt habe ich allerdings noch die Frage wie krieg ich denn jetzt die Grenzwert wie z.B. Größe der Amplitude raus???
Datum: 09.02.2010 16:20
Ahhhhh....ich hab mich eh völlig vertan...ich brauch den doch für 16bit, allerdings in short nicht in float oder double....wie mach ich den das nun???
Datum: 10.02.2010 03:30
Solange das Ergebnis in den Wertebereich zwischen -32768 und 32767 hinein passt, kann man es einfach einer short int Variablen zuweisen? Unter Verlust der Nachkommastellen natürlich. Sind denn die Eingangswerte x[i] tatsächlich Gleitkommazahlen, oder nicht, und wie ist ihr Wertebereich?
Datum: 10.02.2010 04:10
Du rechnest viel mehr mit Integerarithmetik als du willst. Wenn du überall 2 durch 2. ersetzt wird die Genauigkeit der Berechnungen deutlich steigen.
Datum: 10.02.2010 10:39
Marco schrieb: > Du rechnest viel mehr mit Integerarithmetik als du willst. Wenn du > überall 2 durch 2. ersetzt wird die Genauigkeit der Berechnungen > deutlich steigen. Wie kommst du denn da drauf?



