mbed port of FFT routines from STM32 DSP library and Ivan Mellen's implementation. Tested on LPC2368 mbed but should work on 1768 too (original code was written for Cortex-M3)
cr4_fft_64_stm32.s@0:90ade34a3b71, 2009-12-13 (annotated)
- Committer:
- igorsk
- Date:
- Sun Dec 13 07:14:57 2009 +0000
- Revision:
- 0:90ade34a3b71
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
igorsk | 0:90ade34a3b71 | 1 | ;******************** (C) COPYRIGHT 2009 STMicroelectronics ******************** |
igorsk | 0:90ade34a3b71 | 2 | ;* File Name : cr4_fft_64_stm32.s |
igorsk | 0:90ade34a3b71 | 3 | ;* Author : MCD Application Team |
igorsk | 0:90ade34a3b71 | 4 | ;* Version : V2.0.0 |
igorsk | 0:90ade34a3b71 | 5 | ;* Date : 04/27/2009 |
igorsk | 0:90ade34a3b71 | 6 | ;* Description : Optimized 64-point radix-4 complex FFT for Cortex-M3 |
igorsk | 0:90ade34a3b71 | 7 | ;******************************************************************************** |
igorsk | 0:90ade34a3b71 | 8 | ;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS |
igorsk | 0:90ade34a3b71 | 9 | ;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. |
igorsk | 0:90ade34a3b71 | 10 | ;* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT, |
igorsk | 0:90ade34a3b71 | 11 | ;* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE |
igorsk | 0:90ade34a3b71 | 12 | ;* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING |
igorsk | 0:90ade34a3b71 | 13 | ;* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. |
igorsk | 0:90ade34a3b71 | 14 | ;*******************************************************************************/ |
igorsk | 0:90ade34a3b71 | 15 | |
igorsk | 0:90ade34a3b71 | 16 | ;THUMB |
igorsk | 0:90ade34a3b71 | 17 | REQUIRE8 |
igorsk | 0:90ade34a3b71 | 18 | PRESERVE8 |
igorsk | 0:90ade34a3b71 | 19 | |
igorsk | 0:90ade34a3b71 | 20 | AREA |.text|, CODE, READONLY, ALIGN=4 |
igorsk | 0:90ade34a3b71 | 21 | |
igorsk | 0:90ade34a3b71 | 22 | EXPORT cr4_fft_64_stm32 |
igorsk | 0:90ade34a3b71 | 23 | EXTERN TableFFT |
igorsk | 0:90ade34a3b71 | 24 | |
igorsk | 0:90ade34a3b71 | 25 | |
igorsk | 0:90ade34a3b71 | 26 | pssK RN R0 |
igorsk | 0:90ade34a3b71 | 27 | pssOUT RN R0 |
igorsk | 0:90ade34a3b71 | 28 | pssX RN R1 |
igorsk | 0:90ade34a3b71 | 29 | pssIN RN R1 |
igorsk | 0:90ade34a3b71 | 30 | butternbr RN R2 |
igorsk | 0:90ade34a3b71 | 31 | Nbin RN R2 |
igorsk | 0:90ade34a3b71 | 32 | index RN R3 |
igorsk | 0:90ade34a3b71 | 33 | Ar RN R4 |
igorsk | 0:90ade34a3b71 | 34 | Ai RN R5 |
igorsk | 0:90ade34a3b71 | 35 | Br RN R6 |
igorsk | 0:90ade34a3b71 | 36 | Bi RN R7 |
igorsk | 0:90ade34a3b71 | 37 | Cr RN R8 |
igorsk | 0:90ade34a3b71 | 38 | Ci RN R9 |
igorsk | 0:90ade34a3b71 | 39 | Dr RN R10 |
igorsk | 0:90ade34a3b71 | 40 | Di RN R11 |
igorsk | 0:90ade34a3b71 | 41 | cntrbitrev RN R12 |
igorsk | 0:90ade34a3b71 | 42 | tmp RN R12 |
igorsk | 0:90ade34a3b71 | 43 | pssIN2 RN R14 |
igorsk | 0:90ade34a3b71 | 44 | tmp2 RN R14 |
igorsk | 0:90ade34a3b71 | 45 | |
igorsk | 0:90ade34a3b71 | 46 | NPT EQU 64 |
igorsk | 0:90ade34a3b71 | 47 | |
igorsk | 0:90ade34a3b71 | 48 | ;----------------------------- MACROS ---------------------------------------- |
igorsk | 0:90ade34a3b71 | 49 | |
igorsk | 0:90ade34a3b71 | 50 | MACRO |
igorsk | 0:90ade34a3b71 | 51 | DEC $reg |
igorsk | 0:90ade34a3b71 | 52 | SUB $reg,$reg,#1 |
igorsk | 0:90ade34a3b71 | 53 | MEND |
igorsk | 0:90ade34a3b71 | 54 | |
igorsk | 0:90ade34a3b71 | 55 | MACRO |
igorsk | 0:90ade34a3b71 | 56 | INC $reg |
igorsk | 0:90ade34a3b71 | 57 | ADD $reg,$reg,#1 |
igorsk | 0:90ade34a3b71 | 58 | MEND |
igorsk | 0:90ade34a3b71 | 59 | |
igorsk | 0:90ade34a3b71 | 60 | |
igorsk | 0:90ade34a3b71 | 61 | MACRO |
igorsk | 0:90ade34a3b71 | 62 | QUAD $reg |
igorsk | 0:90ade34a3b71 | 63 | MOV $reg,$reg,LSL#2 |
igorsk | 0:90ade34a3b71 | 64 | MEND |
igorsk | 0:90ade34a3b71 | 65 | |
igorsk | 0:90ade34a3b71 | 66 | ;sXi = *(PssX+1); sXr = *PssX; PssX += offset; PssX= R1 |
igorsk | 0:90ade34a3b71 | 67 | |
igorsk | 0:90ade34a3b71 | 68 | MACRO |
igorsk | 0:90ade34a3b71 | 69 | LDR2Q $sXr,$sXi, $PssX, $offset |
igorsk | 0:90ade34a3b71 | 70 | LDRSH $sXi, [$PssX, #2] |
igorsk | 0:90ade34a3b71 | 71 | LDRSH $sXr, [$PssX] |
igorsk | 0:90ade34a3b71 | 72 | ADD $PssX, $PssX, $offset |
igorsk | 0:90ade34a3b71 | 73 | MEND |
igorsk | 0:90ade34a3b71 | 74 | |
igorsk | 0:90ade34a3b71 | 75 | ;!! Same macro, to be used when passing negative offset value !! |
igorsk | 0:90ade34a3b71 | 76 | MACRO |
igorsk | 0:90ade34a3b71 | 77 | LDR2Qm $sXr, $sXi, $PssX, $offset |
igorsk | 0:90ade34a3b71 | 78 | LDRSH $sXi, [$PssX, #2] |
igorsk | 0:90ade34a3b71 | 79 | LDRSH $sXr, [$PssX] |
igorsk | 0:90ade34a3b71 | 80 | SUB $PssX, $PssX, $offset |
igorsk | 0:90ade34a3b71 | 81 | MEND |
igorsk | 0:90ade34a3b71 | 82 | |
igorsk | 0:90ade34a3b71 | 83 | ;(PssX+1)= sXi; *PssX=sXr; PssX += offset; |
igorsk | 0:90ade34a3b71 | 84 | MACRO |
igorsk | 0:90ade34a3b71 | 85 | STR2Q $sXr, $sXi, $PssX, $offset |
igorsk | 0:90ade34a3b71 | 86 | STRH $sXi, [$PssX, #2] |
igorsk | 0:90ade34a3b71 | 87 | STRH $sXr, [$PssX] |
igorsk | 0:90ade34a3b71 | 88 | ADD $PssX, $PssX, $offset |
igorsk | 0:90ade34a3b71 | 89 | MEND |
igorsk | 0:90ade34a3b71 | 90 | |
igorsk | 0:90ade34a3b71 | 91 | ; YY = Cplx_conjugate_mul(Y,K) |
igorsk | 0:90ade34a3b71 | 92 | ; Y = YYr + i*YYi |
igorsk | 0:90ade34a3b71 | 93 | ; use the following trick |
igorsk | 0:90ade34a3b71 | 94 | ; K = (Kr-Ki) + i*Ki |
igorsk | 0:90ade34a3b71 | 95 | MACRO |
igorsk | 0:90ade34a3b71 | 96 | CXMUL_V7 $YYr, $YYi, $Yr, $Yi, $Kr, $Ki,$tmp,$tmp2 |
igorsk | 0:90ade34a3b71 | 97 | SUB $tmp2, $Yi, $Yr ; sYi-sYr |
igorsk | 0:90ade34a3b71 | 98 | MUL $tmp, $tmp2, $Ki ; (sYi-sYr)*sKi |
igorsk | 0:90ade34a3b71 | 99 | ADD $tmp2, $Kr, $Ki, LSL#1 ; (sKr+sKi) |
igorsk | 0:90ade34a3b71 | 100 | MLA $YYi, $Yi, $Kr, $tmp ; lYYi = sYi*sKr-sYr*sKi |
igorsk | 0:90ade34a3b71 | 101 | MLA $YYr, $Yr, $tmp2, $tmp ; lYYr = sYr*sKr+sYi*sKi |
igorsk | 0:90ade34a3b71 | 102 | MEND |
igorsk | 0:90ade34a3b71 | 103 | |
igorsk | 0:90ade34a3b71 | 104 | ; Four point complex Fast Fourier Transform |
igorsk | 0:90ade34a3b71 | 105 | MACRO |
igorsk | 0:90ade34a3b71 | 106 | CXADDA4 $s |
igorsk | 0:90ade34a3b71 | 107 | ; (C,D) = (C+D, C-D) |
igorsk | 0:90ade34a3b71 | 108 | ADD Cr, Cr, Dr |
igorsk | 0:90ade34a3b71 | 109 | ADD Ci, Ci, Di |
igorsk | 0:90ade34a3b71 | 110 | SUB Dr, Cr, Dr, LSL#1 |
igorsk | 0:90ade34a3b71 | 111 | SUB Di, Ci, Di, LSL#1 |
igorsk | 0:90ade34a3b71 | 112 | ; (A,B) = (A+(B>>s), A-(B>>s))/4 |
igorsk | 0:90ade34a3b71 | 113 | MOV Ar, Ar, ASR#2 |
igorsk | 0:90ade34a3b71 | 114 | MOV Ai, Ai, ASR#2 |
igorsk | 0:90ade34a3b71 | 115 | ADD Ar, Ar, Br, ASR#(2+$s) |
igorsk | 0:90ade34a3b71 | 116 | ADD Ai, Ai, Bi, ASR#(2+$s) |
igorsk | 0:90ade34a3b71 | 117 | SUB Br, Ar, Br, ASR#(1+$s) |
igorsk | 0:90ade34a3b71 | 118 | SUB Bi, Ai, Bi, ASR#(1+$s) |
igorsk | 0:90ade34a3b71 | 119 | ; (A,C) = (A+(C>>s)/4, A-(C>>s)/4) |
igorsk | 0:90ade34a3b71 | 120 | ADD Ar, Ar, Cr, ASR#(2+$s) |
igorsk | 0:90ade34a3b71 | 121 | ADD Ai, Ai, Ci, ASR#(2+$s) |
igorsk | 0:90ade34a3b71 | 122 | SUB Cr, Ar, Cr, ASR#(1+$s) |
igorsk | 0:90ade34a3b71 | 123 | SUB Ci, Ai, Ci, ASR#(1+$s) |
igorsk | 0:90ade34a3b71 | 124 | ; (B,D) = (B-i*(D>>s)/4, B+i*(D>>s)/4) |
igorsk | 0:90ade34a3b71 | 125 | ADD Br, Br, Di, ASR#(2+$s) |
igorsk | 0:90ade34a3b71 | 126 | SUB Bi, Bi, Dr, ASR#(2+$s) |
igorsk | 0:90ade34a3b71 | 127 | SUB Di, Br, Di, ASR#(1+$s) |
igorsk | 0:90ade34a3b71 | 128 | ADD Dr, Bi, Dr, ASR#(1+$s) |
igorsk | 0:90ade34a3b71 | 129 | MEND |
igorsk | 0:90ade34a3b71 | 130 | |
igorsk | 0:90ade34a3b71 | 131 | |
igorsk | 0:90ade34a3b71 | 132 | MACRO |
igorsk | 0:90ade34a3b71 | 133 | BUTFLY4ZERO_OPT $pIN,$offset, $pOUT |
igorsk | 0:90ade34a3b71 | 134 | LDRSH Ai, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 135 | LDRSH Ar, [$pIN],#NPT |
igorsk | 0:90ade34a3b71 | 136 | LDRSH Ci, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 137 | LDRSH Cr, [$pIN],#NPT |
igorsk | 0:90ade34a3b71 | 138 | LDRSH Bi, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 139 | LDRSH Br, [$pIN],#NPT |
igorsk | 0:90ade34a3b71 | 140 | LDRSH Di, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 141 | LDRSH Dr, [$pIN],#NPT |
igorsk | 0:90ade34a3b71 | 142 | ; (C,D) = (C+D, C-D) |
igorsk | 0:90ade34a3b71 | 143 | ADD Cr, Cr, Dr |
igorsk | 0:90ade34a3b71 | 144 | ADD Ci, Ci, Di |
igorsk | 0:90ade34a3b71 | 145 | SUB Dr, Cr, Dr, LSL#1 ; trick |
igorsk | 0:90ade34a3b71 | 146 | SUB Di, Ci, Di, LSL#1 ;trick |
igorsk | 0:90ade34a3b71 | 147 | ; (A,B) = (A+B)/4, (A-B)/4 |
igorsk | 0:90ade34a3b71 | 148 | MOV Ar, Ar, ASR#2 |
igorsk | 0:90ade34a3b71 | 149 | MOV Ai, Ai, ASR#2 |
igorsk | 0:90ade34a3b71 | 150 | ADD Ar, Ar, Br, ASR#2 |
igorsk | 0:90ade34a3b71 | 151 | ADD Ai, Ai, Bi, ASR#2 |
igorsk | 0:90ade34a3b71 | 152 | SUB Br, Ar, Br, ASR#1 |
igorsk | 0:90ade34a3b71 | 153 | SUB Bi, Ai, Bi, ASR#1 |
igorsk | 0:90ade34a3b71 | 154 | ; (A,C) = (A+C)/4, (A-C)/4 |
igorsk | 0:90ade34a3b71 | 155 | ADD Ar, Ar, Cr, ASR#2 |
igorsk | 0:90ade34a3b71 | 156 | ADD Ai, Ai, Ci, ASR#2 |
igorsk | 0:90ade34a3b71 | 157 | SUB Cr, Ar, Cr, ASR#1 |
igorsk | 0:90ade34a3b71 | 158 | SUB Ci, Ai, Ci, ASR#1 |
igorsk | 0:90ade34a3b71 | 159 | ; (B,D) = (B-i*D)/4, (B+i*D)/4 |
igorsk | 0:90ade34a3b71 | 160 | ADD Br, Br, Di, ASR#2 |
igorsk | 0:90ade34a3b71 | 161 | SUB Bi, Bi, Dr, ASR#2 |
igorsk | 0:90ade34a3b71 | 162 | SUB Di, Br, Di, ASR#1 |
igorsk | 0:90ade34a3b71 | 163 | ADD Dr, Bi, Dr, ASR#1 |
igorsk | 0:90ade34a3b71 | 164 | ; |
igorsk | 0:90ade34a3b71 | 165 | STRH Ai, [$pOUT, #2] |
igorsk | 0:90ade34a3b71 | 166 | STRH Ar, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 167 | STRH Bi, [$pOUT, #2] |
igorsk | 0:90ade34a3b71 | 168 | STRH Br, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 169 | STRH Ci, [$pOUT, #2] |
igorsk | 0:90ade34a3b71 | 170 | STRH Cr, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 171 | STRH Dr, [$pOUT, #2] ; inversion here |
igorsk | 0:90ade34a3b71 | 172 | STRH Di, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 173 | MEND |
igorsk | 0:90ade34a3b71 | 174 | |
igorsk | 0:90ade34a3b71 | 175 | MACRO |
igorsk | 0:90ade34a3b71 | 176 | BUTFLY4_V7 $pssDin,$offset,$pssDout,$qformat,$pssK |
igorsk | 0:90ade34a3b71 | 177 | LDR2Qm Ar,Ai,$pssDin, $offset;-$offset |
igorsk | 0:90ade34a3b71 | 178 | LDR2Q Dr,Di,$pssK, #4 |
igorsk | 0:90ade34a3b71 | 179 | ; format CXMUL_V7 YYr, YYi, Yr, Yi, Kr, Ki,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 180 | CXMUL_V7 Dr,Di,Ar,Ai,Dr,Di,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 181 | LDR2Qm Ar,Ai,$pssDin,$offset;-$offset |
igorsk | 0:90ade34a3b71 | 182 | LDR2Q Cr,Ci,$pssK,#4 |
igorsk | 0:90ade34a3b71 | 183 | CXMUL_V7 Cr,Ci,Ar,Ai,Cr,Ci,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 184 | LDR2Qm Ar,Ai, $pssDin, $offset;-$offset |
igorsk | 0:90ade34a3b71 | 185 | LDR2Q Br,Bi, $pssK, #4 |
igorsk | 0:90ade34a3b71 | 186 | CXMUL_V7 Br,Bi,Ar,Ai,Br,Bi,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 187 | LDR2Q Ar,Ai, $pssDin, #0 |
igorsk | 0:90ade34a3b71 | 188 | CXADDA4 $qformat |
igorsk | 0:90ade34a3b71 | 189 | STRH Ai, [$pssDout, #2] |
igorsk | 0:90ade34a3b71 | 190 | STRH Ar, [$pssDout] |
igorsk | 0:90ade34a3b71 | 191 | ADD $pssDout, $pssDout, $offset |
igorsk | 0:90ade34a3b71 | 192 | STRH Bi, [$pssDout, #2] |
igorsk | 0:90ade34a3b71 | 193 | STRH Br, [$pssDout] |
igorsk | 0:90ade34a3b71 | 194 | ADD $pssDout, $pssDout, $offset |
igorsk | 0:90ade34a3b71 | 195 | STRH Ci, [$pssDout, #2] |
igorsk | 0:90ade34a3b71 | 196 | STRH Cr, [$pssDout] |
igorsk | 0:90ade34a3b71 | 197 | ADD $pssDout, $pssDout, $offset |
igorsk | 0:90ade34a3b71 | 198 | STRH Dr, [$pssDout, #2] ; inversion here |
igorsk | 0:90ade34a3b71 | 199 | STRH Di, [$pssDout], #4 |
igorsk | 0:90ade34a3b71 | 200 | MEND |
igorsk | 0:90ade34a3b71 | 201 | |
igorsk | 0:90ade34a3b71 | 202 | ;------------------- CODE -------------------------------- |
igorsk | 0:90ade34a3b71 | 203 | ;=============================================================================== |
igorsk | 0:90ade34a3b71 | 204 | ;******************************************************************************* |
igorsk | 0:90ade34a3b71 | 205 | ;* Function Name : cr4_fft_64_stm32 |
igorsk | 0:90ade34a3b71 | 206 | ;* Description : complex radix-4 64 points FFT |
igorsk | 0:90ade34a3b71 | 207 | ;* Input : - R0 = pssOUT: Output array . |
igorsk | 0:90ade34a3b71 | 208 | ;* - R1 = pssIN: Input array |
igorsk | 0:90ade34a3b71 | 209 | ;* - R2 = Nbin: =64 number of points, this optimized FFT function |
igorsk | 0:90ade34a3b71 | 210 | ;* can only convert 64 points. |
igorsk | 0:90ade34a3b71 | 211 | ;* Output : None |
igorsk | 0:90ade34a3b71 | 212 | ;* Return : None |
igorsk | 0:90ade34a3b71 | 213 | ;******************************************************************************* |
igorsk | 0:90ade34a3b71 | 214 | cr4_fft_64_stm32 |
igorsk | 0:90ade34a3b71 | 215 | |
igorsk | 0:90ade34a3b71 | 216 | STMFD SP!, {R4-R11, LR} |
igorsk | 0:90ade34a3b71 | 217 | |
igorsk | 0:90ade34a3b71 | 218 | MOV cntrbitrev, #0 |
igorsk | 0:90ade34a3b71 | 219 | MOV index,#0 |
igorsk | 0:90ade34a3b71 | 220 | preloop_v7 |
igorsk | 0:90ade34a3b71 | 221 | ADD pssIN2, pssIN, cntrbitrev, LSR#26 ;64-pts |
igorsk | 0:90ade34a3b71 | 222 | BUTFLY4ZERO_OPT pssIN2,Nbin,pssOUT |
igorsk | 0:90ade34a3b71 | 223 | INC index |
igorsk | 0:90ade34a3b71 | 224 | IF :DEF:TARGET_LPC1768 |
igorsk | 0:90ade34a3b71 | 225 | RBIT cntrbitrev,index |
igorsk | 0:90ade34a3b71 | 226 | ELSE |
igorsk | 0:90ade34a3b71 | 227 | ; since we need only 16 values, use a lookup table |
igorsk | 0:90ade34a3b71 | 228 | ADR cntrbitrev, BITREV16 |
igorsk | 0:90ade34a3b71 | 229 | LDR cntrbitrev, [cntrbitrev, index, LSL #2] |
igorsk | 0:90ade34a3b71 | 230 | ENDIF |
igorsk | 0:90ade34a3b71 | 231 | CMP index,#16 ;64-pts |
igorsk | 0:90ade34a3b71 | 232 | BNE preloop_v7 |
igorsk | 0:90ade34a3b71 | 233 | |
igorsk | 0:90ade34a3b71 | 234 | |
igorsk | 0:90ade34a3b71 | 235 | SUB pssX, pssOUT, Nbin, LSL#2 |
igorsk | 0:90ade34a3b71 | 236 | MOV index, #16 |
igorsk | 0:90ade34a3b71 | 237 | MOVS butternbr, Nbin, LSR#4 ;dual use of register |
igorsk | 0:90ade34a3b71 | 238 | |
igorsk | 0:90ade34a3b71 | 239 | ;------------------------------------------------------------------------------ |
igorsk | 0:90ade34a3b71 | 240 | ; The FFT coefficients table can be stored into Flash or RAM. |
igorsk | 0:90ade34a3b71 | 241 | ; The following two lines of code allow selecting the method for coefficients |
igorsk | 0:90ade34a3b71 | 242 | ; storage. |
igorsk | 0:90ade34a3b71 | 243 | ; In the case of choosing coefficients in RAM, you have to: |
igorsk | 0:90ade34a3b71 | 244 | ; 1. Include the file table_fft.h, which is a part of the DSP library, |
igorsk | 0:90ade34a3b71 | 245 | ; in your main file. |
igorsk | 0:90ade34a3b71 | 246 | ; 2. Decomment the line LDR.W pssK, =TableFFT and comment the line |
igorsk | 0:90ade34a3b71 | 247 | ; ADRL pssK, TableFFT_V7 |
igorsk | 0:90ade34a3b71 | 248 | ; 3. Comment all the TableFFT_V7 data. |
igorsk | 0:90ade34a3b71 | 249 | ;------------------------------------------------------------------------------ |
igorsk | 0:90ade34a3b71 | 250 | ADR pssK, TableFFT_V7 ; Coeff in Flash |
igorsk | 0:90ade34a3b71 | 251 | ;LDR.W pssK, =TableFFT ; Coeff in RAM |
igorsk | 0:90ade34a3b71 | 252 | |
igorsk | 0:90ade34a3b71 | 253 | ;................................ |
igorsk | 0:90ade34a3b71 | 254 | passloop_v7 |
igorsk | 0:90ade34a3b71 | 255 | STMFD SP!, {pssX,butternbr} |
igorsk | 0:90ade34a3b71 | 256 | ADD tmp, index, index, LSL#1 |
igorsk | 0:90ade34a3b71 | 257 | ADD pssX, pssX, tmp |
igorsk | 0:90ade34a3b71 | 258 | SUB butternbr, butternbr, #1<<16 |
igorsk | 0:90ade34a3b71 | 259 | ;................ |
igorsk | 0:90ade34a3b71 | 260 | grouploop_v7 |
igorsk | 0:90ade34a3b71 | 261 | ADD butternbr,butternbr,index,LSL#(16-2) |
igorsk | 0:90ade34a3b71 | 262 | ;....... |
igorsk | 0:90ade34a3b71 | 263 | butterloop_v7 |
igorsk | 0:90ade34a3b71 | 264 | BUTFLY4_V7 pssX,index,pssX,14,pssK |
igorsk | 0:90ade34a3b71 | 265 | SUBS butternbr,butternbr, #1<<16 |
igorsk | 0:90ade34a3b71 | 266 | BGE butterloop_v7 |
igorsk | 0:90ade34a3b71 | 267 | ;....... |
igorsk | 0:90ade34a3b71 | 268 | ADD tmp, index, index, LSL#1 |
igorsk | 0:90ade34a3b71 | 269 | ADD pssX, pssX, tmp |
igorsk | 0:90ade34a3b71 | 270 | DEC butternbr |
igorsk | 0:90ade34a3b71 | 271 | MOVS tmp2, butternbr, LSL#16 |
igorsk | 0:90ade34a3b71 | 272 | IT NE |
igorsk | 0:90ade34a3b71 | 273 | SUBNE pssK, pssK, tmp |
igorsk | 0:90ade34a3b71 | 274 | BNE grouploop_v7 |
igorsk | 0:90ade34a3b71 | 275 | ;................ |
igorsk | 0:90ade34a3b71 | 276 | LDMFD sp!, {pssX, butternbr} |
igorsk | 0:90ade34a3b71 | 277 | QUAD index |
igorsk | 0:90ade34a3b71 | 278 | MOVS butternbr, butternbr, LSR#2 ; loop nbr /= radix |
igorsk | 0:90ade34a3b71 | 279 | BNE passloop_v7 |
igorsk | 0:90ade34a3b71 | 280 | ;................................ |
igorsk | 0:90ade34a3b71 | 281 | LDMFD SP!, {R4-R11, PC} |
igorsk | 0:90ade34a3b71 | 282 | |
igorsk | 0:90ade34a3b71 | 283 | ;============================================================================= |
igorsk | 0:90ade34a3b71 | 284 | |
igorsk | 0:90ade34a3b71 | 285 | TableFFT_V7 |
igorsk | 0:90ade34a3b71 | 286 | ;N=16 |
igorsk | 0:90ade34a3b71 | 287 | DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000 |
igorsk | 0:90ade34a3b71 | 288 | DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41 |
igorsk | 0:90ade34a3b71 | 289 | DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000 |
igorsk | 0:90ade34a3b71 | 290 | DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41 |
igorsk | 0:90ade34a3b71 | 291 | ; N=64 |
igorsk | 0:90ade34a3b71 | 292 | DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000 |
igorsk | 0:90ade34a3b71 | 293 | DCW 0x2aaa,0x1294, 0x396b,0x0646, 0x3249,0x0c7c |
igorsk | 0:90ade34a3b71 | 294 | DCW 0x11a8,0x238e, 0x3249,0x0c7c, 0x22a3,0x187e |
igorsk | 0:90ade34a3b71 | 295 | DCW 0xf721,0x3179, 0x2aaa,0x1294, 0x11a8,0x238e |
igorsk | 0:90ade34a3b71 | 296 | DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41 |
igorsk | 0:90ade34a3b71 | 297 | DCW 0xc695,0x3fb1, 0x1a46,0x1e2b, 0xee58,0x3537 |
igorsk | 0:90ade34a3b71 | 298 | DCW 0xb4be,0x3ec5, 0x11a8,0x238e, 0xdd5d,0x3b21 |
igorsk | 0:90ade34a3b71 | 299 | DCW 0xa963,0x3871, 0x08df,0x289a, 0xcdb7,0x3ec5 |
igorsk | 0:90ade34a3b71 | 300 | DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000 |
igorsk | 0:90ade34a3b71 | 301 | DCW 0xa963,0x1e2b, 0xf721,0x3179, 0xb4be,0x3ec5 |
igorsk | 0:90ade34a3b71 | 302 | DCW 0xb4be,0x0c7c, 0xee58,0x3537, 0xac61,0x3b21 |
igorsk | 0:90ade34a3b71 | 303 | DCW 0xc695,0xf9ba, 0xe5ba,0x3871, 0xa73b,0x3537 |
igorsk | 0:90ade34a3b71 | 304 | DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41 |
igorsk | 0:90ade34a3b71 | 305 | DCW 0xf721,0xd766, 0xd556,0x3d3f, 0xa73b,0x238e |
igorsk | 0:90ade34a3b71 | 306 | DCW 0x11a8,0xcac9, 0xcdb7,0x3ec5, 0xac61,0x187e |
igorsk | 0:90ade34a3b71 | 307 | DCW 0x2aaa,0xc2c1, 0xc695,0x3fb1, 0xb4be,0x0c7c |
igorsk | 0:90ade34a3b71 | 308 | |
igorsk | 0:90ade34a3b71 | 309 | ; bit reversal table values from 0 to 16 |
igorsk | 0:90ade34a3b71 | 310 | BITREV16 |
igorsk | 0:90ade34a3b71 | 311 | DCD 2_0000 << 28 |
igorsk | 0:90ade34a3b71 | 312 | DCD 2_1000 << 28 |
igorsk | 0:90ade34a3b71 | 313 | DCD 2_0100 << 28 |
igorsk | 0:90ade34a3b71 | 314 | DCD 2_1100 << 28 |
igorsk | 0:90ade34a3b71 | 315 | DCD 2_0010 << 28 |
igorsk | 0:90ade34a3b71 | 316 | DCD 2_1010 << 28 |
igorsk | 0:90ade34a3b71 | 317 | DCD 2_0110 << 28 |
igorsk | 0:90ade34a3b71 | 318 | DCD 2_1110 << 28 |
igorsk | 0:90ade34a3b71 | 319 | DCD 2_0001 << 28 |
igorsk | 0:90ade34a3b71 | 320 | DCD 2_1001 << 28 |
igorsk | 0:90ade34a3b71 | 321 | DCD 2_0101 << 28 |
igorsk | 0:90ade34a3b71 | 322 | DCD 2_1101 << 28 |
igorsk | 0:90ade34a3b71 | 323 | DCD 2_0011 << 28 |
igorsk | 0:90ade34a3b71 | 324 | DCD 2_1011 << 28 |
igorsk | 0:90ade34a3b71 | 325 | DCD 2_0111 << 28 |
igorsk | 0:90ade34a3b71 | 326 | DCD 2_1111 << 28 |
igorsk | 0:90ade34a3b71 | 327 | DCD 2_0000 << 28 |
igorsk | 0:90ade34a3b71 | 328 | END |
igorsk | 0:90ade34a3b71 | 329 | ;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE**** |