189 lines
5.1 KiB
Plaintext
189 lines
5.1 KiB
Plaintext
|
|
****************************************************************************
|
||
|
|
|
||
|
|
Cfft2_2191_Px.asm Example 2191 complex radix-2 FFT Program
|
||
|
|
|
||
|
|
Analog Devices, Inc.
|
||
|
|
DSP Division
|
||
|
|
Three Technology Way
|
||
|
|
P.O. Box 9106
|
||
|
|
Norwood, MA 02062
|
||
|
|
|
||
|
|
23-JUNE-2001 BJM
|
||
|
|
|
||
|
|
This directory contains an example ADSP-2191 single-core subroutine
|
||
|
|
that implements radix-2 FFT of length 64 or greater on input data x(n). A
|
||
|
|
detailed discussion of the complex radix-2 FFT algorithm can be found in the
|
||
|
|
source header comments of "CFFT2_2191.ASM".
|
||
|
|
|
||
|
|
Files contained in this directory:
|
||
|
|
|
||
|
|
CFFT2_2191.ASM ADSP-2191 source for a complex radix-2 FFT example.
|
||
|
|
ADSP-2191.LDF Linker description file for the CFFT2_2191.ASM example
|
||
|
|
CFFT2_2191.DPJ The VisualDSP project file for the complex radix-2 FFT.
|
||
|
|
INPUTREAL.DAT Real part of complex input data
|
||
|
|
INPUTIMAG.DAT Imaginary part of complex input data
|
||
|
|
TWID_SIN.DAT Sin array FFT twiddle factors
|
||
|
|
TWID_COS.DAT Cos array FFT twiddle factors
|
||
|
|
|
||
|
|
_________________________________________________________________
|
||
|
|
|
||
|
|
CONTENTS
|
||
|
|
|
||
|
|
I. FUNCTION/ALGORITHM DESCRIPTION
|
||
|
|
II. IMPLEMENTATION DESCRIPTION
|
||
|
|
III. DESCRIPTION OF INPUT DATA
|
||
|
|
1. Input Samples
|
||
|
|
2. Twiddle factors
|
||
|
|
|
||
|
|
_______________________________________________________________
|
||
|
|
|
||
|
|
I. FUNCTION/ALGORITHM DESCRIPTION
|
||
|
|
|
||
|
|
The program CFFT2_2191.ASM is an implementation of a complex input radix-2 DIT
|
||
|
|
FFT.
|
||
|
|
|
||
|
|
This radix-2 FFT routine will take data lengths that are any power of two (>= 64
|
||
|
|
points).
|
||
|
|
|
||
|
|
|
||
|
|
II. IMPLEMENTATION DESCRIPTION
|
||
|
|
|
||
|
|
This FFT implementation takes advantage of the architecture of the
|
||
|
|
ADSP-2191.
|
||
|
|
|
||
|
|
The following table of variables and their location is presented, where "N" is
|
||
|
|
the length of the FFT:
|
||
|
|
|
||
|
|
Input Output
|
||
|
|
Routine DM PM DM PM
|
||
|
|
-------------------------------------------------------------------------------
|
||
|
|
CFFT2_2191:
|
||
|
|
inputreal[N] refft[N] inputreal[N]
|
||
|
|
inputimag[N]
|
||
|
|
twid_imag[N/2]
|
||
|
|
twid_real[N/2]
|
||
|
|
--------------------------------------------------------------------------------
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
inputreal[N] Real part of normal-ordered complex input stored in DM
|
||
|
|
inputimag[N] Imaginary part of normal-ordered complex input stored in PM
|
||
|
|
refft[N] Real part of frequency domain data (fft output) stored in DM
|
||
|
|
twid_imag[N] Sin table stored in DM
|
||
|
|
twid_real[N] Cos table stored in DM
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
III. DESCRIPTION OF INPUT DATA
|
||
|
|
|
||
|
|
1. INPUT SAMPLES:
|
||
|
|
-----------------
|
||
|
|
|
||
|
|
This FFT routine expects input data which conforms to the following criteria:
|
||
|
|
|
||
|
|
Gather input data such that an array of complex fixed point values are
|
||
|
|
arranged in the following order:
|
||
|
|
|
||
|
|
inputreal[N]:
|
||
|
|
real(0)
|
||
|
|
real(1)
|
||
|
|
real(2)
|
||
|
|
etc...
|
||
|
|
|
||
|
|
inputimag[N]:
|
||
|
|
imag(0)
|
||
|
|
imag(1)
|
||
|
|
imag(2)
|
||
|
|
etc...
|
||
|
|
|
||
|
|
|
||
|
|
2. TWIDDLE FACTOR DATA:
|
||
|
|
-----------------------
|
||
|
|
|
||
|
|
This FFT routine expects N/2 fixed point values of one half period of a
|
||
|
|
sine waveform and N/2 fixed point values of a one half period of a cosine
|
||
|
|
waveform to be used as twiddle factors. These twiddles should be in
|
||
|
|
a bit-reversed order.
|
||
|
|
|
||
|
|
Generate twiddle data such that an array of twiddle factor values are
|
||
|
|
arranged in the following order:
|
||
|
|
|
||
|
|
cos(0)
|
||
|
|
cos(1)
|
||
|
|
cos(2)
|
||
|
|
...
|
||
|
|
...
|
||
|
|
...
|
||
|
|
cos(N/2)
|
||
|
|
|
||
|
|
sin(0)
|
||
|
|
sin(1)
|
||
|
|
sin(2)
|
||
|
|
...
|
||
|
|
...
|
||
|
|
...
|
||
|
|
sin(N/2)
|
||
|
|
|
||
|
|
Then, bit reverse these sin and cosine twiddle arrays. This can be done by
|
||
|
|
writing a small bit reversal program which utilizes the bit reversed
|
||
|
|
addressing mode of DAG1 of the ADSP-2191.
|
||
|
|
|
||
|
|
The bit reversed array of twiddle factor values are arranged in the following
|
||
|
|
order:
|
||
|
|
|
||
|
|
twid_real[N]:
|
||
|
|
|
||
|
|
cos(0)
|
||
|
|
cos(N/4)
|
||
|
|
cos(N/8)
|
||
|
|
...
|
||
|
|
...
|
||
|
|
...
|
||
|
|
cos(N/2)
|
||
|
|
|
||
|
|
twid_imag[N]:
|
||
|
|
|
||
|
|
sin(0
|
||
|
|
sin(N/4)
|
||
|
|
sin(N/8)
|
||
|
|
...
|
||
|
|
...
|
||
|
|
...
|
||
|
|
sin(N/2)
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
2191 - Complex Radix-2 FFT (Cfft2_2191.asm)
|
||
|
|
|
||
|
|
In order to perform FFTs of different lengths, the following code changes are
|
||
|
|
necessary:
|
||
|
|
(The rules/relations described in the source code must be followed!)
|
||
|
|
|
||
|
|
- Modify N to reflect the length of the FFT to be performed (N must be a power of 2)
|
||
|
|
- Modify log2n such that STAGES = (log2(N))
|
||
|
|
- Mofify Mod_Value such that Mod_Value = ( 2^(16-LOG2N) )
|
||
|
|
- Modifiy Refft_Bitrev and Inputreal_Bitrev to represent the bit reversed
|
||
|
|
address of the output real and imaginary buffers
|
||
|
|
|
||
|
|
Cfft2_2191.asm code excerpt shown below:
|
||
|
|
|
||
|
|
/**********The constants below must be changed for different length FFTs*******
|
||
|
|
|
||
|
|
N = number of points in the FFT, must be a power of 2
|
||
|
|
log2N = log2(N)
|
||
|
|
Mod_Value = 2^(16-LOG2N)
|
||
|
|
Refft_Bitrev = bitrev addr of output real in dm
|
||
|
|
Inputreal_Bitrev = bitrev addr of output imag in dm
|
||
|
|
|
||
|
|
******************************************************************************/
|
||
|
|
|
||
|
|
/* Set Constants for N-point FFT */
|
||
|
|
#define N 1024
|
||
|
|
#define Ndiv2 (N/2)
|
||
|
|
#define log2N 10
|
||
|
|
#define Mod_Value 64
|
||
|
|
#define Refft_Bitrev 0x0001
|
||
|
|
#define Inputreal_Bitrev 0x0009
|
||
|
|
|
||
|
|
|