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
Normalizing the magnitude of Goertzel Filter c#
Started by ●May 28, 2015