I'm trying to detect some frequencies of 18Khz with sample rate of 44100
[samples/sec].
When I pass a buffer(~4500 samples) to the algorithm it returns a
magnitude in a very strange range. Sometimes i get 0.1, or 7 or 250(!) or
154 or 25000 - very strange. I can't decide on a threshold boundary for
the filter. Is there any way noramlizing that result? (My result is the
magnitude of the complex calculation of real and image)
This is my Goertzel code:
public float goertzel_mag(float[] data,int numSamples, int
TARGET_FREQUENCY, int SAMPLING_RATE,int start,int end)
{
int k, i;
float floatnumSamples;
float omega, sine, cosine, coeff, q0, q1, q2, magnitude, real,
imag;
float scalingFactor = (float)(numSamples / 2.0);
floatnumSamples = (float)numSamples;
k = (int)(0.5 + ((floatnumSamples * TARGET_FREQUENCY) /
SAMPLING_RATE));
omega = (float)(2.0 * Math.PI * k) / floatnumSamples;
sine = (float)Math.Sin(omega);
cosine = (float)Math.Cos(omega);
coeff = (float)2.0 * cosine;
q0 = 0;
q1 = 0;
q2 = 0;
for (i = start; i < end; i++)
{
q0 = coeff * q1 - q2 + data[i];
q2 = q1;
q1 = q0;
}
// calculate the real and imaginary results
// scaling appropriately
real = (q1 - q2 * cosine) / scalingFactor;
imag = (q2 * sine) / scalingFactor;
magnitude = (float)Math.Sqrt(real * real + imag * imag);
return magnitude;
}
---------------------------------------
Posted through http://www.DSPRelated.com