bcf7a919418e15815c2829dfcd53672970b909f2
7 sox input.mp3 -b 8 -c 1 -r 8000 -t wav - | ./goertzel
10 float goertzel_mag(int numSamples
,int TARGET_FREQUENCY
,int SAMPLING_RATE
, float* data
)
13 On lower samplerates and frame sizes this may perform sub-optimally. Eg.:
14 When set to detect 440Hz (at 8000Hz samplerate and ~4000 samples)
15 it actually detects something around 438,3Hz rather than 400Hz...
16 If you can't increase samplerate way around this is just to increase sensitivity.
20 float floatnumSamples
;
21 float omega
,sine
,cosine
,coeff
,q0
,q1
,q2
,magnitude
,real
,imag
;
23 float scalingFactor
= numSamples
/ 2.0;
25 floatnumSamples
= (float) numSamples
;
26 k
= (int) (0.5 + ((floatnumSamples
* TARGET_FREQUENCY
) / SAMPLING_RATE
));
27 omega
= (2.0 * M_PI
* k
) / floatnumSamples
;
35 for(i
=0; i
<numSamples
; i
++)
37 q0
= coeff
* q1
- q2
+ data
[i
];
42 // calculate the real and imaginary results
43 // scaling appropriately
44 real
= (q1
- q2
* cosine
) / scalingFactor
;
45 imag
= (q2
* sine
) / scalingFactor
;
47 magnitude
= sqrtf(real
*real
+ imag
*imag
);
53 int samples[] = {0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1};
55 float power = goertzel(samplecount, samples, 1.2, 18);
56 printf("G: %f\n", power);
59 int samplerate
= 8000;
60 int samplecount
= 4000;
61 float samples
[samplecount
];
63 fprintf(stderr
,"Position (Secs)\tMagnitude\n");
66 for(i
=0;i
<samplecount
&& !feof(stdin
);i
++) {
68 fread(&sample
,1,1,stdin
);
70 //printf("%d\n", sample);
72 position
+= ((float)samplecount
/(float)samplerate
);
73 float power
= goertzel_mag(samplecount
, 440, samplerate
, samples
);
74 printf("%f\t%f\n", position
, power
);
This page took 0.587745 seconds and 4 git commands to generate.