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



Thanks - will have to have a play with it!

RP



On 21 Apr 2004 at 8:52, Richard.ProsserKILLspamspam@spam@POWERWARE.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
               add     intemp, prdl
               adc     genl, prdh
               adc     genh, zero

               mulsu math, auxl                ; (signed)Q1h * Coeffl
               sbc     genh, zero
               add     intemp, prdl
               adc     genl, prdh
               adc     genh, zero              ; (Q1*Coeff)>>16

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

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

               add     genl, XL
               adc     genh, XH                        ; Add current
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
TakeThisOuTpiclist-unsubscribe-request@spam@spammitvma.mit.edu

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

--
http://www.piclist.com hint: PICList Posts must start with ONE topic:
[PIC]:,[SX]:,[AVR]: ->uP ONLY! [EE]:,[OT]: ->Other [BUY]:,[AD]: ->Ads

<OF18A9DF32.723FB8A9-ONCC256E7D.0001ACB4@psd.invensys.com>

See also: www.piclist.com/techref/logic/dsps.htm?key=fft
Reply You must be a member of the piclist mailing list (not only a www.piclist.com member) to post to the piclist. This form requires JavaScript and a browser/email client that can handle form mailto: posts.
Subject (change) Looking for an AVR FFT tutorial

month overview.

new search...