piclist 2004\04\21\024050a >
Thread: Looking for an AVR FFT tutorial
www.piclist.com/techref/logic/dsps.htm?key=fft
BY : Richard.ProsserTakeThisOuT@STOPspamPOWERWARE.COM

Thanks - will have to have a play with it!

RP

On 21 Apr 2004 at 8:52, Richard.ProsserPOWERWARE.COM wrote:

> The web site I used for my initial code was (I think)
> http://www.8052.com/users/steve/FFTC.C, which is an FFT example for the
> 8052 micro.

Thanks, that seems to be a very good example!

> As far as comparing the Goertzel algorithm with the FFT I think it is a
> question of what you are actually trying to do.
> My impression is that the Goertzel algorithm aims at identifying a single
> frequency component in a signal, basically using a IIR filter. It is
> capable of running more or less "on the fly" once a certain number of
> samples have been obtained.

I do the eight filters at every sample. When I reach N samples,
I compute the eight magnitudes and get the two DTMF frequencies. The
whole process used less than 20mS at 4MHz clock.

>
> Incidentally, I'd be interested in looking at you Goertzel implementation
> if possible!

Here is a MACRO I used at every sample, based on that article at:

http://www.embedded.com/story/OEG20020819S0057

;
; At every sample, calculate for each frequency:
;
; Q0 = (coeff*Q1)/32768-Q2+sample
; Move Q1 to Q2
; Move Q0 to Q1
;
macro SAMPLE                                   ; Q1l,Q1h,Q2l,Q2h,Coeff
ldi     auxl, LOW(@4)
ldi     auxh, HIGH(@4)
lds     matl, @0
lds     math, @1
muls    math, auxh              ; (signed)Q1h *
(signed)Coeffh
movw    genl, prdl

mul     matl, auxl              ; Q1l * Coeffl
mov     intemp, prdh

mulsu auxh, matl                ; (signed)Coeffh * Q1l
sbc     genh, zero

mulsu math, auxl                ; (signed)Q1h * Coeffl
sbc     genh, zero

lsl     genl
rol     genh                            ; (Q1*Coeff)<<1

lds     auxl, @2
lds     auxh, @3
sub     genl, auxl
sbc     genh, auxh              ; Sub Q2

sample

sts     @0, genl
sts     @1, genh                        ; Q1 = Q0

sts     @2, matl                        ; Q2 = Q1
sts     @3, math
endmacro                                               ; 45 clock cycles
;
;
; After N samples, calculate for each frequency:
;
; MAG = SQRT(Q1*Q1+Q2*Q2-(Q1*Q2*coeff)/32768)
;

Mark Jordan

--
http://www.piclist.com hint: To leave the PICList
piclist-unsubscribe-requestmitvma.mit.edu

--
http://www.piclist.com hint: To leave the PICList
piclist-unsubscribe-requestmitvma.mit.edu

--