Add real ADSP-2191 assembly examples + open21xx assembler test
This commit is contained in:
115
examples/adsp-2191_complex_rad2_fft/ADSP-2191.ldf
Normal file
115
examples/adsp-2191_complex_rad2_fft/ADSP-2191.ldf
Normal file
@@ -0,0 +1,115 @@
|
||||
|
||||
ARCHITECTURE(ADSP-2191)
|
||||
|
||||
$OBJECTS = $COMMAND_LINE_OBJECTS;
|
||||
// This memory map is set up to facilite testing of the tool
|
||||
// chain -- code and data area are as large as possible.
|
||||
|
||||
MEMORY
|
||||
{
|
||||
seg_dmy { TYPE(PM RAM) START(0x000000) END(0x000003) WIDTH(24) }
|
||||
seg_itab { TYPE(PM RAM) START(0x000004) END(0x00003f) WIDTH(24) }
|
||||
seg_code { TYPE(PM RAM) START(0x000040) END(0x003fff) WIDTH(24) }
|
||||
|
||||
seg_buf2 { TYPE(DM RAM) START(0x008000) END(0x008fff) WIDTH(16) }
|
||||
seg_buf1 { TYPE(DM RAM) START(0x009000) END(0x0095ff) WIDTH(16) }
|
||||
seg_data1 { TYPE(DM RAM) START(0x009600) END(0x00afff) WIDTH(16) }
|
||||
seg_data2 { TYPE(PM RAM) START(0x004000) END(0x006bff) WIDTH(24) }
|
||||
seg_heap { TYPE(DM RAM) START(0x00f200) END(0x00f9ff) WIDTH(16) }
|
||||
seg_stack { TYPE(DM RAM) START(0x00fa00) END(0x00ffff) WIDTH(16) }
|
||||
}
|
||||
|
||||
PROCESSOR p0
|
||||
{
|
||||
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST)
|
||||
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
sec_dmy
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVreset))
|
||||
} > seg_dmy
|
||||
|
||||
sec_itab
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVpwrdwn))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVkernel))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVstackint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVmailboxint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVtimerint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVringint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVpcibmint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVdspdspint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint13))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint14))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVac97frint))
|
||||
. = .+0x1;
|
||||
} > seg_itab
|
||||
seg_code
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(program) )
|
||||
} >seg_code
|
||||
|
||||
sec_buf1
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf1) )
|
||||
}>seg_buf1
|
||||
|
||||
sec_buf2
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf2) )
|
||||
}>seg_buf2
|
||||
|
||||
sec_data1
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data1) )
|
||||
} >seg_data1
|
||||
|
||||
sec_data2
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data2) )
|
||||
INPUT_SECTIONS( $OBJECTS(program2) )
|
||||
} >seg_data2
|
||||
|
||||
|
||||
// support for initialization, including C++
|
||||
sec_ctor
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(ctor))
|
||||
} >seg_data1
|
||||
|
||||
// provide linker variables describing the stack (grows down)
|
||||
// ldf_stack_limit is the lowest address in the stack
|
||||
// ldf_stack_base is the highest address in the stack
|
||||
sec_stack
|
||||
{
|
||||
ldf_stack_limit = .;
|
||||
ldf_stack_base = . + MEMORY_SIZEOF(seg_stack) - 1;
|
||||
} >seg_stack
|
||||
sec_heap
|
||||
{
|
||||
.heap = .;
|
||||
.heap_size = MEMORY_SIZEOF(seg_heap);
|
||||
.heap_end = . + MEMORY_SIZEOF(seg_heap) - 1;
|
||||
} >seg_heap
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
****************************************************************************
|
||||
|
||||
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
|
||||
|
||||
|
||||
181
examples/adsp-2191_complex_rad2_fft/Cfft2_2191.asm
Normal file
181
examples/adsp-2191_complex_rad2_fft/Cfft2_2191.asm
Normal file
@@ -0,0 +1,181 @@
|
||||
/******************************************************************************
|
||||
Cfft2_2191.ASM ADSP-2191 Radix-2 DIT Complex FFT
|
||||
|
||||
Performs a radix-2 DIT FFT of length 64 or greater on input data x(n).
|
||||
|
||||
N Real part of normal-ordered complex input stored in DM
|
||||
N Imaginary part of normal-ordered complex input stored in PM
|
||||
N Real part of fft stored in DM
|
||||
N/2 Sin table stored in DM
|
||||
N/2 Cos table stored in PM
|
||||
|
||||
Calling Information:
|
||||
pm(twid_real[N/2]) - sin(2pi*n/N) table in bitreversed order
|
||||
dm(twid_imag[N/2]) - cos(2pi*n/N) table in bitreversed order
|
||||
|
||||
dm(Inputreal[N]) - Real part of complex input array stored in dm
|
||||
pm(Inputimag[N]) - Imaginary part of complex input array stored in pm
|
||||
|
||||
Results:
|
||||
dm(Refft[N]) - Real FFT results ordered sequentially
|
||||
dm(Inputreal[N]) - Imaginary FFT results ordered sequentially
|
||||
|
||||
Benchmarks:
|
||||
FFT Length cycles time (us) 160MHz
|
||||
---------- ------------- ---------------
|
||||
1024 24160 151
|
||||
|
||||
Memory Usage:
|
||||
PM code(24-bit) = 92 words
|
||||
PM data(24-bit) = N + 2 + N/2 words
|
||||
DM data(16-bit) = 2N + 4 + N + 1 words
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
/**********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
|
||||
|
||||
|
||||
/* DM data */
|
||||
.section/data data1;
|
||||
.VAR twid_imag [Ndiv2] = "twid_sin.dat";
|
||||
.VAR groups = 1;
|
||||
.VAR node_space = Ndiv2;
|
||||
|
||||
/* DM data */
|
||||
.section/data seg_buf1;
|
||||
.VAR Inputreal [N+2] = "inreal.dat";
|
||||
|
||||
/* DM data */
|
||||
.section/data seg_buf2;
|
||||
.VAR Refft[N+2];
|
||||
|
||||
/* PM data */
|
||||
.section/pm data2;
|
||||
.VAR/init24 twid_real [Ndiv2] = "twid_cos.dat";
|
||||
.VAR Inputimag [N+2] = "inimag.dat";
|
||||
|
||||
/* PM interrupt vector code */
|
||||
.section/pm IVreset;
|
||||
JUMP start; NOP; NOP;
|
||||
|
||||
|
||||
/* Program Code */
|
||||
.section/pm program;
|
||||
start:
|
||||
dmpg2 = page(twid_real); /* Initialize page for PM data */
|
||||
M0 = 0;
|
||||
L0 = length(twid_imag); /* Initialize twid_imag circular buffer */
|
||||
AX1 = twid_imag;
|
||||
REG(b0) = AX1; /* Initialize pointer to twid_imag */
|
||||
M1 = 1;
|
||||
L1 = 0; /* Initialize for modulo addressing */
|
||||
M4 = 0;
|
||||
L4 = length(twid_real); /* Initialize twid_real circular buffer */
|
||||
AX1 = twid_real;
|
||||
REG(b4) = AX1; /* Initialize pointer to twid_real */
|
||||
M5 = 1;
|
||||
L5 = 0; /* Initialize for modulo addressing */
|
||||
M6 = -1;
|
||||
L6 = 0; /* Initialize for modulo addressing */
|
||||
L2 = 0;
|
||||
L3 = 0;
|
||||
L7 = 0;
|
||||
|
||||
CNTR = log2N -1; /* Initialize Stage Counter */
|
||||
DO stage_loop UNTIL CE; /* Compute all stages in FFT */
|
||||
I0 = twid_imag; /* I0 --> (-S) of W0 */
|
||||
I1 = Inputreal; /* I1 --> x1 in 1st group of stage */
|
||||
I2 = Inputreal; /* I2 --> x0 in 1st group of stage */
|
||||
I4 = twid_real; /* I4 --> C of W0 */
|
||||
I5 = Inputimag; /* I5 --> y1 in 1st group of stage */
|
||||
I6 = Inputimag; /* I6 --> y0 in 1st group of stage */
|
||||
SI = DM(groups);
|
||||
CNTR = SI; /* CNTR = # of groups in stage */
|
||||
SR = LSHIFT SI BY 1(LO);
|
||||
DM(groups) = SR0;
|
||||
SI = DM(node_space); /* SI = node_space modifier */
|
||||
M2 =SI;
|
||||
M7 =SI;
|
||||
MODIFY(I1,M2); /* I1 --> x1 in 1st group of stage */
|
||||
MODIFY(I5,M7); /* I5 --> y1 in 1st group of stage */
|
||||
DO group_loop UNTIL CE;
|
||||
MY0 = PM(I4,M5), MX0 = DM(I1,M0); /* MY0=C, MX0=x1 */
|
||||
MR = MX0*MY0(SS), MX1 = PM(I5,M4); /* MR=C*x1,MX1=y1 */
|
||||
MY1 = DM(I0,M1); /* MY1 = (-S) */
|
||||
CNTR = SI; /* CNTR = butterfly counter */
|
||||
DO bfly_loop UNTIL CE;
|
||||
MR = MR-MX1*MY1(RND), AY0 = DM(I2,M0); /* MR=x1*C-y1*-S, AY0=x0 */
|
||||
AR = MR1+AY0, AX1 = PM(I5,M5); /* AR=x0'=x0+(x1*C-y1*-S) */
|
||||
DM(I2,M1) = AR, AR = AY0-MR1; /* DM=x0', AR=x1'=x0-(x1*C-y1*(-S)) */
|
||||
MR = MX0*MY1(SS), DM(I1,M1) = AR; /* MR=x1*(-S), DM=x1' */
|
||||
MR = MR+MX1*MY0(RND), AY1 = PM(I6,M4), MX0 = DM(I1,M0); /*MR=x1*(-S)+y1*C, AY1=y0, MX0=next x1*/
|
||||
AR = MR1+AY1, MX1 = PM(I5,M6); /* AR=y0'=y0+(y1*C+x1*(-S)), MX1= next y1 */
|
||||
PM(I6,M5) = AR, AR = AY1-MR1; /* PM=y0', AR=y1'=y0-(y1*C+x1*(-S)) */
|
||||
bfly_loop:
|
||||
MR = MX0*MY0(SS), PM(I5,M5) = AR; /* PM=y1' */
|
||||
MY0 = PM(I5,M7), MX0 = DM(I1,M2);
|
||||
group_loop:
|
||||
MY0=PM(I6,M7), MX0=DM(I2,M2);
|
||||
SR=ASHIFT SI BY -1 (LO);
|
||||
stage_loop:
|
||||
DM(node_space)=SR0;
|
||||
|
||||
I0 = twid_imag; /* I0 --> (-S) */
|
||||
I1 = Inputreal; /* I1 --> x1 */
|
||||
I2 = Inputreal; /* I2 --> x0 */
|
||||
M2 = 2;
|
||||
I3 = Refft_Bitrev; /* Refft bitreversed */
|
||||
M3 = Mod_Value; /* Bitreversed modifier */
|
||||
I4 = twid_real; /* I4 --> C */
|
||||
I5 = Inputimag; /* I5 --> y1 */
|
||||
I6 = Inputimag; /* I6 --> y0 */
|
||||
M6 = 2;
|
||||
MODIFY(I1,M1); /* I1 -->x1 */
|
||||
MODIFY(I5,M5); /* I5 -->y1 */
|
||||
MY0 = PM(I4,M5), MX0 = DM(I1,M2); /* MY0=C, MX0=x1 */
|
||||
MR = MX0*MY0(SS), MX1 = PM(I5,M6); /* MR = C*x1, MX1 = y1 */
|
||||
MY1 = DM(I0,M1); /* MY1 = (-S) */
|
||||
CNTR = Ndiv2;
|
||||
DO last_loop UNTIL CE;
|
||||
MR = MR-MX1*MY1(RND), AY0 = DM(I2,M2); /* MR=x1*C-y1*(-S), AY0=x0 */
|
||||
AR = MR1+AY0, AY1 = PM(I6,M4); /* AR=x0'=x0+(x1*C-y1*(-S)), AY1=y0 */
|
||||
ENA BIT_REV;
|
||||
DM(I3,M3) = AR, AR = AY0-MR1; /* Read real data */
|
||||
MR = MX0*MY1(SS), DM(I3,M3) = AR; /* Place in sequential order(using bit-reversal) */
|
||||
DIS BIT_REV;
|
||||
MR = MR+MX1*MY0(RND), MY0 = PM(I4,M5), MX0 = DM(I1,M2);
|
||||
AR = MR1+AY1, MX1 = PM(I5,M6); /* AR=y0'=y0+(y1*C+x1*(-S)), MX1= next y1 */
|
||||
PM(I6,M5) = AR, AR = AY1-MR1; /* PM=y0', AR=y1'=y0-(y1*C+x1*(-S)) */
|
||||
MY1 = DM(I0,M1); /* MY1 = (-S) */
|
||||
last_loop:
|
||||
MR = MX0*MY0(SS), PM(I6,M5) = AR; /*PM=y1' */
|
||||
|
||||
I3 = Inputreal_Bitrev;
|
||||
M3 = Mod_Value; /* Bitreversed modifier */
|
||||
I5 = Inputimag;
|
||||
ENA BIT_REV;
|
||||
CNTR = N;
|
||||
DO bit_rev_imag UNTIL CE;
|
||||
AX0 = PM(I5,M5); /* Read imaginary data */
|
||||
bit_rev_imag: DM(I3,M3) = AX0; /* Place in sequential order */
|
||||
DIS BIT_REV;
|
||||
|
||||
looping: JUMP looping;
|
||||
|
||||
|
||||
BIN
examples/adsp-2191_complex_rad2_fft/Cfft2_2191.dpj
Normal file
BIN
examples/adsp-2191_complex_rad2_fft/Cfft2_2191.dpj
Normal file
Binary file not shown.
1026
examples/adsp-2191_complex_rad2_fft/inimag.dat
Normal file
1026
examples/adsp-2191_complex_rad2_fft/inimag.dat
Normal file
File diff suppressed because it is too large
Load Diff
1026
examples/adsp-2191_complex_rad2_fft/inreal.dat
Normal file
1026
examples/adsp-2191_complex_rad2_fft/inreal.dat
Normal file
File diff suppressed because it is too large
Load Diff
512
examples/adsp-2191_complex_rad2_fft/twid_cos.dat
Normal file
512
examples/adsp-2191_complex_rad2_fft/twid_cos.dat
Normal file
@@ -0,0 +1,512 @@
|
||||
0x7FFF00
|
||||
0x000000
|
||||
0x5A8200
|
||||
0xA57E00
|
||||
0x764200
|
||||
0xCF0400
|
||||
0x30FC00
|
||||
0x89BE00
|
||||
0x7D8A00
|
||||
0xE70700
|
||||
0x471D00
|
||||
0x959200
|
||||
0x6A6E00
|
||||
0xB8E300
|
||||
0x18F900
|
||||
0x827600
|
||||
0x7F6200
|
||||
0xF37400
|
||||
0x513400
|
||||
0x9D0E00
|
||||
0x70E300
|
||||
0xC3A900
|
||||
0x252800
|
||||
0x858300
|
||||
0x7A7D00
|
||||
0xDAD800
|
||||
0x3C5700
|
||||
0x8F1D00
|
||||
0x62F200
|
||||
0xAECC00
|
||||
0x0C8C00
|
||||
0x809E00
|
||||
0x7FD900
|
||||
0xF9B800
|
||||
0x55F600
|
||||
0xA12900
|
||||
0x73B600
|
||||
0xC94600
|
||||
0x2B1F00
|
||||
0x877B00
|
||||
0x7C2A00
|
||||
0xE0E600
|
||||
0x41CE00
|
||||
0x923600
|
||||
0x66D000
|
||||
0xB3C000
|
||||
0x12C800
|
||||
0x816300
|
||||
0x7E9D00
|
||||
0xED3800
|
||||
0x4C4000
|
||||
0x993000
|
||||
0x6DCA00
|
||||
0xBE3200
|
||||
0x1F1A00
|
||||
0x83D600
|
||||
0x788500
|
||||
0xD4E100
|
||||
0x36BA00
|
||||
0x8C4A00
|
||||
0x5ED700
|
||||
0xAA0A00
|
||||
0x064800
|
||||
0x802700
|
||||
0x7FF600
|
||||
0xFCDC00
|
||||
0x584300
|
||||
0xA34C00
|
||||
0x750500
|
||||
0xCC2100
|
||||
0x2E1100
|
||||
0x889400
|
||||
0x7CE400
|
||||
0xE3F400
|
||||
0x447B00
|
||||
0x93DC00
|
||||
0x68A700
|
||||
0xB64C00
|
||||
0x15E200
|
||||
0x81E200
|
||||
0x7F0A00
|
||||
0xF05500
|
||||
0x4EC000
|
||||
0x9B1700
|
||||
0x6F5F00
|
||||
0xC0E900
|
||||
0x222400
|
||||
0x84A300
|
||||
0x798A00
|
||||
0xD7D900
|
||||
0x398D00
|
||||
0x8DAB00
|
||||
0x60EC00
|
||||
0xAC6500
|
||||
0x096B00
|
||||
0x805900
|
||||
0x7FA700
|
||||
0xF69500
|
||||
0x539B00
|
||||
0x9F1400
|
||||
0x725500
|
||||
0xC67300
|
||||
0x282700
|
||||
0x867600
|
||||
0x7B5D00
|
||||
0xDDDC00
|
||||
0x3F1700
|
||||
0x90A100
|
||||
0x64E900
|
||||
0xB14000
|
||||
0x0FAB00
|
||||
0x80F600
|
||||
0x7E1E00
|
||||
0xEA1E00
|
||||
0x49B400
|
||||
0x975900
|
||||
0x6C2400
|
||||
0xBB8500
|
||||
0x1C0C00
|
||||
0x831C00
|
||||
0x776C00
|
||||
0xD1EF00
|
||||
0x33DF00
|
||||
0x8AFB00
|
||||
0x5CB400
|
||||
0xA7BD00
|
||||
0x032400
|
||||
0x800A00
|
||||
0x7FFE00
|
||||
0xFE6E00
|
||||
0x596400
|
||||
0xA46300
|
||||
0x75A600
|
||||
0xCD9200
|
||||
0x2F8700
|
||||
0x892700
|
||||
0x7D3A00
|
||||
0xE57D00
|
||||
0x45CD00
|
||||
0x94B500
|
||||
0x698C00
|
||||
0xB79600
|
||||
0x176E00
|
||||
0x822A00
|
||||
0x7F3800
|
||||
0xF1E400
|
||||
0x4FFB00
|
||||
0x9C1100
|
||||
0x702300
|
||||
0xC24800
|
||||
0x23A700
|
||||
0x851100
|
||||
0x7A0600
|
||||
0xD95800
|
||||
0x3AF300
|
||||
0x8E6200
|
||||
0x61F100
|
||||
0xAD9700
|
||||
0x0AFB00
|
||||
0x807900
|
||||
0x7FC200
|
||||
0xF82700
|
||||
0x54CA00
|
||||
0xA01C00
|
||||
0x730800
|
||||
0xC7DB00
|
||||
0x29A400
|
||||
0x86F600
|
||||
0x7BC600
|
||||
0xDF6100
|
||||
0x407400
|
||||
0x916900
|
||||
0x65DE00
|
||||
0xB27F00
|
||||
0x113A00
|
||||
0x812A00
|
||||
0x7E6000
|
||||
0xEBAB00
|
||||
0x4AFB00
|
||||
0x984300
|
||||
0x6CF900
|
||||
0xBCDA00
|
||||
0x1D9300
|
||||
0x837700
|
||||
0x77FB00
|
||||
0xD36700
|
||||
0x354E00
|
||||
0x8BA000
|
||||
0x5DC800
|
||||
0xA8E200
|
||||
0x04B600
|
||||
0x801600
|
||||
0x7FEA00
|
||||
0xFB4A00
|
||||
0x571E00
|
||||
0xA23800
|
||||
0x746000
|
||||
0xCAB200
|
||||
0x2C9900
|
||||
0x880500
|
||||
0x7C8900
|
||||
0xE26D00
|
||||
0x432600
|
||||
0x930700
|
||||
0x67BD00
|
||||
0xB50500
|
||||
0x145500
|
||||
0x81A000
|
||||
0x7ED600
|
||||
0xEEC600
|
||||
0x4D8100
|
||||
0x9A2200
|
||||
0x6E9700
|
||||
0xBF8C00
|
||||
0x209F00
|
||||
0x843A00
|
||||
0x790A00
|
||||
0xD65C00
|
||||
0x382500
|
||||
0x8CF800
|
||||
0x5FE400
|
||||
0xAB3600
|
||||
0x07D900
|
||||
0x803E00
|
||||
0x7F8700
|
||||
0xF50500
|
||||
0x526900
|
||||
0x9E0F00
|
||||
0x719E00
|
||||
0xC50D00
|
||||
0x26A800
|
||||
0x85FA00
|
||||
0x7AEF00
|
||||
0xDC5900
|
||||
0x3DB800
|
||||
0x8FDD00
|
||||
0x63EF00
|
||||
0xB00500
|
||||
0x0E1C00
|
||||
0x80C800
|
||||
0x7DD600
|
||||
0xE89200
|
||||
0x486A00
|
||||
0x967400
|
||||
0x6B4B00
|
||||
0xBA3300
|
||||
0x1A8300
|
||||
0x82C600
|
||||
0x76D900
|
||||
0xD07900
|
||||
0x326E00
|
||||
0x8A5A00
|
||||
0x5B9D00
|
||||
0xA69C00
|
||||
0x019200
|
||||
0x800200
|
||||
0x7FFF00
|
||||
0xFF3700
|
||||
0x59F400
|
||||
0xA4F000
|
||||
0x75F400
|
||||
0xCE4B00
|
||||
0x304200
|
||||
0x897200
|
||||
0x7D6300
|
||||
0xE64200
|
||||
0x467500
|
||||
0x952300
|
||||
0x69FD00
|
||||
0xB83C00
|
||||
0x183300
|
||||
0x824F00
|
||||
0x7F4E00
|
||||
0xF2AC00
|
||||
0x509800
|
||||
0x9C8F00
|
||||
0x708300
|
||||
0xC2F800
|
||||
0x246700
|
||||
0x854900
|
||||
0x7A4200
|
||||
0xDA1800
|
||||
0x3BA500
|
||||
0x8EBF00
|
||||
0x627200
|
||||
0xAE3100
|
||||
0x0BC400
|
||||
0x808B00
|
||||
0x7FCE00
|
||||
0xF8EF00
|
||||
0x556000
|
||||
0xA0A200
|
||||
0x735F00
|
||||
0xC89000
|
||||
0x2A6200
|
||||
0x873800
|
||||
0x7BF900
|
||||
0xE02300
|
||||
0x412100
|
||||
0x91CF00
|
||||
0x665700
|
||||
0xB31F00
|
||||
0x120100
|
||||
0x814600
|
||||
0x7E7F00
|
||||
0xEC7100
|
||||
0x4B9E00
|
||||
0x98B900
|
||||
0x6D6200
|
||||
0xBD8600
|
||||
0x1E5700
|
||||
0x83A600
|
||||
0x784000
|
||||
0xD42400
|
||||
0x360400
|
||||
0x8BF500
|
||||
0x5E5000
|
||||
0xA97600
|
||||
0x057F00
|
||||
0x801E00
|
||||
0x7FF100
|
||||
0xFC1300
|
||||
0x57B100
|
||||
0xA2C200
|
||||
0x74B300
|
||||
0xCB6900
|
||||
0x2D5500
|
||||
0x884C00
|
||||
0x7CB700
|
||||
0xE33000
|
||||
0x43D100
|
||||
0x937100
|
||||
0x683200
|
||||
0xB5A800
|
||||
0x151C00
|
||||
0x81C100
|
||||
0x7EF000
|
||||
0xEF8D00
|
||||
0x4E2100
|
||||
0x9A9C00
|
||||
0x6EFB00
|
||||
0xC03A00
|
||||
0x216200
|
||||
0x846E00
|
||||
0x794A00
|
||||
0xD71B00
|
||||
0x38D900
|
||||
0x8D5100
|
||||
0x606800
|
||||
0xABCD00
|
||||
0x08A200
|
||||
0x804B00
|
||||
0x7F9800
|
||||
0xF5CD00
|
||||
0x530300
|
||||
0x9E9100
|
||||
0x71FA00
|
||||
0xC5C000
|
||||
0x276800
|
||||
0x863700
|
||||
0x7B2700
|
||||
0xDD1B00
|
||||
0x3E6800
|
||||
0x903E00
|
||||
0x646C00
|
||||
0xB0A200
|
||||
0x0EE400
|
||||
0x80DE00
|
||||
0x7DFB00
|
||||
0xE95800
|
||||
0x490F00
|
||||
0x96E600
|
||||
0x6BB800
|
||||
0xBADC00
|
||||
0x1B4700
|
||||
0x82F100
|
||||
0x772300
|
||||
0xD13400
|
||||
0x332700
|
||||
0x8AAA00
|
||||
0x5C2900
|
||||
0xA72C00
|
||||
0x025B00
|
||||
0x800600
|
||||
0x7FFA00
|
||||
0xFDA500
|
||||
0x58D400
|
||||
0xA3D700
|
||||
0x755600
|
||||
0xCCD900
|
||||
0x2ECC00
|
||||
0x88DD00
|
||||
0x7D0F00
|
||||
0xE4B900
|
||||
0x452400
|
||||
0x944800
|
||||
0x691A00
|
||||
0xB6F100
|
||||
0x16A800
|
||||
0x820500
|
||||
0x7F2200
|
||||
0xF11C00
|
||||
0x4F5E00
|
||||
0x9B9400
|
||||
0x6FC200
|
||||
0xC19800
|
||||
0x22E500
|
||||
0x84D900
|
||||
0x79C900
|
||||
0xD89800
|
||||
0x3A4000
|
||||
0x8E0600
|
||||
0x616F00
|
||||
0xACFD00
|
||||
0x0A3300
|
||||
0x806800
|
||||
0x7FB500
|
||||
0xF75E00
|
||||
0x543300
|
||||
0x9F9800
|
||||
0x72AF00
|
||||
0xC72700
|
||||
0x28E500
|
||||
0x86B600
|
||||
0x7B9200
|
||||
0xDE9E00
|
||||
0x3FC600
|
||||
0x910500
|
||||
0x656400
|
||||
0xB1DF00
|
||||
0x107300
|
||||
0x811000
|
||||
0x7E3F00
|
||||
0xEAE400
|
||||
0x4A5800
|
||||
0x97CE00
|
||||
0x6C8F00
|
||||
0xBC2F00
|
||||
0x1CD000
|
||||
0x834900
|
||||
0x77B400
|
||||
0xD2AB00
|
||||
0x349700
|
||||
0x8B4D00
|
||||
0x5D3E00
|
||||
0xA84F00
|
||||
0x03ED00
|
||||
0x800F00
|
||||
0x7FE200
|
||||
0xFA8100
|
||||
0x568A00
|
||||
0xA1B000
|
||||
0x740B00
|
||||
0xC9FC00
|
||||
0x2BDC00
|
||||
0x87C000
|
||||
0x7C5A00
|
||||
0xE1A900
|
||||
0x427A00
|
||||
0x929E00
|
||||
0x674700
|
||||
0xB46200
|
||||
0x138F00
|
||||
0x818100
|
||||
0x7EBA00
|
||||
0xEDFF00
|
||||
0x4CE100
|
||||
0x99A900
|
||||
0x6E3100
|
||||
0xBEDF00
|
||||
0x1FDD00
|
||||
0x840700
|
||||
0x78C800
|
||||
0xD59E00
|
||||
0x377000
|
||||
0x8CA100
|
||||
0x5F5E00
|
||||
0xAAA000
|
||||
0x071100
|
||||
0x803200
|
||||
0x7F7500
|
||||
0xF43C00
|
||||
0x51CF00
|
||||
0x9D8E00
|
||||
0x714100
|
||||
0xC45B00
|
||||
0x25E800
|
||||
0x85BE00
|
||||
0x7AB700
|
||||
0xDB9900
|
||||
0x3D0800
|
||||
0x8F7D00
|
||||
0x637100
|
||||
0xAF6800
|
||||
0x0D5400
|
||||
0x80B200
|
||||
0x7DB100
|
||||
0xE7CD00
|
||||
0x47C400
|
||||
0x960300
|
||||
0x6ADD00
|
||||
0xB98B00
|
||||
0x19BE00
|
||||
0x829D00
|
||||
0x768E00
|
||||
0xCFBE00
|
||||
0x31B500
|
||||
0x8A0C00
|
||||
0x5B1000
|
||||
0xA60C00
|
||||
0x00C900
|
||||
0x800100
|
||||
512
examples/adsp-2191_complex_rad2_fft/twid_sin.dat
Normal file
512
examples/adsp-2191_complex_rad2_fft/twid_sin.dat
Normal file
@@ -0,0 +1,512 @@
|
||||
0x0000
|
||||
0x7FFF
|
||||
0x5A82
|
||||
0x5A82
|
||||
0x30FC
|
||||
0x7642
|
||||
0x7642
|
||||
0x30FC
|
||||
0x18F9
|
||||
0x7D8A
|
||||
0x6A6E
|
||||
0x471D
|
||||
0x471D
|
||||
0x6A6E
|
||||
0x7D8A
|
||||
0x18F9
|
||||
0x0C8C
|
||||
0x7F62
|
||||
0x62F2
|
||||
0x5134
|
||||
0x3C57
|
||||
0x70E3
|
||||
0x7A7D
|
||||
0x2528
|
||||
0x2528
|
||||
0x7A7D
|
||||
0x70E3
|
||||
0x3C57
|
||||
0x5134
|
||||
0x62F2
|
||||
0x7F62
|
||||
0x0C8C
|
||||
0x0648
|
||||
0x7FD9
|
||||
0x5ED7
|
||||
0x55F6
|
||||
0x36BA
|
||||
0x73B6
|
||||
0x7885
|
||||
0x2B1F
|
||||
0x1F1A
|
||||
0x7C2A
|
||||
0x6DCA
|
||||
0x41CE
|
||||
0x4C40
|
||||
0x66D0
|
||||
0x7E9D
|
||||
0x12C8
|
||||
0x12C8
|
||||
0x7E9D
|
||||
0x66D0
|
||||
0x4C40
|
||||
0x41CE
|
||||
0x6DCA
|
||||
0x7C2A
|
||||
0x1F1A
|
||||
0x2B1F
|
||||
0x7885
|
||||
0x73B6
|
||||
0x36BA
|
||||
0x55F6
|
||||
0x5ED7
|
||||
0x7FD9
|
||||
0x0648
|
||||
0x0324
|
||||
0x7FF6
|
||||
0x5CB4
|
||||
0x5843
|
||||
0x33DF
|
||||
0x7505
|
||||
0x776C
|
||||
0x2E11
|
||||
0x1C0C
|
||||
0x7CE4
|
||||
0x6C24
|
||||
0x447B
|
||||
0x49B4
|
||||
0x68A7
|
||||
0x7E1E
|
||||
0x15E2
|
||||
0x0FAB
|
||||
0x7F0A
|
||||
0x64E9
|
||||
0x4EC0
|
||||
0x3F17
|
||||
0x6F5F
|
||||
0x7B5D
|
||||
0x2224
|
||||
0x2827
|
||||
0x798A
|
||||
0x7255
|
||||
0x398D
|
||||
0x539B
|
||||
0x60EC
|
||||
0x7FA7
|
||||
0x096B
|
||||
0x096B
|
||||
0x7FA7
|
||||
0x60EC
|
||||
0x539B
|
||||
0x398D
|
||||
0x7255
|
||||
0x798A
|
||||
0x2827
|
||||
0x2224
|
||||
0x7B5D
|
||||
0x6F5F
|
||||
0x3F17
|
||||
0x4EC0
|
||||
0x64E9
|
||||
0x7F0A
|
||||
0x0FAB
|
||||
0x15E2
|
||||
0x7E1E
|
||||
0x68A7
|
||||
0x49B4
|
||||
0x447B
|
||||
0x6C24
|
||||
0x7CE4
|
||||
0x1C0C
|
||||
0x2E11
|
||||
0x776C
|
||||
0x7505
|
||||
0x33DF
|
||||
0x5843
|
||||
0x5CB4
|
||||
0x7FF6
|
||||
0x0324
|
||||
0x0192
|
||||
0x7FFE
|
||||
0x5B9D
|
||||
0x5964
|
||||
0x326E
|
||||
0x75A6
|
||||
0x76D9
|
||||
0x2F87
|
||||
0x1A83
|
||||
0x7D3A
|
||||
0x6B4B
|
||||
0x45CD
|
||||
0x486A
|
||||
0x698C
|
||||
0x7DD6
|
||||
0x176E
|
||||
0x0E1C
|
||||
0x7F38
|
||||
0x63EF
|
||||
0x4FFB
|
||||
0x3DB8
|
||||
0x7023
|
||||
0x7AEF
|
||||
0x23A7
|
||||
0x26A8
|
||||
0x7A06
|
||||
0x719E
|
||||
0x3AF3
|
||||
0x5269
|
||||
0x61F1
|
||||
0x7F87
|
||||
0x0AFB
|
||||
0x07D9
|
||||
0x7FC2
|
||||
0x5FE4
|
||||
0x54CA
|
||||
0x3825
|
||||
0x7308
|
||||
0x790A
|
||||
0x29A4
|
||||
0x209F
|
||||
0x7BC6
|
||||
0x6E97
|
||||
0x4074
|
||||
0x4D81
|
||||
0x65DE
|
||||
0x7ED6
|
||||
0x113A
|
||||
0x1455
|
||||
0x7E60
|
||||
0x67BD
|
||||
0x4AFB
|
||||
0x4326
|
||||
0x6CF9
|
||||
0x7C89
|
||||
0x1D93
|
||||
0x2C99
|
||||
0x77FB
|
||||
0x7460
|
||||
0x354E
|
||||
0x571E
|
||||
0x5DC8
|
||||
0x7FEA
|
||||
0x04B6
|
||||
0x04B6
|
||||
0x7FEA
|
||||
0x5DC8
|
||||
0x571E
|
||||
0x354E
|
||||
0x7460
|
||||
0x77FB
|
||||
0x2C99
|
||||
0x1D93
|
||||
0x7C89
|
||||
0x6CF9
|
||||
0x4326
|
||||
0x4AFB
|
||||
0x67BD
|
||||
0x7E60
|
||||
0x1455
|
||||
0x113A
|
||||
0x7ED6
|
||||
0x65DE
|
||||
0x4D81
|
||||
0x4074
|
||||
0x6E97
|
||||
0x7BC6
|
||||
0x209F
|
||||
0x29A4
|
||||
0x790A
|
||||
0x7308
|
||||
0x3825
|
||||
0x54CA
|
||||
0x5FE4
|
||||
0x7FC2
|
||||
0x07D9
|
||||
0x0AFB
|
||||
0x7F87
|
||||
0x61F1
|
||||
0x5269
|
||||
0x3AF3
|
||||
0x719E
|
||||
0x7A06
|
||||
0x26A8
|
||||
0x23A7
|
||||
0x7AEF
|
||||
0x7023
|
||||
0x3DB8
|
||||
0x4FFB
|
||||
0x63EF
|
||||
0x7F38
|
||||
0x0E1C
|
||||
0x176E
|
||||
0x7DD6
|
||||
0x698C
|
||||
0x486A
|
||||
0x45CD
|
||||
0x6B4B
|
||||
0x7D3A
|
||||
0x1A83
|
||||
0x2F87
|
||||
0x76D9
|
||||
0x75A6
|
||||
0x326E
|
||||
0x5964
|
||||
0x5B9D
|
||||
0x7FFE
|
||||
0x0192
|
||||
0x00C9
|
||||
0x7FFF
|
||||
0x5B10
|
||||
0x59F4
|
||||
0x31B5
|
||||
0x75F4
|
||||
0x768E
|
||||
0x3042
|
||||
0x19BE
|
||||
0x7D63
|
||||
0x6ADD
|
||||
0x4675
|
||||
0x47C4
|
||||
0x69FD
|
||||
0x7DB1
|
||||
0x1833
|
||||
0x0D54
|
||||
0x7F4E
|
||||
0x6371
|
||||
0x5098
|
||||
0x3D08
|
||||
0x7083
|
||||
0x7AB7
|
||||
0x2467
|
||||
0x25E8
|
||||
0x7A42
|
||||
0x7141
|
||||
0x3BA5
|
||||
0x51CF
|
||||
0x6272
|
||||
0x7F75
|
||||
0x0BC4
|
||||
0x0711
|
||||
0x7FCE
|
||||
0x5F5E
|
||||
0x5560
|
||||
0x3770
|
||||
0x735F
|
||||
0x78C8
|
||||
0x2A62
|
||||
0x1FDD
|
||||
0x7BF9
|
||||
0x6E31
|
||||
0x4121
|
||||
0x4CE1
|
||||
0x6657
|
||||
0x7EBA
|
||||
0x1201
|
||||
0x138F
|
||||
0x7E7F
|
||||
0x6747
|
||||
0x4B9E
|
||||
0x427A
|
||||
0x6D62
|
||||
0x7C5A
|
||||
0x1E57
|
||||
0x2BDC
|
||||
0x7840
|
||||
0x740B
|
||||
0x3604
|
||||
0x568A
|
||||
0x5E50
|
||||
0x7FE2
|
||||
0x057F
|
||||
0x03ED
|
||||
0x7FF1
|
||||
0x5D3E
|
||||
0x57B1
|
||||
0x3497
|
||||
0x74B3
|
||||
0x77B4
|
||||
0x2D55
|
||||
0x1CD0
|
||||
0x7CB7
|
||||
0x6C8F
|
||||
0x43D1
|
||||
0x4A58
|
||||
0x6832
|
||||
0x7E3F
|
||||
0x151C
|
||||
0x1073
|
||||
0x7EF0
|
||||
0x6564
|
||||
0x4E21
|
||||
0x3FC6
|
||||
0x6EFB
|
||||
0x7B92
|
||||
0x2162
|
||||
0x28E5
|
||||
0x794A
|
||||
0x72AF
|
||||
0x38D9
|
||||
0x5433
|
||||
0x6068
|
||||
0x7FB5
|
||||
0x08A2
|
||||
0x0A33
|
||||
0x7F98
|
||||
0x616F
|
||||
0x5303
|
||||
0x3A40
|
||||
0x71FA
|
||||
0x79C9
|
||||
0x2768
|
||||
0x22E5
|
||||
0x7B27
|
||||
0x6FC2
|
||||
0x3E68
|
||||
0x4F5E
|
||||
0x646C
|
||||
0x7F22
|
||||
0x0EE4
|
||||
0x16A8
|
||||
0x7DFB
|
||||
0x691A
|
||||
0x490F
|
||||
0x4524
|
||||
0x6BB8
|
||||
0x7D0F
|
||||
0x1B47
|
||||
0x2ECC
|
||||
0x7723
|
||||
0x7556
|
||||
0x3327
|
||||
0x58D4
|
||||
0x5C29
|
||||
0x7FFA
|
||||
0x025B
|
||||
0x025B
|
||||
0x7FFA
|
||||
0x5C29
|
||||
0x58D4
|
||||
0x3327
|
||||
0x7556
|
||||
0x7723
|
||||
0x2ECC
|
||||
0x1B47
|
||||
0x7D0F
|
||||
0x6BB8
|
||||
0x4524
|
||||
0x490F
|
||||
0x691A
|
||||
0x7DFB
|
||||
0x16A8
|
||||
0x0EE4
|
||||
0x7F22
|
||||
0x646C
|
||||
0x4F5E
|
||||
0x3E68
|
||||
0x6FC2
|
||||
0x7B27
|
||||
0x22E5
|
||||
0x2768
|
||||
0x79C9
|
||||
0x71FA
|
||||
0x3A40
|
||||
0x5303
|
||||
0x616F
|
||||
0x7F98
|
||||
0x0A33
|
||||
0x08A2
|
||||
0x7FB5
|
||||
0x6068
|
||||
0x5433
|
||||
0x38D9
|
||||
0x72AF
|
||||
0x794A
|
||||
0x28E5
|
||||
0x2162
|
||||
0x7B92
|
||||
0x6EFB
|
||||
0x3FC6
|
||||
0x4E21
|
||||
0x6564
|
||||
0x7EF0
|
||||
0x1073
|
||||
0x151C
|
||||
0x7E3F
|
||||
0x6832
|
||||
0x4A58
|
||||
0x43D1
|
||||
0x6C8F
|
||||
0x7CB7
|
||||
0x1CD0
|
||||
0x2D55
|
||||
0x77B4
|
||||
0x74B3
|
||||
0x3497
|
||||
0x57B1
|
||||
0x5D3E
|
||||
0x7FF1
|
||||
0x03ED
|
||||
0x057F
|
||||
0x7FE2
|
||||
0x5E50
|
||||
0x568A
|
||||
0x3604
|
||||
0x740B
|
||||
0x7840
|
||||
0x2BDC
|
||||
0x1E57
|
||||
0x7C5A
|
||||
0x6D62
|
||||
0x427A
|
||||
0x4B9E
|
||||
0x6747
|
||||
0x7E7F
|
||||
0x138F
|
||||
0x1201
|
||||
0x7EBA
|
||||
0x6657
|
||||
0x4CE1
|
||||
0x4121
|
||||
0x6E31
|
||||
0x7BF9
|
||||
0x1FDD
|
||||
0x2A62
|
||||
0x78C8
|
||||
0x735F
|
||||
0x3770
|
||||
0x5560
|
||||
0x5F5E
|
||||
0x7FCE
|
||||
0x0711
|
||||
0x0BC4
|
||||
0x7F75
|
||||
0x6272
|
||||
0x51CF
|
||||
0x3BA5
|
||||
0x7141
|
||||
0x7A42
|
||||
0x25E8
|
||||
0x2467
|
||||
0x7AB7
|
||||
0x7083
|
||||
0x3D08
|
||||
0x5098
|
||||
0x6371
|
||||
0x7F4E
|
||||
0x0D54
|
||||
0x1833
|
||||
0x7DB1
|
||||
0x69FD
|
||||
0x47C4
|
||||
0x4675
|
||||
0x6ADD
|
||||
0x7D63
|
||||
0x19BE
|
||||
0x3042
|
||||
0x768E
|
||||
0x75F4
|
||||
0x31B5
|
||||
0x59F4
|
||||
0x5B10
|
||||
0x7FFF
|
||||
0x00C9
|
||||
BIN
examples/adsp-2191_fir/ADSP-2191 FIR.dpj
Normal file
BIN
examples/adsp-2191_fir/ADSP-2191 FIR.dpj
Normal file
Binary file not shown.
101
examples/adsp-2191_fir/ADSP-2191 FIR.txt
Normal file
101
examples/adsp-2191_fir/ADSP-2191 FIR.txt
Normal file
@@ -0,0 +1,101 @@
|
||||
****************************************************************************
|
||||
|
||||
fir.asm N-tap finite impulse response filter (FIR)
|
||||
|
||||
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 a N-tap finite impulse response filter (FIR) using coefficients.
|
||||
|
||||
Files contained in this directory:
|
||||
|
||||
fir.dpj VisualDSP project file
|
||||
fir.asm ADSP-2191 source for FIR
|
||||
fir_test.asm Calling function for fic.asm
|
||||
ADSP-2191.ldf Linker description file
|
||||
input_dec.dat Sample data for FIR
|
||||
_________________________________________________________________
|
||||
|
||||
CONTENTS
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
|
||||
The project fir.dpj contains an implementation of a single-core subroutine
|
||||
that implements a N-tap finite impulse response filter (FIR). This
|
||||
routine has been optimized to take advantage of the repetitive multiply
|
||||
accumulates inherent to the algorithm.
|
||||
|
||||
y(n) = Summation from k=0 to M of h(k)*x(n-k)
|
||||
|
||||
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
|
||||
The assembly language module FIR_TEST.ASM initializes the input and
|
||||
coefficient buffers and then calls FIR.ASM.
|
||||
|
||||
The first buffer declared, IN, is Num_Samp locations long.
|
||||
|
||||
The next buffer declared, OUT, is also Num_Samp long, and stores the
|
||||
output of the filter.
|
||||
|
||||
Delay_Line is the third buffer declared. This buffer holds the delay line.
|
||||
Since there are past intermediate values for each stage of the FIR, the length of
|
||||
this buffer is as long as the number of Taps.
|
||||
|
||||
The coefficient buffer, COEFF, contains the FIR filter coefficients. The
|
||||
coefficients are typically generated by a filter design software package.
|
||||
|
||||
The linker descriptive file is ADSP-2191.LDF, which describes the hardware in
|
||||
terms of memory spaces and peripherals.
|
||||
|
||||
Because there is no data dependency between DSP cores, it is possible
|
||||
to do perform an FIR in DSP core 1, while also performing an FIR in DSP core 2
|
||||
on separate input data, using different coefficients.
|
||||
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
1. INPUT SAMPLES:
|
||||
-----------------
|
||||
This FIR routine expects input data which conforms to the following criteria:
|
||||
|
||||
Generate input data such that an array of input fixed point values are arranged
|
||||
in the following order:
|
||||
|
||||
INPUT DATA
|
||||
|
||||
indata(0)
|
||||
indata(1)
|
||||
indata(2)
|
||||
indata(3)
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
|
||||
|
||||
2. COEFFICIENT DATA:
|
||||
-----------------------
|
||||
This FIR routine expects TAPS 1.15 fixed point values to be used as coefficients.
|
||||
|
||||
COEFFICIENT DATA
|
||||
|
||||
coef(0)
|
||||
coef(1)
|
||||
coef(2)
|
||||
coef(3)
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
|
||||
|
||||
115
examples/adsp-2191_fir/ADSP-2191.ldf
Normal file
115
examples/adsp-2191_fir/ADSP-2191.ldf
Normal file
@@ -0,0 +1,115 @@
|
||||
|
||||
ARCHITECTURE(ADSP-2191)
|
||||
|
||||
$OBJECTS = $COMMAND_LINE_OBJECTS;
|
||||
// This memory map is set up to facilite testing of the tool
|
||||
// chain -- code and data area are as large as possible.
|
||||
|
||||
MEMORY
|
||||
{
|
||||
seg_dmy { TYPE(PM RAM) START(0x000000) END(0x000003) WIDTH(24) }
|
||||
seg_itab { TYPE(PM RAM) START(0x000004) END(0x00003f) WIDTH(24) }
|
||||
seg_code { TYPE(PM RAM) START(0x000040) END(0x003fff) WIDTH(24) }
|
||||
|
||||
seg_buf2 { TYPE(DM RAM) START(0x008000) END(0x0088ff) WIDTH(16) }
|
||||
seg_buf1 { TYPE(DM RAM) START(0x008900) END(0x0095ff) WIDTH(16) }
|
||||
seg_data1 { TYPE(DM RAM) START(0x009600) END(0x00afff) WIDTH(16) }
|
||||
seg_data2 { TYPE(PM RAM) START(0x004000) END(0x006bff) WIDTH(24) }
|
||||
seg_heap { TYPE(DM RAM) START(0x00f200) END(0x00f9ff) WIDTH(16) }
|
||||
seg_stack { TYPE(DM RAM) START(0x00fa00) END(0x00ffff) WIDTH(16) }
|
||||
}
|
||||
|
||||
PROCESSOR p0
|
||||
{
|
||||
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST)
|
||||
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
sec_dmy
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVreset))
|
||||
} > seg_dmy
|
||||
|
||||
sec_itab
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVpwrdwn))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVkernel))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVstackint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVmailboxint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVtimerint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVringint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVpcibmint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVdspdspint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint13))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint14))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVac97frint))
|
||||
. = .+0x1;
|
||||
} > seg_itab
|
||||
seg_code
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(program) )
|
||||
} >seg_code
|
||||
|
||||
sec_buf1
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf1) )
|
||||
}>seg_buf1
|
||||
|
||||
sec_buf2
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf2) )
|
||||
}>seg_buf2
|
||||
|
||||
sec_data1
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data1) )
|
||||
} >seg_data1
|
||||
|
||||
sec_data2
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data2) )
|
||||
INPUT_SECTIONS( $OBJECTS(program2) )
|
||||
} >seg_data2
|
||||
|
||||
|
||||
// support for initialization, including C++
|
||||
sec_ctor
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(ctor))
|
||||
} >seg_data1
|
||||
|
||||
// provide linker variables describing the stack (grows down)
|
||||
// ldf_stack_limit is the lowest address in the stack
|
||||
// ldf_stack_base is the highest address in the stack
|
||||
sec_stack
|
||||
{
|
||||
ldf_stack_limit = .;
|
||||
ldf_stack_base = . + MEMORY_SIZEOF(seg_stack) - 1;
|
||||
} >seg_stack
|
||||
sec_heap
|
||||
{
|
||||
.heap = .;
|
||||
.heap_size = MEMORY_SIZEOF(seg_heap);
|
||||
.heap_end = . + MEMORY_SIZEOF(seg_heap) - 1;
|
||||
} >seg_heap
|
||||
}
|
||||
}
|
||||
101
examples/adsp-2191_fir/ADSP-2191_FIR.txt
Normal file
101
examples/adsp-2191_fir/ADSP-2191_FIR.txt
Normal file
@@ -0,0 +1,101 @@
|
||||
****************************************************************************
|
||||
|
||||
fir.asm N-tap finite impulse response filter (FIR)
|
||||
|
||||
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 a N-tap finite impulse response filter (FIR) using coefficients.
|
||||
|
||||
Files contained in this directory:
|
||||
|
||||
fir.dpj VisualDSP project file
|
||||
fir.asm ADSP-2191 source for FIR
|
||||
fir_test.asm Calling function for fic.asm
|
||||
ADSP-2191.ldf Linker description file
|
||||
input_dec.dat Sample data for FIR
|
||||
_________________________________________________________________
|
||||
|
||||
CONTENTS
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
|
||||
The project fir.dpj contains an implementation of a single-core subroutine
|
||||
that implements a N-tap finite impulse response filter (FIR). This
|
||||
routine has been optimized to take advantage of the repetitive multiply
|
||||
accumulates inherent to the algorithm.
|
||||
|
||||
y(n) = Summation from k=0 to M of h(k)*x(n-k)
|
||||
|
||||
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
|
||||
The assembly language module FIR_TEST.ASM initializes the input and
|
||||
coefficient buffers and then calls FIR.ASM.
|
||||
|
||||
The first buffer declared, IN, is Num_Samp locations long.
|
||||
|
||||
The next buffer declared, OUT, is also Num_Samp long, and stores the
|
||||
output of the filter.
|
||||
|
||||
Delay_Line is the third buffer declared. This buffer holds the delay line.
|
||||
Since there are past intermediate values for each stage of the FIR, the length of
|
||||
this buffer is as long as the number of Taps.
|
||||
|
||||
The coefficient buffer, COEFF, contains the FIR filter coefficients. The
|
||||
coefficients are typically generated by a filter design software package.
|
||||
|
||||
The linker descriptive file is ADSP-2191.LDF, which describes the hardware in
|
||||
terms of memory spaces and peripherals.
|
||||
|
||||
Because there is no data dependency between DSP cores, it is possible
|
||||
to do perform an FIR in DSP core 1, while also performing an FIR in DSP core 2
|
||||
on separate input data, using different coefficients.
|
||||
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
1. INPUT SAMPLES:
|
||||
-----------------
|
||||
This FIR routine expects input data which conforms to the following criteria:
|
||||
|
||||
Generate input data such that an array of input fixed point values are arranged
|
||||
in the following order:
|
||||
|
||||
INPUT DATA
|
||||
|
||||
indata(0)
|
||||
indata(1)
|
||||
indata(2)
|
||||
indata(3)
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
|
||||
|
||||
2. COEFFICIENT DATA:
|
||||
-----------------------
|
||||
This FIR routine expects TAPS 1.15 fixed point values to be used as coefficients.
|
||||
|
||||
COEFFICIENT DATA
|
||||
|
||||
coef(0)
|
||||
coef(1)
|
||||
coef(2)
|
||||
coef(3)
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
|
||||
|
||||
31
examples/adsp-2191_fir/Coeff_l.dat
Normal file
31
examples/adsp-2191_fir/Coeff_l.dat
Normal file
@@ -0,0 +1,31 @@
|
||||
86,
|
||||
115,
|
||||
-77,
|
||||
-103,
|
||||
24,
|
||||
187,
|
||||
18,
|
||||
-248,
|
||||
-132,
|
||||
319,
|
||||
327,
|
||||
-374,
|
||||
-744,
|
||||
412,
|
||||
2564,
|
||||
3671,
|
||||
2564,
|
||||
412,
|
||||
-744,
|
||||
-374,
|
||||
327,
|
||||
319,
|
||||
-132,
|
||||
-248,
|
||||
18,
|
||||
187,
|
||||
24,
|
||||
-103,
|
||||
-77,
|
||||
115,
|
||||
86
|
||||
81
examples/adsp-2191_fir/Fir.asm
Normal file
81
examples/adsp-2191_fir/Fir.asm
Normal file
@@ -0,0 +1,81 @@
|
||||
/**************************************************************
|
||||
|
||||
File Name: FIR.asm
|
||||
|
||||
Date Modified: 6/22/01 BM
|
||||
|
||||
|
||||
Description:
|
||||
Subroutine that implements a FIR Filter given
|
||||
coefficients and samples.
|
||||
|
||||
Equation: y(n) = Summation from k=0 to M of h(k)*x(n-k)
|
||||
|
||||
Calling Parameters:
|
||||
b0,i0 = address of delay line buffer
|
||||
l0 = length of delay line buffer
|
||||
b1,i1 = address of input samples buffer
|
||||
b4,i4 = address of coefficients buffer
|
||||
l4 = length of coefficients buffer
|
||||
b2,i2 = address of output buffer
|
||||
m1 = 1
|
||||
m3 = -1
|
||||
m4 = 1
|
||||
|
||||
Assumptions:
|
||||
|
||||
Delay line must be of length TAPS
|
||||
Delay line , Output and Input buffers stored in DM Block.
|
||||
Instructions, and Coefficients stored in PM Block.
|
||||
|
||||
Return Values:
|
||||
i2 = output buffer
|
||||
i0 = delay line pointer
|
||||
|
||||
Registers Affected:
|
||||
i0,i1,i2,i4,MX,MY,MR,SR
|
||||
|
||||
Cycle Count:
|
||||
7 + Bin_Samp(Taps-1 + 4) + cache misses
|
||||
|
||||
Memory Usage:
|
||||
Instructions Words (24-bits):
|
||||
11 + Taps-1 instruction words
|
||||
|
||||
Data Words (16 or 24-bits):
|
||||
Number of taps locations for coefficients (24-bits)
|
||||
Number of taps locations for the delay line buffer (16-bits)
|
||||
Number of samples locations for the input buffer (16-bits)
|
||||
Number of samples locations for the output buffer (16-bits)
|
||||
|
||||
Notes:
|
||||
|
||||
**************************************************************/
|
||||
#define Samps_per_Bin 40 /* Number of Input samples in each bin */
|
||||
#define Taps 31 /* Number of filter taps */
|
||||
|
||||
.GLOBAL fir;
|
||||
|
||||
/* program memory code */
|
||||
.section/pm program;
|
||||
|
||||
fir:
|
||||
MR = 0, MX0 = DM(I1,M1), MY0 = PM(I4,m4); /* Read Input sample and coefficient */
|
||||
DM(I0,M3) = MX0; /* Put Input sample in delay line */
|
||||
|
||||
CNTR=Samps_per_Bin; /* Set CNTR to Samps_per_Bin for each bin */
|
||||
DO mult_acc UNTIL CE;
|
||||
.repeat (Taps-1);
|
||||
MR=MR+MX0*MY0(SS), MX0=DM(I0,M3), MY0=PM(I4,M4);
|
||||
.end_repeat;
|
||||
MR=MR+MX0*MY0(SS), MX0=DM(I0,M1), MY0=PM(I4,M4);
|
||||
SR=ASHIFT MR2 (HI), MX0=DM(I1,M1);
|
||||
SR=SR OR LSHIFT MR1 (LO), DM(I0,M3) = MX0;
|
||||
mult_acc:
|
||||
MR = 0, DM(I2,M1)=SR0; /* Write to output */
|
||||
rts (db);
|
||||
MX0 = DM(I0,M1); /* Update delay pointer */
|
||||
MX0 = DM(I1,M3);
|
||||
|
||||
|
||||
|
||||
76
examples/adsp-2191_fir/Fir_test.asm
Normal file
76
examples/adsp-2191_fir/Fir_test.asm
Normal file
@@ -0,0 +1,76 @@
|
||||
/************************************************************************
|
||||
File Name: Fir_test.asm
|
||||
|
||||
Date Modified: 6/22/01 BM
|
||||
|
||||
|
||||
Purpose: Demonstrate initialization and operation of
|
||||
FIR.asm on the ADSP-2192. FIR.asm is a
|
||||
single precision direct form FIR filter. All
|
||||
coefficients and data values are assumed to
|
||||
be in 1.15 format.
|
||||
|
||||
************************************************************************/
|
||||
|
||||
#define Num_Samp 512 /* NUmber of Input samples */
|
||||
#define Taps 31 /* Number of filter taps */
|
||||
#define Shift 2 /* Number of shifts */
|
||||
#define Samps_per_Bin 40 /* Number of Input samples in each bin */
|
||||
#define Num_Bins (Num_Samp/Samps_per_Bin) /* Number of bins */
|
||||
|
||||
.EXTERN fir;
|
||||
|
||||
/* DM data */
|
||||
.section/data data1;
|
||||
.VAR IN[Num_Samp] = "input_dec.dat"; /* Input buffer */
|
||||
.VAR OUT[Num_Samp]; /* Output buffer */
|
||||
.VAR Delay_Line[Taps]; /* Delay line */
|
||||
|
||||
|
||||
/* PM data */
|
||||
.section/pm data2;
|
||||
.VAR COEFF[Taps] = "coeff_l.dat";
|
||||
|
||||
/* PM interrupt vector code */
|
||||
.section/pm IVreset;
|
||||
JUMP start; NOP; NOP; NOP;
|
||||
|
||||
/* Program memory code */
|
||||
.section/pm program;
|
||||
start:
|
||||
I0=Delay_Line; /* Initialize delay line pointer */
|
||||
M1 = 1;
|
||||
I1 = IN; /* Initialize Input pointer */
|
||||
I2 = OUT; /* Initialize Output pointer */
|
||||
L1=0; /* Initialize for modulo addressing */
|
||||
L2=0; /* Initialize for modulo addressing */
|
||||
M3=-1;
|
||||
M4=1;
|
||||
SE = Shift;
|
||||
DMPG2=page(COEFF);
|
||||
|
||||
L0=LENGTH (Delay_Line); /* Initialize delay line circular buffer */
|
||||
ax0 = Delay_Line;
|
||||
REG(b0) = ax0; /* Initialize pointer to delay line */
|
||||
|
||||
L4=length(COEFF); /* Initialize coeficient circular buffer */
|
||||
ax0 = COEFF;
|
||||
reg(b4) = ax0; /* Initialize pointer to coeficient */
|
||||
|
||||
CNTR=Taps; /* 'Taps' location delay line */
|
||||
DO zero UNTIL CE;
|
||||
zero: dm(I0,M1)=L0; /* Delay_line = 0 */
|
||||
|
||||
|
||||
CNTR = Num_Bins; /* Num_Bins to process Num_Samp */
|
||||
do per_bin until CE;
|
||||
call fir (db);
|
||||
I4=COEFF; /* Load Coeff buffer pointer */
|
||||
nop;
|
||||
per_bin:
|
||||
nop;
|
||||
|
||||
looping: JUMP looping; /* Loop upon itself */
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
512
examples/adsp-2191_fir/input_dec.dat
Normal file
512
examples/adsp-2191_fir/input_dec.dat
Normal file
@@ -0,0 +1,512 @@
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497,
|
||||
3290,
|
||||
-462,
|
||||
5323,
|
||||
-5597,
|
||||
5323,
|
||||
-8595,
|
||||
3290,
|
||||
-18957,
|
||||
0,
|
||||
18957,
|
||||
-3290,
|
||||
8595,
|
||||
-5323,
|
||||
5597,
|
||||
-5323,
|
||||
462,
|
||||
-3290,
|
||||
-15497,
|
||||
0,
|
||||
15497
|
||||
BIN
examples/adsp-2191_iir/ADSP-2191 IIR.dpj
Normal file
BIN
examples/adsp-2191_iir/ADSP-2191 IIR.dpj
Normal file
Binary file not shown.
115
examples/adsp-2191_iir/ADSP-2191 IIR.txt
Normal file
115
examples/adsp-2191_iir/ADSP-2191 IIR.txt
Normal file
@@ -0,0 +1,115 @@
|
||||
****************************************************************************
|
||||
|
||||
IIR.asm Infinite impulse response filter (IIR)
|
||||
|
||||
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 Infinite
|
||||
Impulse Response (IIR) filter.
|
||||
The IIR code uses coefficients, in an ordered array and applies them to
|
||||
the filter. A detailed discussion of the IIR algorithm can be found
|
||||
in the source header comments of "IIR.ASM".
|
||||
|
||||
Files contained in this directory:
|
||||
|
||||
iir.asm ADSP-2191 source for an example IIR filter
|
||||
iir_test.asm ADSP-2191 source to call iir.asm
|
||||
adsp-2191.ldf Linker description file for the IIR example
|
||||
iir.dpj The VDSP project file for the IIR example.
|
||||
inreal_256.dat Input data for IIR example in 1.15 format.
|
||||
coefs_hex.dat Coefficients for IIR example in 1.15 format.
|
||||
_________________________________________________________________
|
||||
|
||||
CONTENTS
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
|
||||
The IIR filter code executes a canonical form (also called direct form II)
|
||||
realization structure. The equation of the canonical form is
|
||||
|
||||
w(n)=x(n) + b1*w(n-1) + b2*w(n-2)
|
||||
y(n)=w(n) + a1*w(n-1) + a2*w(n-2)
|
||||
|
||||
The input sample is x(n) and the output is y(n). The term w(n) is the
|
||||
intermediate value; w(n-1) is the previous value and w(n-2) the one before
|
||||
that. The variables a and b are the coefficients for the filter.
|
||||
|
||||
This example of canonical equation uses a variant that limits the summation
|
||||
in the canonical form to two. This type of IIR is called a biquad and is a
|
||||
second order filter. Higher order filters can be achieved by cascading several
|
||||
sections of biquads together.
|
||||
|
||||
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
|
||||
The assembly language module IIR_TEST.ASM initializes the input and
|
||||
coefficient buffers and then calls IIR.ASM.
|
||||
|
||||
The first buffer declared, INBUF, is N_samp sample locations long.
|
||||
|
||||
The next buffer declared, OUTBUF, is also N_samp samples long, and stores the
|
||||
output of the filter.
|
||||
|
||||
DLINE is the third buffer declared. This buffer holds the delay line for each
|
||||
biquad. That is w(n-1) and w(n-2) for each biquad section of the filter. Since
|
||||
there are two past intermediate vales for each stage of the biquad, the length of
|
||||
this buffer is twice as long as the stages.
|
||||
|
||||
The coefficient buffer, COEFS, contains the IIR filter coefficients. The
|
||||
coefficients are typically generated by a filter
|
||||
design software package.
|
||||
|
||||
The linker descriptive file is ADSP-2191.LDF, which describes the hardware in
|
||||
terms of memory spaces and peripherals.
|
||||
|
||||
Because there is no data dependency between DSP cores, it is possible
|
||||
to do perform an IIR in DSP core 1, while also performing an IIR in DSP core 2
|
||||
on separate input data, using different coefficients.
|
||||
|
||||
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
1. INPUT SAMPLES:
|
||||
-----------------
|
||||
This IIR routine expects input data which conforms to the following criteria:
|
||||
|
||||
Generate input data such that an array of input fixed point values are
|
||||
in 1.15 format, with the data being arranged in the following order:
|
||||
|
||||
INPUT DATA
|
||||
|
||||
indata(0)
|
||||
indata(1)
|
||||
indata(2)
|
||||
indata(3)
|
||||
etc...
|
||||
|
||||
|
||||
2. COEFFICIENT DATA:
|
||||
-----------------------
|
||||
This IIR routine expects [Biquad_secs*4] fixed point values to be used as coefficients.
|
||||
|
||||
|
||||
COEFFICIENT DATA
|
||||
|
||||
A2(0)
|
||||
A1(0)
|
||||
B2(0)
|
||||
B1(0)
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
|
||||
|
||||
|
||||
115
examples/adsp-2191_iir/ADSP-2191.ldf
Normal file
115
examples/adsp-2191_iir/ADSP-2191.ldf
Normal file
@@ -0,0 +1,115 @@
|
||||
|
||||
ARCHITECTURE(ADSP-2191)
|
||||
|
||||
$OBJECTS = $COMMAND_LINE_OBJECTS;
|
||||
// This memory map is set up to facilite testing of the tool
|
||||
// chain -- code and data area are as large as possible.
|
||||
|
||||
MEMORY
|
||||
{
|
||||
seg_dmy { TYPE(PM RAM) START(0x000000) END(0x000003) WIDTH(24) }
|
||||
seg_itab { TYPE(PM RAM) START(0x000004) END(0x00003f) WIDTH(24) }
|
||||
seg_code { TYPE(PM RAM) START(0x000040) END(0x003fff) WIDTH(24) }
|
||||
|
||||
seg_buf2 { TYPE(DM RAM) START(0x008000) END(0x0088ff) WIDTH(16) }
|
||||
seg_buf1 { TYPE(DM RAM) START(0x008900) END(0x0095ff) WIDTH(16) }
|
||||
seg_data1 { TYPE(DM RAM) START(0x009600) END(0x00afff) WIDTH(16) }
|
||||
seg_data2 { TYPE(PM RAM) START(0x004000) END(0x006bff) WIDTH(24) }
|
||||
seg_heap { TYPE(DM RAM) START(0x00f200) END(0x00f9ff) WIDTH(16) }
|
||||
seg_stack { TYPE(DM RAM) START(0x00fa00) END(0x00ffff) WIDTH(16) }
|
||||
}
|
||||
|
||||
PROCESSOR p0
|
||||
{
|
||||
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST)
|
||||
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
sec_dmy
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVreset))
|
||||
} > seg_dmy
|
||||
|
||||
sec_itab
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVpwrdwn))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVkernel))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVstackint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVmailboxint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVtimerint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVringint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVpcibmint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVdspdspint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint13))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint14))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVac97frint))
|
||||
. = .+0x1;
|
||||
} > seg_itab
|
||||
seg_code
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(program) )
|
||||
} >seg_code
|
||||
|
||||
sec_buf1
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf1) )
|
||||
}>seg_buf1
|
||||
|
||||
sec_buf2
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf2) )
|
||||
}>seg_buf2
|
||||
|
||||
sec_data1
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data1) )
|
||||
} >seg_data1
|
||||
|
||||
sec_data2
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data2) )
|
||||
INPUT_SECTIONS( $OBJECTS(program2) )
|
||||
} >seg_data2
|
||||
|
||||
|
||||
// support for initialization, including C++
|
||||
sec_ctor
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(ctor))
|
||||
} >seg_data1
|
||||
|
||||
// provide linker variables describing the stack (grows down)
|
||||
// ldf_stack_limit is the lowest address in the stack
|
||||
// ldf_stack_base is the highest address in the stack
|
||||
sec_stack
|
||||
{
|
||||
ldf_stack_limit = .;
|
||||
ldf_stack_base = . + MEMORY_SIZEOF(seg_stack) - 1;
|
||||
} >seg_stack
|
||||
sec_heap
|
||||
{
|
||||
.heap = .;
|
||||
.heap_size = MEMORY_SIZEOF(seg_heap);
|
||||
.heap_end = . + MEMORY_SIZEOF(seg_heap) - 1;
|
||||
} >seg_heap
|
||||
}
|
||||
}
|
||||
115
examples/adsp-2191_iir/ADSP-2191_IIR.txt
Normal file
115
examples/adsp-2191_iir/ADSP-2191_IIR.txt
Normal file
@@ -0,0 +1,115 @@
|
||||
****************************************************************************
|
||||
|
||||
IIR.asm Infinite impulse response filter (IIR)
|
||||
|
||||
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 Infinite
|
||||
Impulse Response (IIR) filter.
|
||||
The IIR code uses coefficients, in an ordered array and applies them to
|
||||
the filter. A detailed discussion of the IIR algorithm can be found
|
||||
in the source header comments of "IIR.ASM".
|
||||
|
||||
Files contained in this directory:
|
||||
|
||||
iir.asm ADSP-2191 source for an example IIR filter
|
||||
iir_test.asm ADSP-2191 source to call iir.asm
|
||||
adsp-2191.ldf Linker description file for the IIR example
|
||||
iir.dpj The VDSP project file for the IIR example.
|
||||
inreal_256.dat Input data for IIR example in 1.15 format.
|
||||
coefs_hex.dat Coefficients for IIR example in 1.15 format.
|
||||
_________________________________________________________________
|
||||
|
||||
CONTENTS
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
|
||||
The IIR filter code executes a canonical form (also called direct form II)
|
||||
realization structure. The equation of the canonical form is
|
||||
|
||||
w(n)=x(n) + b1*w(n-1) + b2*w(n-2)
|
||||
y(n)=w(n) + a1*w(n-1) + a2*w(n-2)
|
||||
|
||||
The input sample is x(n) and the output is y(n). The term w(n) is the
|
||||
intermediate value; w(n-1) is the previous value and w(n-2) the one before
|
||||
that. The variables a and b are the coefficients for the filter.
|
||||
|
||||
This example of canonical equation uses a variant that limits the summation
|
||||
in the canonical form to two. This type of IIR is called a biquad and is a
|
||||
second order filter. Higher order filters can be achieved by cascading several
|
||||
sections of biquads together.
|
||||
|
||||
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
|
||||
The assembly language module IIR_TEST.ASM initializes the input and
|
||||
coefficient buffers and then calls IIR.ASM.
|
||||
|
||||
The first buffer declared, INBUF, is N_samp sample locations long.
|
||||
|
||||
The next buffer declared, OUTBUF, is also N_samp samples long, and stores the
|
||||
output of the filter.
|
||||
|
||||
DLINE is the third buffer declared. This buffer holds the delay line for each
|
||||
biquad. That is w(n-1) and w(n-2) for each biquad section of the filter. Since
|
||||
there are two past intermediate vales for each stage of the biquad, the length of
|
||||
this buffer is twice as long as the stages.
|
||||
|
||||
The coefficient buffer, COEFS, contains the IIR filter coefficients. The
|
||||
coefficients are typically generated by a filter
|
||||
design software package.
|
||||
|
||||
The linker descriptive file is ADSP-2191.LDF, which describes the hardware in
|
||||
terms of memory spaces and peripherals.
|
||||
|
||||
Because there is no data dependency between DSP cores, it is possible
|
||||
to do perform an IIR in DSP core 1, while also performing an IIR in DSP core 2
|
||||
on separate input data, using different coefficients.
|
||||
|
||||
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
1. INPUT SAMPLES:
|
||||
-----------------
|
||||
This IIR routine expects input data which conforms to the following criteria:
|
||||
|
||||
Generate input data such that an array of input fixed point values are
|
||||
in 1.15 format, with the data being arranged in the following order:
|
||||
|
||||
INPUT DATA
|
||||
|
||||
indata(0)
|
||||
indata(1)
|
||||
indata(2)
|
||||
indata(3)
|
||||
etc...
|
||||
|
||||
|
||||
2. COEFFICIENT DATA:
|
||||
-----------------------
|
||||
This IIR routine expects [Biquad_secs*4] fixed point values to be used as coefficients.
|
||||
|
||||
|
||||
COEFFICIENT DATA
|
||||
|
||||
A2(0)
|
||||
A1(0)
|
||||
B2(0)
|
||||
B1(0)
|
||||
...
|
||||
...
|
||||
...
|
||||
|
||||
|
||||
|
||||
|
||||
8
examples/adsp-2191_iir/coef_hex.dat
Normal file
8
examples/adsp-2191_iir/coef_hex.dat
Normal file
@@ -0,0 +1,8 @@
|
||||
0xce58,
|
||||
0x113e,
|
||||
0x7fff,
|
||||
0x7fff,
|
||||
0xd7cf,
|
||||
0xf7ce,
|
||||
0x7fff,
|
||||
0x7fff
|
||||
97
examples/adsp-2191_iir/iir.asm
Normal file
97
examples/adsp-2191_iir/iir.asm
Normal file
@@ -0,0 +1,97 @@
|
||||
/**************************************************************
|
||||
|
||||
File Name: IIR.asm
|
||||
|
||||
Date Modified: 6/21/01 BJM
|
||||
|
||||
|
||||
Description:
|
||||
Subroutine that implements a IIR Filter given
|
||||
coefficients and samples.
|
||||
|
||||
Equation:
|
||||
w(n) = x(n) + A1*w(n-1) + A2*w(n-2)
|
||||
y(n) = w(n) + B1*w(n-1) + B2*w(n-2) (single biquad structure)
|
||||
|
||||
Calling Parameters:
|
||||
b0,i0 = address of delay line buffer
|
||||
l0 = length of delay line buffer
|
||||
b1,i1 = address of input samples buffer
|
||||
b4,i4 = address of coefficients buffer
|
||||
l4 = length of coefficients buffer
|
||||
b2,i2 = address of output buffer
|
||||
|
||||
|
||||
Assumptions:
|
||||
The coefficient buffer should be in the order A2, A1, B2, B1 for each
|
||||
biquad section.
|
||||
|
||||
Delay line, Output and Input buffers stored in DM Block(16-bit).
|
||||
Instructions, and Coefficients stored in PM Block(24-bit).
|
||||
|
||||
Block 0:
|
||||
Coefficient buffer = { A2[0],A1[0],B2[0],B1[0],A2[1],A1[1],B2[1],... }
|
||||
|
||||
Block 1:
|
||||
Input buffer ={ In[0],In[1],In[2],... }
|
||||
Output buffer ={ Out[0],Out[1],Out[2],... }
|
||||
|
||||
Return Values:
|
||||
i2 = output buffer
|
||||
i0 = delay line pointer
|
||||
|
||||
Registers Affected:
|
||||
i0,i1,i2,i4,MX,MY,MR,SR
|
||||
|
||||
Cycle Count:
|
||||
|
||||
Memory Usage:
|
||||
Instructions Words (24-bits):
|
||||
17 (IIR) + 6 (Dline Init) instruction words
|
||||
|
||||
Data Words (16 or 24-bits):
|
||||
Coefs = Number of locations for coefficients (24-bits)
|
||||
2*Biquad_secs = Number of locations for the delay line (16-bits)
|
||||
N_samp = Number of samples locations for the input (16-bits)
|
||||
N_samp = Number of samples locations for the output (16-bits)
|
||||
|
||||
Notes:
|
||||
|
||||
**************************************************************/
|
||||
|
||||
#define N_samp 256
|
||||
#define Biquad_secs 2
|
||||
|
||||
.GLOBAL IIR, Zero_Dline;
|
||||
.EXTERN Dline, Coefs, Outbuf;
|
||||
|
||||
.section/pm program;
|
||||
IIR:
|
||||
SE = 0;
|
||||
CNTR = N_samp; /* Set CNTR for N input samples */
|
||||
DO filtering UNTIL CE;
|
||||
MX0 = DM(I1,M3); /* Read Input sample */
|
||||
MY0 = 0x2000;
|
||||
CNTR = Biquad_secs; /* Loop for each biquad */
|
||||
MR = MX0*MY0(SU),MX0 = DM(I0,M3), MY0 = PM(I4,M4); /* Scale input, fetch current biquad A2 */
|
||||
DO quads UNTIL CE;
|
||||
MR = MR+MX0*MY0(SS), MX1 = DM(I0,M3), MY0 = PM(I4,M4); /* Fetch current biquad A1 */
|
||||
MR = MR+MX1*MY0(SS), MY0 = PM(I4,M4); /* Fetch current biquad B2 */
|
||||
SR = ASHIFT MR1(HI), MY1 = PM(I4,M4); /* Fetch current biquad B1 */
|
||||
MR = MR+MX0*MY0(SS), MX0 = DM(I0,M0), MY0 = PM(I4,M4); /* Fetch next biquad A2 */
|
||||
quads:
|
||||
DM(I0,M3) = SR1, MR = MR+MX1*MY1(SS);
|
||||
filtering:
|
||||
DM(I2,M3) = MR1; /* Write filtered output */
|
||||
rts (db);
|
||||
nop;nop;
|
||||
|
||||
|
||||
.section/pm program;
|
||||
Zero_Dline:
|
||||
CNTR=LENGTH(Dline);
|
||||
DO zero UNTIL CE;
|
||||
zero: DM(I0,M0)=0; /* Zero the delay line */
|
||||
rts (db);
|
||||
nop;nop;
|
||||
|
||||
64
examples/adsp-2191_iir/iir_test.asm
Normal file
64
examples/adsp-2191_iir/iir_test.asm
Normal file
@@ -0,0 +1,64 @@
|
||||
/************************************************************************
|
||||
File Name: IIR_test.asm
|
||||
|
||||
Date Modified: 6/21/01 BJM
|
||||
|
||||
Description: ADSP-2192 single-core program to call
|
||||
IIR.asm. IIR.asm implements a Cascaded
|
||||
Biquad IIR filter. All data values and
|
||||
coefficients are assumed to be in 1.15
|
||||
format.
|
||||
|
||||
************************************************************************/
|
||||
|
||||
#define N_samp 256
|
||||
#define Biquad_secs 2
|
||||
#define Coef_Length 4*Biquad_secs + 1
|
||||
|
||||
.EXTERN IIR, Zero_Dline;
|
||||
.GLOBAL Dline, Coefs, Outbuf;
|
||||
|
||||
/* A2 A1 B2 B1 A2 A1 B2 B1 */
|
||||
/* A21, A11, B21, B11, A22, A12, B22, B12*/
|
||||
.section/pm data2;
|
||||
.VAR Coefs[4 * Biquad_secs] = "coef_hex.dat";
|
||||
|
||||
.section/data data1;
|
||||
.VAR Inbuf[N_samp] = "inreal_256.dat";
|
||||
.VAR Dline[2 * Biquad_secs];
|
||||
.VAR Outbuf[N_samp]; /* Filtered sample buffer */
|
||||
|
||||
/* PM interrupt vector code */
|
||||
.section/pm IVreset;
|
||||
JUMP start; NOP; NOP; NOP; /* Interupt vector table */
|
||||
|
||||
/* Program memory code */
|
||||
.section/pm program;
|
||||
start:
|
||||
DMPG2 = page(Coefs);
|
||||
I0=Dline; /* Initialize delay line pointer */
|
||||
I1 = Inbuf; /* Initialize input data pointer */
|
||||
I2 = Outbuf; /* Initialize output data pointer */
|
||||
I4 = Coefs;
|
||||
M0=1;
|
||||
M3 = 1;
|
||||
M4 = 1;
|
||||
AX0 = I0;
|
||||
reg(B0) = AX0; /* Initialize pointer to delay line */
|
||||
AX0 = I4;
|
||||
reg(B4) = AX0; /* Initialize pointer to delay line */
|
||||
|
||||
CALL Zero_Dline (db); /* Call zero delay function */
|
||||
L0 = length(Dline); /* Initialize delay line circular buffer */
|
||||
L1 = 0; /* Initialize for modulo addressing */
|
||||
CALL IIR (db); /* Call IIR filter function */
|
||||
M0 = 0;
|
||||
L4 = Coef_Length; /* Initialize for modulo addressing */
|
||||
|
||||
looping: JUMP looping; /* Loop upon itself */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
256
examples/adsp-2191_iir/inreal_256.dat
Normal file
256
examples/adsp-2191_iir/inreal_256.dat
Normal file
@@ -0,0 +1,256 @@
|
||||
-5,
|
||||
231,
|
||||
-69,
|
||||
118,
|
||||
-112,
|
||||
98,
|
||||
-152,
|
||||
56,
|
||||
-260,
|
||||
-42,
|
||||
226,
|
||||
-24,
|
||||
130,
|
||||
-69,
|
||||
123,
|
||||
-112,
|
||||
104,
|
||||
-211,
|
||||
-33,
|
||||
229,
|
||||
0,
|
||||
80,
|
||||
-69,
|
||||
87,
|
||||
-127,
|
||||
71,
|
||||
-208,
|
||||
-73,
|
||||
194,
|
||||
32,
|
||||
49,
|
||||
-42,
|
||||
58,
|
||||
-97,
|
||||
62,
|
||||
-197,
|
||||
-112,
|
||||
168,
|
||||
78,
|
||||
35,
|
||||
20,
|
||||
54,
|
||||
-53,
|
||||
50,
|
||||
-152,
|
||||
-125,
|
||||
159,
|
||||
133,
|
||||
3,
|
||||
44,
|
||||
7,
|
||||
-32,
|
||||
10,
|
||||
-118,
|
||||
-150,
|
||||
126,
|
||||
157,
|
||||
-31,
|
||||
69,
|
||||
-49,
|
||||
-18,
|
||||
-45,
|
||||
-98,
|
||||
-185,
|
||||
97,
|
||||
185,
|
||||
-68,
|
||||
102,
|
||||
-52,
|
||||
48,
|
||||
-41,
|
||||
-26,
|
||||
-198,
|
||||
79,
|
||||
220,
|
||||
-77,
|
||||
122,
|
||||
-77,
|
||||
77,
|
||||
-74,
|
||||
10,
|
||||
-216,
|
||||
53,
|
||||
232,
|
||||
-84,
|
||||
138,
|
||||
-94,
|
||||
103,
|
||||
-96,
|
||||
49,
|
||||
-215,
|
||||
35,
|
||||
243,
|
||||
-87,
|
||||
115,
|
||||
-125,
|
||||
94,
|
||||
-141,
|
||||
33,
|
||||
-270,
|
||||
-24,
|
||||
233,
|
||||
-57,
|
||||
127,
|
||||
-101,
|
||||
111,
|
||||
-141,
|
||||
60,
|
||||
-254,
|
||||
-27,
|
||||
239,
|
||||
-25,
|
||||
118,
|
||||
-73,
|
||||
123,
|
||||
-118,
|
||||
84,
|
||||
-232,
|
||||
-43,
|
||||
222,
|
||||
-1,
|
||||
93,
|
||||
-52,
|
||||
96,
|
||||
-111,
|
||||
86,
|
||||
-215,
|
||||
-84,
|
||||
192,
|
||||
29,
|
||||
48,
|
||||
-36,
|
||||
62,
|
||||
-100,
|
||||
60,
|
||||
-194,
|
||||
-106,
|
||||
179,
|
||||
88,
|
||||
31,
|
||||
5,
|
||||
33,
|
||||
-71,
|
||||
41,
|
||||
-156,
|
||||
-121,
|
||||
153,
|
||||
109,
|
||||
-23,
|
||||
15,
|
||||
-20,
|
||||
-51,
|
||||
-4,
|
||||
-131,
|
||||
-163,
|
||||
114,
|
||||
149,
|
||||
-44,
|
||||
62,
|
||||
-37,
|
||||
-4,
|
||||
-28,
|
||||
-80,
|
||||
-175,
|
||||
112,
|
||||
203,
|
||||
-53,
|
||||
112,
|
||||
-54,
|
||||
35,
|
||||
-57,
|
||||
-40,
|
||||
-203,
|
||||
65,
|
||||
209,
|
||||
-76,
|
||||
120,
|
||||
-86,
|
||||
70,
|
||||
-77,
|
||||
9,
|
||||
-219,
|
||||
47,
|
||||
240,
|
||||
-75,
|
||||
126,
|
||||
-115,
|
||||
79,
|
||||
-121,
|
||||
20,
|
||||
-245,
|
||||
11,
|
||||
230,
|
||||
-78,
|
||||
135,
|
||||
-102,
|
||||
112,
|
||||
-119,
|
||||
75,
|
||||
-226,
|
||||
12,
|
||||
256,
|
||||
-42,
|
||||
142,
|
||||
-91,
|
||||
117,
|
||||
-126,
|
||||
88,
|
||||
-223,
|
||||
-8,
|
||||
244,
|
||||
-24,
|
||||
118,
|
||||
-81,
|
||||
113,
|
||||
-131,
|
||||
73,
|
||||
-245,
|
||||
-62,
|
||||
207,
|
||||
-22,
|
||||
57,
|
||||
-84,
|
||||
76,
|
||||
-121,
|
||||
79,
|
||||
-222,
|
||||
-80,
|
||||
203,
|
||||
43,
|
||||
54,
|
||||
-34,
|
||||
67,
|
||||
-94,
|
||||
72,
|
||||
-177,
|
||||
-88,
|
||||
192,
|
||||
84,
|
||||
17,
|
||||
-5,
|
||||
22,
|
||||
-90,
|
||||
11,
|
||||
-189,
|
||||
-153,
|
||||
134,
|
||||
105,
|
||||
-34,
|
||||
14,
|
||||
-10,
|
||||
-38,
|
||||
11,
|
||||
-119,
|
||||
-145,
|
||||
133
|
||||
@@ -0,0 +1,80 @@
|
||||
****************************************************************************
|
||||
|
||||
Viterbi.asm Soft Decision GSM Viterbi Decoder
|
||||
|
||||
Analog Devices, Inc.
|
||||
DSP Division
|
||||
Three Technology Way
|
||||
P.O. Box 9106
|
||||
Norwood, MA 02062
|
||||
|
||||
21-JUNE-2001 BJM
|
||||
|
||||
This directory contains an example ADSP-2191 single-core subroutine
|
||||
that implements a soft decision half-rate, soft-decision, GSM Viterbi decoder.
|
||||
|
||||
Files contained in this directory:
|
||||
|
||||
VITERBI.dpj VisualDSP project file
|
||||
VITERBI.asm ADSP-2191 source for Viterbi
|
||||
ADSP-2191.ldf Linker description file
|
||||
GSM_REC.dat Soft decision data for Viterbi
|
||||
_________________________________________________________________
|
||||
|
||||
CONTENTS
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
|
||||
The project Viterbi.dpj contains an implementation of a single-core
|
||||
subroutine that implements a half-rate, soft-decision, GSM Vitertbi decoder.
|
||||
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
|
||||
1. METRIC UPDATE:
|
||||
-----------------
|
||||
The metric update section accumulates branch distance metrics into path metrics.
|
||||
The lowest path metric at the end of processing is considered to denote the
|
||||
path most likely to contain the correct decoding of the input.
|
||||
|
||||
Each element of the state_trans[] array represents a state transition.
|
||||
Each of the 16-bits in an element of state_trans[] represents one of the
|
||||
16 possible new states, and indicates which of two possible states
|
||||
is the most likely previous state.
|
||||
|
||||
2. TRACE BACK:
|
||||
--------------
|
||||
The traceback traces back through the state_trans[] array. Starting
|
||||
with a new state, the bits of "state" are rotated to compute the
|
||||
position of the bit in the current state_trans[] array element that
|
||||
represents this new state. This bit indicates which state was previous.
|
||||
We update the state to the previous state using this bit.
|
||||
|
||||
During any state transition, the most significant of the four bits in
|
||||
"state" is the most recent input bit to the convolutional encoder.
|
||||
This is the bit which is added to the output of the decoder.
|
||||
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
1. INPUT SAMPLES:
|
||||
-----------------
|
||||
The Viterbi decoder routine expects input data which conforms to the following criteria:
|
||||
|
||||
The class 1 bits are encoded with the 1/2 rate convolutional code defined by
|
||||
the polynomials:
|
||||
|
||||
G0 = 1 + D3+ D4
|
||||
G1 = 1 + D + D3+ D4
|
||||
|
||||
Encoded outputs are transmitted as signed antipodal analog signals. They are received at
|
||||
the decoder and quantized. The quantized number is represented in a 2's
|
||||
compliment giving the range of -8 to 7. The process of quantizing a binary analog signal
|
||||
with a multi-bit qunatizer is called soft decision. This soft decision is stored in the
|
||||
array 'SOFT_DEC_INPUT'.
|
||||
|
||||
|
||||
|
||||
|
||||
BIN
examples/adsp-2191_viterbi_decoder/ADSP-2191 Viterbi.dpj
Normal file
BIN
examples/adsp-2191_viterbi_decoder/ADSP-2191 Viterbi.dpj
Normal file
Binary file not shown.
115
examples/adsp-2191_viterbi_decoder/ADSP-2191.ldf
Normal file
115
examples/adsp-2191_viterbi_decoder/ADSP-2191.ldf
Normal file
@@ -0,0 +1,115 @@
|
||||
|
||||
ARCHITECTURE(ADSP-2191)
|
||||
|
||||
$OBJECTS = $COMMAND_LINE_OBJECTS;
|
||||
// This memory map is set up to facilite testing of the tool
|
||||
// chain -- code and data area are as large as possible.
|
||||
|
||||
MEMORY
|
||||
{
|
||||
seg_dmy { TYPE(PM RAM) START(0x000000) END(0x000003) WIDTH(24) }
|
||||
seg_itab { TYPE(PM RAM) START(0x000004) END(0x00003f) WIDTH(24) }
|
||||
seg_code { TYPE(PM RAM) START(0x000040) END(0x003fff) WIDTH(24) }
|
||||
|
||||
seg_buf2 { TYPE(DM RAM) START(0x008000) END(0x0088ff) WIDTH(16) }
|
||||
seg_buf1 { TYPE(DM RAM) START(0x008900) END(0x0095ff) WIDTH(16) }
|
||||
seg_data1 { TYPE(DM RAM) START(0x009600) END(0x00afff) WIDTH(16) }
|
||||
seg_data2 { TYPE(PM RAM) START(0x004000) END(0x006bff) WIDTH(24) }
|
||||
seg_heap { TYPE(DM RAM) START(0x00f200) END(0x00f9ff) WIDTH(16) }
|
||||
seg_stack { TYPE(DM RAM) START(0x00fa00) END(0x00ffff) WIDTH(16) }
|
||||
}
|
||||
|
||||
PROCESSOR p0
|
||||
{
|
||||
LINK_AGAINST( $COMMAND_LINE_LINK_AGAINST)
|
||||
OUTPUT( $COMMAND_LINE_OUTPUT_FILE )
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
sec_dmy
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVreset))
|
||||
} > seg_dmy
|
||||
|
||||
sec_itab
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(IVpwrdwn))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVkernel))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVstackint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVmailboxint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVtimerint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVringint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVpcibmint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVdspdspint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo0rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1tmitint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVfifo1rcveint))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint13))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVint14))
|
||||
. = .+0x1;
|
||||
INPUT_SECTIONS( $OBJECTS(IVac97frint))
|
||||
. = .+0x1;
|
||||
} > seg_itab
|
||||
seg_code
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(program) )
|
||||
} >seg_code
|
||||
|
||||
sec_buf1
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf1) )
|
||||
}>seg_buf1
|
||||
|
||||
sec_buf2
|
||||
{
|
||||
INPUT_SECTIONS($OBJECTS(seg_buf2) )
|
||||
}>seg_buf2
|
||||
|
||||
sec_data1
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data1) )
|
||||
} >seg_data1
|
||||
|
||||
sec_data2
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(data2) )
|
||||
INPUT_SECTIONS( $OBJECTS(program2) )
|
||||
} >seg_data2
|
||||
|
||||
|
||||
// support for initialization, including C++
|
||||
sec_ctor
|
||||
{
|
||||
INPUT_SECTIONS( $OBJECTS(ctor))
|
||||
} >seg_data1
|
||||
|
||||
// provide linker variables describing the stack (grows down)
|
||||
// ldf_stack_limit is the lowest address in the stack
|
||||
// ldf_stack_base is the highest address in the stack
|
||||
sec_stack
|
||||
{
|
||||
ldf_stack_limit = .;
|
||||
ldf_stack_base = . + MEMORY_SIZEOF(seg_stack) - 1;
|
||||
} >seg_stack
|
||||
sec_heap
|
||||
{
|
||||
.heap = .;
|
||||
.heap_size = MEMORY_SIZEOF(seg_heap);
|
||||
.heap_end = . + MEMORY_SIZEOF(seg_heap) - 1;
|
||||
} >seg_heap
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
****************************************************************************
|
||||
|
||||
Viterbi.asm Soft Decision GSM Viterbi Decoder
|
||||
|
||||
Analog Devices, Inc.
|
||||
DSP Division
|
||||
Three Technology Way
|
||||
P.O. Box 9106
|
||||
Norwood, MA 02062
|
||||
|
||||
21-JUNE-2001 BJM
|
||||
|
||||
This directory contains an example ADSP-2191 single-core subroutine
|
||||
that implements a soft decision half-rate, soft-decision, GSM Viterbi decoder.
|
||||
|
||||
Files contained in this directory:
|
||||
|
||||
VITERBI.dpj VisualDSP project file
|
||||
VITERBI.asm ADSP-2191 source for Viterbi
|
||||
ADSP-2191.ldf Linker description file
|
||||
GSM_REC.dat Soft decision data for Viterbi
|
||||
_________________________________________________________________
|
||||
|
||||
CONTENTS
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
I. FUNCTION/ALGORITHM DESCRIPTION
|
||||
|
||||
The project Viterbi.dpj contains an implementation of a single-core
|
||||
subroutine that implements a half-rate, soft-decision, GSM Vitertbi decoder.
|
||||
|
||||
II. IMPLEMENTATION DESCRIPTION
|
||||
|
||||
1. METRIC UPDATE:
|
||||
-----------------
|
||||
The metric update section accumulates branch distance metrics into path metrics.
|
||||
The lowest path metric at the end of processing is considered to denote the
|
||||
path most likely to contain the correct decoding of the input.
|
||||
|
||||
Each element of the state_trans[] array represents a state transition.
|
||||
Each of the 16-bits in an element of state_trans[] represents one of the
|
||||
16 possible new states, and indicates which of two possible states
|
||||
is the most likely previous state.
|
||||
|
||||
2. TRACE BACK:
|
||||
--------------
|
||||
The traceback traces back through the state_trans[] array. Starting
|
||||
with a new state, the bits of "state" are rotated to compute the
|
||||
position of the bit in the current state_trans[] array element that
|
||||
represents this new state. This bit indicates which state was previous.
|
||||
We update the state to the previous state using this bit.
|
||||
|
||||
During any state transition, the most significant of the four bits in
|
||||
"state" is the most recent input bit to the convolutional encoder.
|
||||
This is the bit which is added to the output of the decoder.
|
||||
|
||||
III. DESCRIPTION OF INPUT DATA
|
||||
|
||||
1. INPUT SAMPLES:
|
||||
-----------------
|
||||
The Viterbi decoder routine expects input data which conforms to the following criteria:
|
||||
|
||||
The class 1 bits are encoded with the 1/2 rate convolutional code defined by
|
||||
the polynomials:
|
||||
|
||||
G0 = 1 + D3+ D4
|
||||
G1 = 1 + D + D3+ D4
|
||||
|
||||
Encoded outputs are transmitted as signed antipodal analog signals. They are received at
|
||||
the decoder and quantized. The quantized number is represented in a 2's
|
||||
compliment giving the range of -8 to 7. The process of quantizing a binary analog signal
|
||||
with a multi-bit qunatizer is called soft decision. This soft decision is stored in the
|
||||
array 'SOFT_DEC_INPUT'.
|
||||
|
||||
|
||||
|
||||
|
||||
378
examples/adsp-2191_viterbi_decoder/GSM_rec.dat
Normal file
378
examples/adsp-2191_viterbi_decoder/GSM_rec.dat
Normal file
@@ -0,0 +1,378 @@
|
||||
4,
|
||||
0,
|
||||
-3,
|
||||
-6,
|
||||
1,
|
||||
-4,
|
||||
-5,
|
||||
-4,
|
||||
3,
|
||||
-2,
|
||||
2,
|
||||
-6,
|
||||
1,
|
||||
-6,
|
||||
1,
|
||||
-6,
|
||||
-1,
|
||||
-4,
|
||||
0,
|
||||
-4,
|
||||
4,
|
||||
1,
|
||||
-5,
|
||||
6,
|
||||
3,
|
||||
3,
|
||||
-1,
|
||||
1,
|
||||
0,
|
||||
-5,
|
||||
0,
|
||||
-1,
|
||||
-7,
|
||||
0,
|
||||
-5,
|
||||
-3,
|
||||
-2,
|
||||
5,
|
||||
-6,
|
||||
2,
|
||||
0,
|
||||
-4,
|
||||
2,
|
||||
-1,
|
||||
1,
|
||||
5,
|
||||
4,
|
||||
5,
|
||||
0,
|
||||
1,
|
||||
3,
|
||||
0,
|
||||
6,
|
||||
6,
|
||||
-5,
|
||||
-3,
|
||||
-1,
|
||||
-1,
|
||||
5,
|
||||
2,
|
||||
6,
|
||||
3,
|
||||
4,
|
||||
0,
|
||||
-6,
|
||||
-6,
|
||||
-1,
|
||||
2,
|
||||
2,
|
||||
-1,
|
||||
-4,
|
||||
-1,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
2,
|
||||
-5,
|
||||
6,
|
||||
6,
|
||||
-4,
|
||||
0,
|
||||
-6,
|
||||
-5,
|
||||
-6,
|
||||
6,
|
||||
-5,
|
||||
1,
|
||||
-7,
|
||||
-7,
|
||||
-6,
|
||||
6,
|
||||
4,
|
||||
4,
|
||||
6,
|
||||
-7,
|
||||
6,
|
||||
-4,
|
||||
3,
|
||||
2,
|
||||
-2,
|
||||
0,
|
||||
-1,
|
||||
-2,
|
||||
0,
|
||||
-6,
|
||||
5,
|
||||
0,
|
||||
-4,
|
||||
-2,
|
||||
6,
|
||||
0,
|
||||
-4,
|
||||
0,
|
||||
3,
|
||||
-2,
|
||||
3,
|
||||
-3,
|
||||
-7,
|
||||
-6,
|
||||
0,
|
||||
1,
|
||||
-3,
|
||||
0,
|
||||
-1,
|
||||
5,
|
||||
4,
|
||||
-5,
|
||||
6,
|
||||
2,
|
||||
-3,
|
||||
-7,
|
||||
3,
|
||||
2,
|
||||
6,
|
||||
5,
|
||||
2,
|
||||
0,
|
||||
2,
|
||||
6,
|
||||
-3,
|
||||
3,
|
||||
2,
|
||||
0,
|
||||
2,
|
||||
-7,
|
||||
4,
|
||||
6,
|
||||
6,
|
||||
-5,
|
||||
-4,
|
||||
0,
|
||||
4,
|
||||
1,
|
||||
-7,
|
||||
4,
|
||||
6,
|
||||
4,
|
||||
6,
|
||||
0,
|
||||
-6,
|
||||
0,
|
||||
-4,
|
||||
2,
|
||||
4,
|
||||
2,
|
||||
0,
|
||||
-2,
|
||||
-1,
|
||||
0,
|
||||
5,
|
||||
2,
|
||||
0,
|
||||
-2,
|
||||
5,
|
||||
2,
|
||||
-6,
|
||||
3,
|
||||
-4,
|
||||
5,
|
||||
0,
|
||||
6,
|
||||
0,
|
||||
0,
|
||||
2,
|
||||
6,
|
||||
-7,
|
||||
1,
|
||||
5,
|
||||
-4,
|
||||
-2,
|
||||
-2,
|
||||
-5,
|
||||
1,
|
||||
6,
|
||||
-5,
|
||||
-7,
|
||||
-4,
|
||||
1,
|
||||
0,
|
||||
1,
|
||||
-3,
|
||||
5,
|
||||
1,
|
||||
6,
|
||||
-7,
|
||||
-6,
|
||||
1,
|
||||
-6,
|
||||
3,
|
||||
-5,
|
||||
-7,
|
||||
-3,
|
||||
-2,
|
||||
0,
|
||||
6,
|
||||
-5,
|
||||
-4,
|
||||
1,
|
||||
-2,
|
||||
6,
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
-4,
|
||||
-6,
|
||||
6,
|
||||
4,
|
||||
4,
|
||||
3,
|
||||
6,
|
||||
5,
|
||||
5,
|
||||
0,
|
||||
-7,
|
||||
-7,
|
||||
0,
|
||||
5,
|
||||
4,
|
||||
-3,
|
||||
-2,
|
||||
-3,
|
||||
6,
|
||||
6,
|
||||
-6,
|
||||
-1,
|
||||
-4,
|
||||
-2,
|
||||
-7,
|
||||
2,
|
||||
0,
|
||||
4,
|
||||
1,
|
||||
-7,
|
||||
2,
|
||||
-7,
|
||||
3,
|
||||
1,
|
||||
2,
|
||||
5,
|
||||
0,
|
||||
-5,
|
||||
-4,
|
||||
-6,
|
||||
-7,
|
||||
4,
|
||||
-3,
|
||||
5,
|
||||
-5,
|
||||
5,
|
||||
-2,
|
||||
-5,
|
||||
-4,
|
||||
2,
|
||||
2,
|
||||
-5,
|
||||
3,
|
||||
-1,
|
||||
-1,
|
||||
3,
|
||||
2,
|
||||
-5,
|
||||
5,
|
||||
0,
|
||||
6,
|
||||
3,
|
||||
-3,
|
||||
-3,
|
||||
3,
|
||||
5,
|
||||
-5,
|
||||
-6,
|
||||
6,
|
||||
-6,
|
||||
1,
|
||||
6,
|
||||
-7,
|
||||
-4,
|
||||
5,
|
||||
6,
|
||||
5,
|
||||
-4,
|
||||
6,
|
||||
3,
|
||||
-6,
|
||||
-4,
|
||||
3,
|
||||
2,
|
||||
3,
|
||||
-3,
|
||||
4,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
-7,
|
||||
4,
|
||||
1,
|
||||
3,
|
||||
-5,
|
||||
-5,
|
||||
-6,
|
||||
-3,
|
||||
5,
|
||||
3,
|
||||
-4,
|
||||
-7,
|
||||
6,
|
||||
-2,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
3,
|
||||
0,
|
||||
4,
|
||||
0,
|
||||
2,
|
||||
5,
|
||||
4,
|
||||
2,
|
||||
-5,
|
||||
3,
|
||||
-4,
|
||||
-6,
|
||||
-6,
|
||||
-2,
|
||||
-2,
|
||||
-3,
|
||||
6,
|
||||
-4,
|
||||
-3,
|
||||
-7,
|
||||
4,
|
||||
-1,
|
||||
0,
|
||||
-5,
|
||||
-3,
|
||||
2,
|
||||
5,
|
||||
4,
|
||||
-5,
|
||||
5,
|
||||
5,
|
||||
-7,
|
||||
-5,
|
||||
-7,
|
||||
-2,
|
||||
-1,
|
||||
-4,
|
||||
0,
|
||||
2,
|
||||
4,
|
||||
-6,
|
||||
-1,
|
||||
-2,
|
||||
4,
|
||||
1,
|
||||
-4,
|
||||
-7
|
||||
189
examples/adsp-2191_viterbi_decoder/VITERBI.asm
Normal file
189
examples/adsp-2191_viterbi_decoder/VITERBI.asm
Normal file
@@ -0,0 +1,189 @@
|
||||
/**************************************************************
|
||||
File Name: Viterbi.asm
|
||||
|
||||
Date Modified: 6/23/01 BJM
|
||||
|
||||
Description:
|
||||
ADSP-2192 single core subroutine that implements the
|
||||
1/2 rate GSM soft decision Viterbi decoder.
|
||||
|
||||
Assumptions:
|
||||
The class 1 bits are encoded with the 1/2 rate convolutional code defined by
|
||||
the polynomials:
|
||||
G0 = 1 + D3+ D4
|
||||
G1 = 1 + D + D3+ D4
|
||||
|
||||
Encoded outputs are transmitted as signed antipodal analog signals. They are recieved at
|
||||
the decoder and quantized. The quantized number is represented in a 2's
|
||||
compliment giving the range of -8 to 7. The process of quantizing a binary analog signal
|
||||
with a multi-bit qunatizer is called soft decision. This soft decision is represented by
|
||||
the array 'SOFT_DEC_INPUT'
|
||||
|
||||
|
||||
Registers Affected:
|
||||
I0,I1,I2,I3,I4
|
||||
M0,M1,M2,M3,M4,M5,M6,M7
|
||||
L0,L1,L2,L3,L4
|
||||
B1,B3,B4
|
||||
AX0,AX1,AY0,AY1
|
||||
AR,AF,SR,SI,SE
|
||||
MX0
|
||||
|
||||
Cycle Count:
|
||||
30751 Cycles
|
||||
Memory Usage:
|
||||
Instructions Words (24-bits):
|
||||
107 instruction words
|
||||
|
||||
Data Words (16 or 24-bits):
|
||||
2*N_out = Number of soft decisions (16-bit)
|
||||
N_out = Number of state transitions (16-bit)
|
||||
16 = Number of New and Old metrics (16-bit)
|
||||
N_Words = Decoded output of GSM frame (16-bit)
|
||||
8 = Metric Table (16-bit)
|
||||
|
||||
Notes:
|
||||
|
||||
**************************************************************/
|
||||
|
||||
#define N_out 189
|
||||
#define N_words 12
|
||||
#define N_mod_16 13
|
||||
|
||||
/* DM data */
|
||||
.section/data data1;
|
||||
.VAR soft_dec_input[2*N_out] = "gsm_rec.dat";
|
||||
.VAR state_trans[N_out];
|
||||
.VAR old_acc_metric[16];
|
||||
.VAR new_acc_metric[16];
|
||||
.VAR decoded_output[N_words+4];
|
||||
.VAR met_table[8];
|
||||
|
||||
|
||||
|
||||
/* PM interrupt vector code */
|
||||
.section/pm IVreset;
|
||||
JUMP start; NOP; NOP; NOP; /* Interupt vector table */
|
||||
|
||||
/* Program memory code */
|
||||
.section/pm program;
|
||||
start:
|
||||
I0 = soft_dec_input; /* Initialize soft_dec_input pointer */
|
||||
L0 = 0; /* Initialize for modulo addressing */
|
||||
I1 = old_acc_metric; /* Initialize old_acc_metric pointer */
|
||||
L1 = length(old_acc_metric); /* Initialize old_acc_metric circular buffer */
|
||||
AX0 = I1;
|
||||
reg(B1) = AX0; /* Initialize pointer to old_acc_metric */
|
||||
I2 = state_trans; /* Initialize state_trans pointer */
|
||||
L2 = 0; /* Initialize for modulo addressing */
|
||||
I3 = met_table; /* Initialize met_table pointer */
|
||||
L3 = length(met_table); /* Initialize met_table circular buffer */
|
||||
AX0 = I3;
|
||||
reg(B3) = AX0; /* Initialize pointer to met_table */
|
||||
I4 = new_acc_metric; /* Initialize new_acc_metric pointer */
|
||||
L4 = length(new_acc_metric); /* Initialize new_acc_metric circular buffer */
|
||||
AX0 = I4;
|
||||
reg(B4) = AX0; /* Initialize pointer to new_acc_metric */
|
||||
M0 = -8;
|
||||
M1 = 1;
|
||||
M2 = -16;
|
||||
M3 = 0;
|
||||
M4 = 8;
|
||||
M5 = -7;
|
||||
M6 = -8;
|
||||
M7 = -1;
|
||||
SE = 1; /* Setup bit shift */
|
||||
SI = 0X8000;
|
||||
SR0 = 0;
|
||||
SR1 = 0;
|
||||
|
||||
CNTR = 16;
|
||||
DO zero_metric UNTIL CE;
|
||||
zero_metric: dm(I1,M1) = M3; /* Initialize accumulated metric array */
|
||||
|
||||
CNTR = N_out; /* FOR (k=0; k<N_out; k++) */
|
||||
DO add_compare UNTIL CE;
|
||||
AX0 = dm(I0,M1);
|
||||
AY0 = dm(I0,M1);
|
||||
AR = AX0 + AY0;
|
||||
dm(I3,M1) = AR, AR = -AR;
|
||||
dm(I3,M1) = AR, AR = -AR;
|
||||
dm(I3,M1) = AR, AR = -AR;
|
||||
dm(I3,M1) = AR, AR = AX0 - AY0;
|
||||
dm(I3,M1) = AR, AR = -AR;
|
||||
dm(I3,M1) = AR, AR = -AR;
|
||||
dm(I3,M1) = AR, AR = -AR;
|
||||
dm(I3,M1) = AR;
|
||||
CNTR = 8; /* FOR (i=0; i<8; i++) */
|
||||
DO calc_metric UNTIL CE;
|
||||
AY0 = dm(I3,M1);
|
||||
AX1 = dm(I1,M1);
|
||||
AF = AX1 + AY0, AX0 = dm(I1,M1); /* AF = old_acc_metric[2*i] + Met_table */
|
||||
AR = AX0 - AY0; /* AR = old_acc_metric[2*i+1] - Met_table */
|
||||
SR = LSHIFT SR1 (HI); /* State_trans[k] = state_trans[k] << by 1 */
|
||||
NONE = AR - AF;
|
||||
IF GT SR = SR OR LSHIFT SI (LO); /* Then state_trans[k] = state_trans[k]<<1 | 1 */
|
||||
IF LT AR = PASS AF;
|
||||
dm(I4,M4) = AR, AF = AX1 - AY0; /* AF = old_acc_metric[2*i] - Met_table */
|
||||
AR = AX0 + AY0; /* AR = old_acc_metric[2*i+1] + (-Met_table) */
|
||||
SR = LSHIFT SR1 (HI); /* State_trans[k] = state_trans[k] << by 1 */
|
||||
NONE = AR - AF;
|
||||
IF GT SR = SR OR LSHIFT SI (LO); /* Then state_trans[k] = state_trans[k]<<1 | 1 */
|
||||
IF LT AR = PASS AF;
|
||||
|
||||
calc_metric: dm(I4,M5) = AR; /* New_acc_metric[i+2] = AR */
|
||||
|
||||
modify(I4,M6); /* Reset I4 to new_acc_metirc */
|
||||
AX1 = I1; /* AX1 = old_acc_metric */
|
||||
I1 = I4; /* Old_acc_metric = new_acc_metric */
|
||||
AX0 = I1;
|
||||
reg(B1) = AX0; /* Initialize pointer to old_acc_metric */
|
||||
I4 = AX1; /* New_acc_metric = AX1 */
|
||||
reg(B4) = AX1; /* Initialize pointer to new_acc_metric */
|
||||
add_compare: dm(I2,M1) = SR1; /* Store state_trans[k] */
|
||||
|
||||
|
||||
M1 = -1;
|
||||
I3 = decoded_output + N_words; /* Initialize decoded_output + N_words pointer */
|
||||
L3 = 0; /* Initialize for modulo addressing */
|
||||
AY0 = -15;
|
||||
AY1 = 15;
|
||||
MR0 = N_out - 1;
|
||||
MR1 = 0;
|
||||
SI = dm(I2,M1); /* Save previous state_trans */
|
||||
AX0 = 0;
|
||||
MX0 = N_mod_16; /* First word only has 13 valid bits */
|
||||
CNTR = N_words;
|
||||
DO trace_back UNTIL CE;
|
||||
CNTR = MX0;
|
||||
DO state_bits UNTIL CE;
|
||||
SR = LSHIFT MR1 by 1(LO); /* SR0 = State << 1 */
|
||||
AR = CLRBIT 4 OF SR0;
|
||||
AX1 = AR;
|
||||
AF = TSTBIT 4 OF SR0;
|
||||
IF NE AR = SETBIT 0 OF AR;
|
||||
AR = AR + AY0, SI = dm(I2,M1); /* Bit_Pos = 15 - rotate(State) */
|
||||
SE = AR;
|
||||
SR = LSHIFT SI (LO);
|
||||
AR = TSTBIT 0 OF SR0;
|
||||
AR = AR OR AX1; /* AR = state_trans[k] >> Bit_Pos */
|
||||
MR2 = AR, AR = MR0 AND AY1;
|
||||
SR = LSHIFT MR1 by - 3(LO);
|
||||
SE = AR;
|
||||
AR = TSTBIT 0 OF SR0;
|
||||
SI = AR;
|
||||
SR = LSHIFT SI (LO);
|
||||
AR = AX0 OR SR0;
|
||||
AX0 = AR;
|
||||
AR = MR0 -1; /* Decoded_output |= ((State & 8) >> 3) << (k & 15) */
|
||||
MR0 = AR;
|
||||
state_bits:
|
||||
MR1 = MR2; /* State = new_acc_metric */
|
||||
MX0 = 16;
|
||||
dm(I3,M1) = AX0;
|
||||
trace_back:
|
||||
AX0 = 0;
|
||||
|
||||
looping: JUMP looping; /* Loop upon itself */
|
||||
|
||||
|
||||
BIN
examples/isa_test.bin
Normal file
BIN
examples/isa_test.bin
Normal file
Binary file not shown.
94
examples/isa_test.dsp
Normal file
94
examples/isa_test.dsp
Normal file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* isa_test.dsp -- ADSP-219x ISA coverage test for disassembler validation.
|
||||
* Assembles with open21xx as219x.
|
||||
*/
|
||||
.section/PM program0;
|
||||
.global _start;
|
||||
_start:
|
||||
|
||||
/* Type 30: NOP */
|
||||
nop;
|
||||
|
||||
/* Type 6: Dreg = Imm16 */
|
||||
ax0 = 0x1234;
|
||||
ax1 = 0x5678;
|
||||
ay0 = 0xAAAA;
|
||||
mx0 = 0x4000;
|
||||
my0 = 0x2000;
|
||||
|
||||
/* Type 7: Reg1/Reg2 = Imm16 */
|
||||
i0 = 0x0100;
|
||||
i1 = 0x0200;
|
||||
i4 = 0x0300;
|
||||
m0 = 1;
|
||||
m1 = 1;
|
||||
m3 = -1;
|
||||
m4 = 1;
|
||||
l0 = 0;
|
||||
l4 = 0;
|
||||
cntr = 10;
|
||||
|
||||
/* Type 17: Reg = Reg */
|
||||
ar = ax0;
|
||||
si = ax1;
|
||||
mr0 = mx0;
|
||||
|
||||
/* Type 9: Conditional Compute */
|
||||
ar = ax0 + ay0;
|
||||
ar = ax0 - ay0;
|
||||
ar = ax0 and ay0;
|
||||
ar = ax0 or ay0;
|
||||
ar = ax0 xor ay0;
|
||||
ar = pass ax0;
|
||||
ar = -ax0;
|
||||
ar = abs ax0;
|
||||
mr = mx0 * my0 (ss);
|
||||
|
||||
/* Type 10: Direct Jump */
|
||||
jump _skip1;
|
||||
_skip1:
|
||||
nop;
|
||||
|
||||
/* Type 10: Conditional Jump */
|
||||
if eq jump _skip2;
|
||||
_skip2:
|
||||
nop;
|
||||
|
||||
/* Type 10: Call */
|
||||
call _sub1;
|
||||
jump _after_sub;
|
||||
|
||||
_sub1:
|
||||
nop;
|
||||
rts;
|
||||
|
||||
_after_sub:
|
||||
|
||||
/* Type 20: Return variants */
|
||||
nop;
|
||||
|
||||
/* Type 11: DO UNTIL */
|
||||
cntr = 4;
|
||||
do _loop_end until ce;
|
||||
nop;
|
||||
_loop_end:
|
||||
nop;
|
||||
|
||||
/* Type 15: Shift Immediate */
|
||||
sr = lshift si by 4 (hi);
|
||||
sr = ashift si by -2 (hi);
|
||||
|
||||
/* Type 18: Mode Control */
|
||||
dis ar_sat;
|
||||
ena ar_sat;
|
||||
|
||||
/* Type 25: Saturate */
|
||||
sat mr;
|
||||
|
||||
/* Type 33: Reg3 = short constant */
|
||||
se = 0;
|
||||
|
||||
/* Infinite loop */
|
||||
_halt:
|
||||
jump _halt;
|
||||
|
||||
BIN
examples/isa_test.elf
Normal file
BIN
examples/isa_test.elf
Normal file
Binary file not shown.
BIN
examples/isa_test.o
Normal file
BIN
examples/isa_test.o
Normal file
Binary file not shown.
Reference in New Issue
Block a user