www.mikrocontroller.net

Forum: PC-Programmierung Goerzel Algo wie aus Ergebnis lesen?

Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: k-a (Gast)
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
Autor: Xenu (Gast)
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.
Autor: k-a (Gast)
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
Autor: Helmut Lenzen (helmi1)
Datum: 08.02.2010 17:32

Beitrag "Wo Welchen DTMF Decoder"


Hier ist noch was dazu.

Gruss Helmi
Autor: k-a (Gast)
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
Autor: k-a (Gast)
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
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
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.
Autor: k-a (Gast)
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???
Autor: k-a (Gast)
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???
Autor: Mark Brandis (markbrandis)
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?
Autor: Marco (Gast)
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.
Autor: Karl heinz Buchegger (kbuchegg) (Moderator)
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?

Antwort schreiben

Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net