Goertzel auf ATMega8

OP #2283963
Lesenswert?
• ▲
▼
Hallo,

ich möchte den Goertzel Algorithmus auf einen Mega8 implementieren. Als 
Grundlage habe ich den Code von 
Beitrag "Goertzel auf ATMega1280: Seltsames Problem" benutzt. Ziel ist 1750Hz und 
später DTMF zu erkennen.
Genau das selbe Problem, das der Kollege im anderen Thread beschrieben 
hat, tritt bei mir auch auf: Grundlegend funktioniert es, aber egal was 
für einen Koeffizienten(A) ich angebe, das Maximum bleibt bei 2400Hz. 
Ich habe schon mit den Skalierfaktoren herumgespielt, aber das Problem 
bleibt immer bestehen.

Der betreffende Code (aus adc.c:
1
volatile int16_t signal = 0;  // filter result (signal power)
2
volatile bool new_value = 0;
3

4
volatile int16_t v0 = 0;  // goertzel filter variables
5
volatile int16_t v1 = 0;
6
volatile int16_t v2 = 0;
7
volatile int16_t filtidx = 0;  // current filter step
8

9
#define N 128      // goertzel filter length; 
10
        // frequency resolution B = Fs/N
11
#define A 106      // filter coefficient: 2*cos(4761Hz*2*pi/Fs)*128
12
                    // scaled with 128
13
...
14

15
// goertzel algorithm in ADC conversion complete ISR
16
ISR(ADC_vect)
17
{
18
  uint16_t adcval;
19

20
  //read 16bit ADC value
21
  adcval = ADCW;
22

23
  //goertzel
24
  if (filtidx == N)        // outer filter
25
  {
26
    filtidx = 0;
27

28
    v1 = v1/256;        // scaling with 128
29
    v2 = v2/256;
30
    signal = (v1*v2*A)/512;    // scaling with 256
31
    signal = v1*v1 + v2*v2 - signal;
32
  new_value = true;
33
    v1 = 0;
34
    v2 = 0;
35

36
  }
37
  else                      // inner filter
38
  {
39
    v0 = A*v1/128;           // scaling with 128
40
    v0 = adcval + v0 - v2;
41
    v2 = v1;
42
    v1 = v0;
43
    filtidx++;
44
  }
45
}

Im anderen Thread hat er das Problem ja lösen können - nur wie, das hat 
er nicht verraten.

Kann mir jemand von euch einen Denkanstoß geben?
Angehängte Dateien:
#2284115
Lesenswert?
• ▲
▼
er hatte die skalierung verändert(sprich nicht mehr durch 1024 geteilt)

und wenn ich bei dir die kommentare anschaue dann sehe ich da was von 
//scaling with 128 und du teilst dann durch 256.

in dem anderen thread wurde aber ja erwähnt das 1024 ein zu grosser 
skalierungsfaktor war...also eher kleiner werden statt grösser.
also eher 64 statt 256 in deinem fall.

das nur mal so ohne weiteres codeverständnis von mir

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.