On Wed, 06 Dec 2006 09:27:55 -0600, "peterk" <pkobl@hotmail.com>
wrote:
>
>thanks for helping, Rick
>
>>Ah ha, you have a somewhat special case
>>here. Your filter is centered at Fs/4 !!!
>>(Fs is the sampling freq.)
>>
>
>so I can't use this algorithm (because Ft=Fs/4)?
>or is the algorithm still OK?
>
>regards,
> Peterk
Hi,
Sorry for the delayed reply.
Yes, the Goertzel algo still works
when your filter is centered at Fs/4.
Goos Luck,
[-Rick-]
Reply by peterk●December 6, 20062006-12-06
thanks for helping, Rick
>Ah ha, you have a somewhat special case
>here. Your filter is centered at Fs/4 !!!
>(Fs is the sampling freq.)
>
so I can't use this algorithm (because Ft=Fs/4)?
or is the algorithm still OK?
regards,
Peterk
Reply by ●December 6, 20062006-12-06
> I have been wondering if Goertzel depends on some degree of
> synchronization between the sampling rate frequency and the frequency
> that you wish to detect. As an example you could consider the case
> where the sampling frequency is 2x the detection frequency. Theoretically
> the sampling could occur exactly at the zero crossings of the
> detection frequency. Looking at the algorithm I can't see why it
> would not miss that.
You're right; that's one reason why you shouldn't in any real
implementation sample at the Nyquist rate. The underlying concept
behind the Goertzel algorithm is that it is just an efficient way to
compute a small number of DFT points without doing a full-blown FFT.
For instance, if you have a block of 1024 samples and compute its FFT,
you generate 1024 frequency bins at the output. If you only have a few
frequencies of interest, then you can use the Goertzel algorithm to
perform the same calculation, only with less computational complexity.
You can use the Goertzel algorithm to generate, say, 4 bins for
specific frequencies faster than you could calculate an FFT on the
entire block. So, you should expect the same characteristics in the
Goertzel output as you would expect from a DFT.
Jason
Reply by Rick Lyons●December 6, 20062006-12-06
On Tue, 05 Dec 2006 05:14:56 -0600, "peterk" <pkobl@hotmail.com>
wrote:
>Hello,
Hello Peterk,
>
> I am designing my first digital filter (for an msp430F2012).
> I am trying to detect an 8,192kHz audio signal and I have some
> questions that I hope somebody will help me with.
>
> First, it's a 10 bit ADC with an output in the range
> 0x0000 to 0x03FF. The input voltages are centered around
> 0.75 volts and swing nicely around the 0.75 volts.
> The ADC reading is close to 0x0200 at 0.75 volts.
>
> I have some flexibility in the sampling rate
> but would prefer it to be a divisible of 32.768 kHz, i.e.
> 32768/X (X=1,2,4..). My current sampling frequency is 32.768kHz.
Ah ha, you have a somewhat special case
here. Your filter is centered at Fs/4 !!!
(Fs is the sampling freq.)
>
> I have been using the algorith described in Kevin Bank's article
> from embedded.com of August/2002
>http://www.embedded.com//showArticle.jhtml?articleID=9900722
> (430 assembler, not C).
>
> I have:
> block size (N) = 32
> k accordingly should be
> k=(int)(0.5 + ((N * 8192)/32768))k= 0.5 + 8
> which gives k= 8
> w then becomes
> w = (2*PI/N)*k = 1.5707963267948966192313216916398
> cosine = cos(w) = 0
> and coeff
> coeff = 2 * cosine = 0
Your coeff=0 because your filter is centered at Fs/4.
>
> For each sample the described algorithm calls for performing
> Q0 = coeff * Q1 - Q2 + sample
> Q2 = Q1
> Q1 = Q0
>
>OK, I hope you are still there (I am getting to my questions now).
>
>1) As for the ADC sample readings. Should these be signed and perhaps
> offset compensated before being used in the algorithm? I.E. should
> reading 0x0200 become 0x0000 and all readings have 0x0200 subtracted?
> Or can I perhaps use them as is?
>2) As for the "Q0 = coeff * Q1 - Q2 + sample" of the algorithm, could
> that (RELLY?) reduce to "Q0 = -Q2 + sample" (since my coeff = 0)?
Yes, because your filter is centered at Fs/4.
>
>3) yes, block size (32) is very small. I know that it gives a wide
> bandwidth (32,768/32 ~ about 1K). Assuming a realtively strong
> signal, i.e. an 8kHz signal of a substantially higher amplitude
> than any noise source, would this block size be sufficient?
> Well it can't really be larger (for reasons of battery economy)
> and negative answers will not be appreciated. (;-])
Peterk, I'm a little suspicious of the article's
description of the Goertzel algorithm. The author
uses VERY non-standard notation for his discrete
sequences, all the time while giving no
block diagram of the process. As such, as a reader
I'm forced to makes guesses at what I think is his process.
OK, with that said, I was puzzled when I read:
"After running the per-sample equations N times,
it's time to see if the tone is present or not.
real = (Q1 - Q2 * cosine)
imag = (Q2 * sine) ........"
Shouldn't that be:
real = (Q0 - Q1 * cosine)
imag = (Q1 * sine) ........" ??
I certainly could be wrong.
>I have been wondering if Goertzel depends on some degree of
>synchronization between the sampling rate frequency and the frequency
>that you wish to detect.
Not that I know of. It's a common misconception
that variable "k" must be an integer. As it turns
out, the Goertzel algo works just fine for
non-integer values of "k".
>As an example you could consider the case
>where the sampling frequency is 2x the detection frequency. Theoretically
>the sampling could occur exactly at the zero crossings of the
>detection frequency. Looking at the algorithm I can't see why it
>would not miss that.
Am not exactly sure what you're saying here,
but if k = N/2, then your filter is centered at
Fs/2. And that is another "special case".
I'm afraid to say (off the top of my head)
any more about that special scenario.
The best place I can direct you are two
articles in the IEEE Signal Processing
Magazine:
(1) Page 74 of the March 2003 issue, and
(2) page 110 of the jan. 2004 issue.
(It's best if you read both articles.)
Or else ya' might have a look at:
http://www.numerix-dsp.com/goertzel.htmlhttp://cnx.org/content/m12024/latest/
>
>thanks a lot for yout time!
> Peterk
Good Luck,
[-Rick-]
Reply by peterk●December 5, 20062006-12-05
Hello,
I am designing my first digital filter (for an msp430F2012).
I am trying to detect an 8,192kHz audio signal and I have some
questions that I hope somebody will help me with.
First, it's a 10 bit ADC with an output in the range
0x0000 to 0x03FF. The input voltages are centered around
0.75 volts and swing nicely around the 0.75 volts.
The ADC reading is close to 0x0200 at 0.75 volts.
I have some flexibility in the sampling rate
but would prefer it to be a divisible of 32.768 kHz, i.e.
32768/X (X=1,2,4..). My current sampling frequency is 32.768kHz.
I have been using the algorith described in Kevin Bank's article
from embedded.com of August/2002
http://www.embedded.com//showArticle.jhtml?articleID=9900722
(430 assembler, not C).
I have:
block size (N) = 32
k accordingly should be
k=(int)(0.5 + ((N * 8192)/32768))k= 0.5 + 8
which gives k= 8
w then becomes
w = (2*PI/N)*k = 1.5707963267948966192313216916398
cosine = cos(w) = 0
and coeff
coeff = 2 * cosine = 0
For each sample the described algorithm calls for performing
Q0 = coeff * Q1 - Q2 + sample
Q2 = Q1
Q1 = Q0
OK, I hope you are still there (I am getting to my questions now).
1) As for the ADC sample readings. Should these be signed and perhaps
offset compensated before being used in the algorithm? I.E. should
reading 0x0200 become 0x0000 and all readings have 0x0200 subtracted?
Or can I perhaps use them as is?
2) As for the "Q0 = coeff * Q1 - Q2 + sample" of the algorithm, could
that (RELLY?) reduce to "Q0 = -Q2 + sample" (since my coeff = 0)?
3) yes, block size (32) is very small. I know that it gives a wide
bandwidth (32,768/32 ~ about 1K). Assuming a realtively strong
signal, i.e. an 8kHz signal of a substantially higher amplitude
than any noise source, would this block size be sufficient?
Well it can't really be larger (for reasons of battery economy)
and negative answers will not be appreciated. (;-])
I have been wondering if Goertzel depends on some degree of
synchronization between the sampling rate frequency and the frequency
that you wish to detect. As an example you could consider the case
where the sampling frequency is 2x the detection frequency. Theoretically
the sampling could occur exactly at the zero crossings of the
detection frequency. Looking at the algorithm I can't see why it
would not miss that.
thanks a lot for yout time!
Peterk