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_256_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_256_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 256-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=2 |
igorsk | 0:90ade34a3b71 | 21 | |
igorsk | 0:90ade34a3b71 | 22 | EXPORT cr4_fft_256_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 256 |
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] |
igorsk | 0:90ade34a3b71 | 136 | ADD $pIN, #NPT |
igorsk | 0:90ade34a3b71 | 137 | LDRSH Ci, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 138 | LDRSH Cr, [$pIN] |
igorsk | 0:90ade34a3b71 | 139 | ADD $pIN, #NPT |
igorsk | 0:90ade34a3b71 | 140 | LDRSH Bi, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 141 | LDRSH Br, [$pIN] |
igorsk | 0:90ade34a3b71 | 142 | ADD $pIN, #NPT |
igorsk | 0:90ade34a3b71 | 143 | LDRSH Di, [$pIN, #2] |
igorsk | 0:90ade34a3b71 | 144 | LDRSH Dr, [$pIN] |
igorsk | 0:90ade34a3b71 | 145 | ADD $pIN, #NPT |
igorsk | 0:90ade34a3b71 | 146 | |
igorsk | 0:90ade34a3b71 | 147 | ; (C,D) = (C+D, C-D) |
igorsk | 0:90ade34a3b71 | 148 | ADD Cr, Cr, Dr |
igorsk | 0:90ade34a3b71 | 149 | ADD Ci, Ci, Di |
igorsk | 0:90ade34a3b71 | 150 | SUB Dr, Cr, Dr, LSL#1 ; trick |
igorsk | 0:90ade34a3b71 | 151 | SUB Di, Ci, Di, LSL#1 ;trick |
igorsk | 0:90ade34a3b71 | 152 | ; (A,B) = (A+B)/4, (A-B)/4 |
igorsk | 0:90ade34a3b71 | 153 | MOV Ar, Ar, ASR#2 |
igorsk | 0:90ade34a3b71 | 154 | MOV Ai, Ai, ASR#2 |
igorsk | 0:90ade34a3b71 | 155 | ADD Ar, Ar, Br, ASR#2 |
igorsk | 0:90ade34a3b71 | 156 | ADD Ai, Ai, Bi, ASR#2 |
igorsk | 0:90ade34a3b71 | 157 | SUB Br, Ar, Br, ASR#1 |
igorsk | 0:90ade34a3b71 | 158 | SUB Bi, Ai, Bi, ASR#1 |
igorsk | 0:90ade34a3b71 | 159 | ; (A,C) = (A+C)/4, (A-C)/4 |
igorsk | 0:90ade34a3b71 | 160 | ADD Ar, Ar, Cr, ASR#2 |
igorsk | 0:90ade34a3b71 | 161 | ADD Ai, Ai, Ci, ASR#2 |
igorsk | 0:90ade34a3b71 | 162 | SUB Cr, Ar, Cr, ASR#1 |
igorsk | 0:90ade34a3b71 | 163 | SUB Ci, Ai, Ci, ASR#1 |
igorsk | 0:90ade34a3b71 | 164 | ; (B,D) = (B-i*D)/4, (B+i*D)/4 |
igorsk | 0:90ade34a3b71 | 165 | ADD Br, Br, Di, ASR#2 |
igorsk | 0:90ade34a3b71 | 166 | SUB Bi, Bi, Dr, ASR#2 |
igorsk | 0:90ade34a3b71 | 167 | SUB Di, Br, Di, ASR#1 |
igorsk | 0:90ade34a3b71 | 168 | ADD Dr, Bi, Dr, ASR#1 |
igorsk | 0:90ade34a3b71 | 169 | ; |
igorsk | 0:90ade34a3b71 | 170 | STRH Ai, [$pOUT, #2] |
igorsk | 0:90ade34a3b71 | 171 | STRH Ar, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 172 | STRH Bi, [$pOUT, #2] |
igorsk | 0:90ade34a3b71 | 173 | STRH Br, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 174 | STRH Ci, [$pOUT, #2] |
igorsk | 0:90ade34a3b71 | 175 | STRH Cr, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 176 | STRH Dr, [$pOUT, #2] ; inversion here |
igorsk | 0:90ade34a3b71 | 177 | STRH Di, [$pOUT], #4 |
igorsk | 0:90ade34a3b71 | 178 | MEND |
igorsk | 0:90ade34a3b71 | 179 | |
igorsk | 0:90ade34a3b71 | 180 | MACRO |
igorsk | 0:90ade34a3b71 | 181 | BUTFLY4_V7 $pssDin,$offset,$pssDout,$qformat,$pssK |
igorsk | 0:90ade34a3b71 | 182 | LDR2Qm Ar,Ai,$pssDin, $offset;-$offset |
igorsk | 0:90ade34a3b71 | 183 | LDR2Q Dr,Di,$pssK, #4 |
igorsk | 0:90ade34a3b71 | 184 | ; format CXMUL_V7 YYr, YYi, Yr, Yi, Kr, Ki,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 185 | CXMUL_V7 Dr,Di,Ar,Ai,Dr,Di,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 186 | LDR2Qm Ar,Ai,$pssDin,$offset;-$offset |
igorsk | 0:90ade34a3b71 | 187 | LDR2Q Cr,Ci,$pssK,#4 |
igorsk | 0:90ade34a3b71 | 188 | CXMUL_V7 Cr,Ci,Ar,Ai,Cr,Ci,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 189 | LDR2Qm Ar,Ai, $pssDin, $offset;-$offset |
igorsk | 0:90ade34a3b71 | 190 | LDR2Q Br,Bi, $pssK, #4 |
igorsk | 0:90ade34a3b71 | 191 | CXMUL_V7 Br,Bi,Ar,Ai,Br,Bi,tmp,tmp2 |
igorsk | 0:90ade34a3b71 | 192 | LDR2Q Ar,Ai, $pssDin, #0 |
igorsk | 0:90ade34a3b71 | 193 | CXADDA4 $qformat |
igorsk | 0:90ade34a3b71 | 194 | STRH Ai, [$pssDout, #2] |
igorsk | 0:90ade34a3b71 | 195 | STRH Ar, [$pssDout] |
igorsk | 0:90ade34a3b71 | 196 | ADD $pssDout, $pssDout, $offset |
igorsk | 0:90ade34a3b71 | 197 | STRH Bi, [$pssDout, #2] |
igorsk | 0:90ade34a3b71 | 198 | STRH Br, [$pssDout] |
igorsk | 0:90ade34a3b71 | 199 | ADD $pssDout, $pssDout, $offset |
igorsk | 0:90ade34a3b71 | 200 | STRH Ci, [$pssDout, #2] |
igorsk | 0:90ade34a3b71 | 201 | STRH Cr, [$pssDout] |
igorsk | 0:90ade34a3b71 | 202 | ADD $pssDout, $pssDout, $offset |
igorsk | 0:90ade34a3b71 | 203 | STRH Dr, [$pssDout, #2] ; inversion here |
igorsk | 0:90ade34a3b71 | 204 | STRH Di, [$pssDout], #4 |
igorsk | 0:90ade34a3b71 | 205 | MEND |
igorsk | 0:90ade34a3b71 | 206 | |
igorsk | 0:90ade34a3b71 | 207 | ;------------------- CODE -------------------------------- |
igorsk | 0:90ade34a3b71 | 208 | ;=============================================================================== |
igorsk | 0:90ade34a3b71 | 209 | ;******************************************************************************* |
igorsk | 0:90ade34a3b71 | 210 | ;* Function Name : cr4_fft_256_stm32 |
igorsk | 0:90ade34a3b71 | 211 | ;* Description : complex radix-4 256 points FFT |
igorsk | 0:90ade34a3b71 | 212 | ;* Input : - R0 = pssOUT: Output array . |
igorsk | 0:90ade34a3b71 | 213 | ;* - R1 = pssIN: Input array |
igorsk | 0:90ade34a3b71 | 214 | ;* - R2 = Nbin: =256 number of points, this optimized FFT function |
igorsk | 0:90ade34a3b71 | 215 | ;* can only convert 256 points. |
igorsk | 0:90ade34a3b71 | 216 | ;* Output : None |
igorsk | 0:90ade34a3b71 | 217 | ;* Return : None |
igorsk | 0:90ade34a3b71 | 218 | ;******************************************************************************* |
igorsk | 0:90ade34a3b71 | 219 | cr4_fft_256_stm32 |
igorsk | 0:90ade34a3b71 | 220 | |
igorsk | 0:90ade34a3b71 | 221 | STMFD SP!, {R4-R11, LR} |
igorsk | 0:90ade34a3b71 | 222 | |
igorsk | 0:90ade34a3b71 | 223 | MOV cntrbitrev, #0 |
igorsk | 0:90ade34a3b71 | 224 | MOV index,#0 |
igorsk | 0:90ade34a3b71 | 225 | |
igorsk | 0:90ade34a3b71 | 226 | preloop_v7 |
igorsk | 0:90ade34a3b71 | 227 | ADD pssIN2, pssIN, cntrbitrev, LSR#24 ;256-pts |
igorsk | 0:90ade34a3b71 | 228 | BUTFLY4ZERO_OPT pssIN2,Nbin,pssOUT |
igorsk | 0:90ade34a3b71 | 229 | INC index |
igorsk | 0:90ade34a3b71 | 230 | IF :DEF:TARGET_LPC1768 |
igorsk | 0:90ade34a3b71 | 231 | RBIT cntrbitrev,index |
igorsk | 0:90ade34a3b71 | 232 | ELSE |
igorsk | 0:90ade34a3b71 | 233 | ; add 1 to cntrbitrev "backwards" |
igorsk | 0:90ade34a3b71 | 234 | ; start looking from top, toggling all bits until we hit a 0, |
igorsk | 0:90ade34a3b71 | 235 | ; which we toggle to 1 and then stop |
igorsk | 0:90ade34a3b71 | 236 | ; tmp2 = 0x80000000; |
igorsk | 0:90ade34a3b71 | 237 | ; bit1 = true; |
igorsk | 0:90ade34a3b71 | 238 | ; while ( bit1 ) { |
igorsk | 0:90ade34a3b71 | 239 | ; bit1 = (cntrbitrev & tmp2) != 0; |
igorsk | 0:90ade34a3b71 | 240 | ; cntrbitrev ^= tmp2; |
igorsk | 0:90ade34a3b71 | 241 | ; if ( bit1 ) tmp2 <= 1; |
igorsk | 0:90ade34a3b71 | 242 | ; } |
igorsk | 0:90ade34a3b71 | 243 | MOV tmp2, #(1<<31) |
igorsk | 0:90ade34a3b71 | 244 | Lrev |
igorsk | 0:90ade34a3b71 | 245 | TST cntrbitrev, tmp2 ; is the current bit set? |
igorsk | 0:90ade34a3b71 | 246 | EOR cntrbitrev, tmp2 ; toggle it regardless of result |
igorsk | 0:90ade34a3b71 | 247 | MOVNE tmp2, tmp2, LSR#1 ; if set, shift mask |
igorsk | 0:90ade34a3b71 | 248 | BNE Lrev ; and loop again |
igorsk | 0:90ade34a3b71 | 249 | ENDIF |
igorsk | 0:90ade34a3b71 | 250 | |
igorsk | 0:90ade34a3b71 | 251 | CMP index,#64 ;256-pts |
igorsk | 0:90ade34a3b71 | 252 | BNE preloop_v7 |
igorsk | 0:90ade34a3b71 | 253 | |
igorsk | 0:90ade34a3b71 | 254 | |
igorsk | 0:90ade34a3b71 | 255 | SUB pssX, pssOUT, Nbin, LSL#2 |
igorsk | 0:90ade34a3b71 | 256 | MOV index, #16 |
igorsk | 0:90ade34a3b71 | 257 | MOVS butternbr, Nbin, LSR#4 ;dual use of register |
igorsk | 0:90ade34a3b71 | 258 | |
igorsk | 0:90ade34a3b71 | 259 | ;------------------------------------------------------------------------------ |
igorsk | 0:90ade34a3b71 | 260 | ; The FFT coefficients table can be stored into Flash or RAM. |
igorsk | 0:90ade34a3b71 | 261 | ; The following two lines of code allow selecting the method for coefficients |
igorsk | 0:90ade34a3b71 | 262 | ; storage. |
igorsk | 0:90ade34a3b71 | 263 | ; In the case of choosing coefficients in RAM, you have to: |
igorsk | 0:90ade34a3b71 | 264 | ; 1. Include the file table_fft.h, which is a part of the DSP library, |
igorsk | 0:90ade34a3b71 | 265 | ; in your main file. |
igorsk | 0:90ade34a3b71 | 266 | ; 2. Decomment the line LDR.W pssK, =TableFFT and comment the line |
igorsk | 0:90ade34a3b71 | 267 | ; ADRL pssK, TableFFT_V7 |
igorsk | 0:90ade34a3b71 | 268 | ; 3. Comment all the TableFFT_V7 data. |
igorsk | 0:90ade34a3b71 | 269 | ;------------------------------------------------------------------------------ |
igorsk | 0:90ade34a3b71 | 270 | ADR pssK, TableFFT_V7 ; Coeff in Flash |
igorsk | 0:90ade34a3b71 | 271 | ;LDR.W pssK, =TableFFT ; Coeff in RAM |
igorsk | 0:90ade34a3b71 | 272 | |
igorsk | 0:90ade34a3b71 | 273 | ;................................ |
igorsk | 0:90ade34a3b71 | 274 | passloop_v7 |
igorsk | 0:90ade34a3b71 | 275 | STMFD SP!, {pssX,butternbr} |
igorsk | 0:90ade34a3b71 | 276 | ADD tmp, index, index, LSL#1 |
igorsk | 0:90ade34a3b71 | 277 | ADD pssX, pssX, tmp |
igorsk | 0:90ade34a3b71 | 278 | SUB butternbr, butternbr, #1<<16 |
igorsk | 0:90ade34a3b71 | 279 | ;................ |
igorsk | 0:90ade34a3b71 | 280 | grouploop_v7 |
igorsk | 0:90ade34a3b71 | 281 | ADD butternbr,butternbr,index,LSL#(16-2) |
igorsk | 0:90ade34a3b71 | 282 | ;....... |
igorsk | 0:90ade34a3b71 | 283 | butterloop_v7 |
igorsk | 0:90ade34a3b71 | 284 | BUTFLY4_V7 pssX,index,pssX,14,pssK |
igorsk | 0:90ade34a3b71 | 285 | SUBS butternbr,butternbr, #1<<16 |
igorsk | 0:90ade34a3b71 | 286 | BGE butterloop_v7 |
igorsk | 0:90ade34a3b71 | 287 | ;....... |
igorsk | 0:90ade34a3b71 | 288 | ADD tmp, index, index, LSL#1 |
igorsk | 0:90ade34a3b71 | 289 | ADD pssX, pssX, tmp |
igorsk | 0:90ade34a3b71 | 290 | DEC butternbr |
igorsk | 0:90ade34a3b71 | 291 | MOVS tmp2, butternbr, LSL#16 |
igorsk | 0:90ade34a3b71 | 292 | IT NE |
igorsk | 0:90ade34a3b71 | 293 | SUBNE pssK, pssK, tmp |
igorsk | 0:90ade34a3b71 | 294 | BNE grouploop_v7 |
igorsk | 0:90ade34a3b71 | 295 | ;................ |
igorsk | 0:90ade34a3b71 | 296 | LDMFD sp!, {pssX, butternbr} |
igorsk | 0:90ade34a3b71 | 297 | QUAD index |
igorsk | 0:90ade34a3b71 | 298 | MOVS butternbr, butternbr, LSR#2 ; loop nbr /= radix |
igorsk | 0:90ade34a3b71 | 299 | BNE passloop_v7 |
igorsk | 0:90ade34a3b71 | 300 | ;................................ |
igorsk | 0:90ade34a3b71 | 301 | LDMFD SP!, {R4-R11, PC} |
igorsk | 0:90ade34a3b71 | 302 | |
igorsk | 0:90ade34a3b71 | 303 | ;============================================================================= |
igorsk | 0:90ade34a3b71 | 304 | |
igorsk | 0:90ade34a3b71 | 305 | TableFFT_V7 |
igorsk | 0:90ade34a3b71 | 306 | ;N=16 |
igorsk | 0:90ade34a3b71 | 307 | DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000 |
igorsk | 0:90ade34a3b71 | 308 | DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41 |
igorsk | 0:90ade34a3b71 | 309 | DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000 |
igorsk | 0:90ade34a3b71 | 310 | DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41 |
igorsk | 0:90ade34a3b71 | 311 | ; N=64 |
igorsk | 0:90ade34a3b71 | 312 | DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000 |
igorsk | 0:90ade34a3b71 | 313 | DCW 0x2aaa,0x1294, 0x396b,0x0646, 0x3249,0x0c7c |
igorsk | 0:90ade34a3b71 | 314 | DCW 0x11a8,0x238e, 0x3249,0x0c7c, 0x22a3,0x187e |
igorsk | 0:90ade34a3b71 | 315 | DCW 0xf721,0x3179, 0x2aaa,0x1294, 0x11a8,0x238e |
igorsk | 0:90ade34a3b71 | 316 | DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41 |
igorsk | 0:90ade34a3b71 | 317 | DCW 0xc695,0x3fb1, 0x1a46,0x1e2b, 0xee58,0x3537 |
igorsk | 0:90ade34a3b71 | 318 | DCW 0xb4be,0x3ec5, 0x11a8,0x238e, 0xdd5d,0x3b21 |
igorsk | 0:90ade34a3b71 | 319 | DCW 0xa963,0x3871, 0x08df,0x289a, 0xcdb7,0x3ec5 |
igorsk | 0:90ade34a3b71 | 320 | DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000 |
igorsk | 0:90ade34a3b71 | 321 | DCW 0xa963,0x1e2b, 0xf721,0x3179, 0xb4be,0x3ec5 |
igorsk | 0:90ade34a3b71 | 322 | DCW 0xb4be,0x0c7c, 0xee58,0x3537, 0xac61,0x3b21 |
igorsk | 0:90ade34a3b71 | 323 | DCW 0xc695,0xf9ba, 0xe5ba,0x3871, 0xa73b,0x3537 |
igorsk | 0:90ade34a3b71 | 324 | DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41 |
igorsk | 0:90ade34a3b71 | 325 | DCW 0xf721,0xd766, 0xd556,0x3d3f, 0xa73b,0x238e |
igorsk | 0:90ade34a3b71 | 326 | DCW 0x11a8,0xcac9, 0xcdb7,0x3ec5, 0xac61,0x187e |
igorsk | 0:90ade34a3b71 | 327 | DCW 0x2aaa,0xc2c1, 0xc695,0x3fb1, 0xb4be,0x0c7c |
igorsk | 0:90ade34a3b71 | 328 | ; N=256 |
igorsk | 0:90ade34a3b71 | 329 | DCW 0x4000,0x0000, 0x4000,0x0000, 0x4000,0x0000 |
igorsk | 0:90ade34a3b71 | 330 | DCW 0x3b1e,0x04b5, 0x3e69,0x0192, 0x3cc8,0x0324 |
igorsk | 0:90ade34a3b71 | 331 | DCW 0x35eb,0x0964, 0x3cc8,0x0324, 0x396b,0x0646 |
igorsk | 0:90ade34a3b71 | 332 | DCW 0x306c,0x0e06, 0x3b1e,0x04b5, 0x35eb,0x0964 |
igorsk | 0:90ade34a3b71 | 333 | DCW 0x2aaa,0x1294, 0x396b,0x0646, 0x3249,0x0c7c |
igorsk | 0:90ade34a3b71 | 334 | DCW 0x24ae,0x1709, 0x37af,0x07d6, 0x2e88,0x0f8d |
igorsk | 0:90ade34a3b71 | 335 | DCW 0x1e7e,0x1b5d, 0x35eb,0x0964, 0x2aaa,0x1294 |
igorsk | 0:90ade34a3b71 | 336 | DCW 0x1824,0x1f8c, 0x341e,0x0af1, 0x26b3,0x1590 |
igorsk | 0:90ade34a3b71 | 337 | DCW 0x11a8,0x238e, 0x3249,0x0c7c, 0x22a3,0x187e |
igorsk | 0:90ade34a3b71 | 338 | DCW 0x0b14,0x2760, 0x306c,0x0e06, 0x1e7e,0x1b5d |
igorsk | 0:90ade34a3b71 | 339 | DCW 0x0471,0x2afb, 0x2e88,0x0f8d, 0x1a46,0x1e2b |
igorsk | 0:90ade34a3b71 | 340 | DCW 0xfdc7,0x2e5a, 0x2c9d,0x1112, 0x15fe,0x20e7 |
igorsk | 0:90ade34a3b71 | 341 | DCW 0xf721,0x3179, 0x2aaa,0x1294, 0x11a8,0x238e |
igorsk | 0:90ade34a3b71 | 342 | DCW 0xf087,0x3453, 0x28b2,0x1413, 0x0d48,0x2620 |
igorsk | 0:90ade34a3b71 | 343 | DCW 0xea02,0x36e5, 0x26b3,0x1590, 0x08df,0x289a |
igorsk | 0:90ade34a3b71 | 344 | DCW 0xe39c,0x392b, 0x24ae,0x1709, 0x0471,0x2afb |
igorsk | 0:90ade34a3b71 | 345 | DCW 0xdd5d,0x3b21, 0x22a3,0x187e, 0x0000,0x2d41 |
igorsk | 0:90ade34a3b71 | 346 | DCW 0xd74e,0x3cc5, 0x2093,0x19ef, 0xfb8f,0x2f6c |
igorsk | 0:90ade34a3b71 | 347 | DCW 0xd178,0x3e15, 0x1e7e,0x1b5d, 0xf721,0x3179 |
igorsk | 0:90ade34a3b71 | 348 | DCW 0xcbe2,0x3f0f, 0x1c64,0x1cc6, 0xf2b8,0x3368 |
igorsk | 0:90ade34a3b71 | 349 | DCW 0xc695,0x3fb1, 0x1a46,0x1e2b, 0xee58,0x3537 |
igorsk | 0:90ade34a3b71 | 350 | DCW 0xc197,0x3ffb, 0x1824,0x1f8c, 0xea02,0x36e5 |
igorsk | 0:90ade34a3b71 | 351 | DCW 0xbcf0,0x3fec, 0x15fe,0x20e7, 0xe5ba,0x3871 |
igorsk | 0:90ade34a3b71 | 352 | DCW 0xb8a6,0x3f85, 0x13d5,0x223d, 0xe182,0x39db |
igorsk | 0:90ade34a3b71 | 353 | DCW 0xb4be,0x3ec5, 0x11a8,0x238e, 0xdd5d,0x3b21 |
igorsk | 0:90ade34a3b71 | 354 | DCW 0xb140,0x3daf, 0x0f79,0x24da, 0xd94d,0x3c42 |
igorsk | 0:90ade34a3b71 | 355 | DCW 0xae2e,0x3c42, 0x0d48,0x2620, 0xd556,0x3d3f |
igorsk | 0:90ade34a3b71 | 356 | DCW 0xab8e,0x3a82, 0x0b14,0x2760, 0xd178,0x3e15 |
igorsk | 0:90ade34a3b71 | 357 | DCW 0xa963,0x3871, 0x08df,0x289a, 0xcdb7,0x3ec5 |
igorsk | 0:90ade34a3b71 | 358 | DCW 0xa7b1,0x3612, 0x06a9,0x29ce, 0xca15,0x3f4f |
igorsk | 0:90ade34a3b71 | 359 | DCW 0xa678,0x3368, 0x0471,0x2afb, 0xc695,0x3fb1 |
igorsk | 0:90ade34a3b71 | 360 | DCW 0xa5bc,0x3076, 0x0239,0x2c21, 0xc338,0x3fec |
igorsk | 0:90ade34a3b71 | 361 | DCW 0xa57e,0x2d41, 0x0000,0x2d41, 0xc000,0x4000 |
igorsk | 0:90ade34a3b71 | 362 | DCW 0xa5bc,0x29ce, 0xfdc7,0x2e5a, 0xbcf0,0x3fec |
igorsk | 0:90ade34a3b71 | 363 | DCW 0xa678,0x2620, 0xfb8f,0x2f6c, 0xba09,0x3fb1 |
igorsk | 0:90ade34a3b71 | 364 | DCW 0xa7b1,0x223d, 0xf957,0x3076, 0xb74d,0x3f4f |
igorsk | 0:90ade34a3b71 | 365 | DCW 0xa963,0x1e2b, 0xf721,0x3179, 0xb4be,0x3ec5 |
igorsk | 0:90ade34a3b71 | 366 | DCW 0xab8e,0x19ef, 0xf4ec,0x3274, 0xb25e,0x3e15 |
igorsk | 0:90ade34a3b71 | 367 | DCW 0xae2e,0x1590, 0xf2b8,0x3368, 0xb02d,0x3d3f |
igorsk | 0:90ade34a3b71 | 368 | DCW 0xb140,0x1112, 0xf087,0x3453, 0xae2e,0x3c42 |
igorsk | 0:90ade34a3b71 | 369 | DCW 0xb4be,0x0c7c, 0xee58,0x3537, 0xac61,0x3b21 |
igorsk | 0:90ade34a3b71 | 370 | DCW 0xb8a6,0x07d6, 0xec2b,0x3612, 0xaac8,0x39db |
igorsk | 0:90ade34a3b71 | 371 | DCW 0xbcf0,0x0324, 0xea02,0x36e5, 0xa963,0x3871 |
igorsk | 0:90ade34a3b71 | 372 | DCW 0xc197,0xfe6e, 0xe7dc,0x37b0, 0xa834,0x36e5 |
igorsk | 0:90ade34a3b71 | 373 | DCW 0xc695,0xf9ba, 0xe5ba,0x3871, 0xa73b,0x3537 |
igorsk | 0:90ade34a3b71 | 374 | DCW 0xcbe2,0xf50f, 0xe39c,0x392b, 0xa678,0x3368 |
igorsk | 0:90ade34a3b71 | 375 | DCW 0xd178,0xf073, 0xe182,0x39db, 0xa5ed,0x3179 |
igorsk | 0:90ade34a3b71 | 376 | DCW 0xd74e,0xebed, 0xdf6d,0x3a82, 0xa599,0x2f6c |
igorsk | 0:90ade34a3b71 | 377 | DCW 0xdd5d,0xe782, 0xdd5d,0x3b21, 0xa57e,0x2d41 |
igorsk | 0:90ade34a3b71 | 378 | DCW 0xe39c,0xe33a, 0xdb52,0x3bb6, 0xa599,0x2afb |
igorsk | 0:90ade34a3b71 | 379 | DCW 0xea02,0xdf19, 0xd94d,0x3c42, 0xa5ed,0x289a |
igorsk | 0:90ade34a3b71 | 380 | DCW 0xf087,0xdb26, 0xd74e,0x3cc5, 0xa678,0x2620 |
igorsk | 0:90ade34a3b71 | 381 | DCW 0xf721,0xd766, 0xd556,0x3d3f, 0xa73b,0x238e |
igorsk | 0:90ade34a3b71 | 382 | DCW 0xfdc7,0xd3df, 0xd363,0x3daf, 0xa834,0x20e7 |
igorsk | 0:90ade34a3b71 | 383 | DCW 0x0471,0xd094, 0xd178,0x3e15, 0xa963,0x1e2b |
igorsk | 0:90ade34a3b71 | 384 | DCW 0x0b14,0xcd8c, 0xcf94,0x3e72, 0xaac8,0x1b5d |
igorsk | 0:90ade34a3b71 | 385 | DCW 0x11a8,0xcac9, 0xcdb7,0x3ec5, 0xac61,0x187e |
igorsk | 0:90ade34a3b71 | 386 | DCW 0x1824,0xc850, 0xcbe2,0x3f0f, 0xae2e,0x1590 |
igorsk | 0:90ade34a3b71 | 387 | DCW 0x1e7e,0xc625, 0xca15,0x3f4f, 0xb02d,0x1294 |
igorsk | 0:90ade34a3b71 | 388 | DCW 0x24ae,0xc44a, 0xc851,0x3f85, 0xb25e,0x0f8d |
igorsk | 0:90ade34a3b71 | 389 | DCW 0x2aaa,0xc2c1, 0xc695,0x3fb1, 0xb4be,0x0c7c |
igorsk | 0:90ade34a3b71 | 390 | DCW 0x306c,0xc18e, 0xc4e2,0x3fd4, 0xb74d,0x0964 |
igorsk | 0:90ade34a3b71 | 391 | DCW 0x35eb,0xc0b1, 0xc338,0x3fec, 0xba09,0x0646 |
igorsk | 0:90ade34a3b71 | 392 | DCW 0x3b1e,0xc02c, 0xc197,0x3ffb, 0xbcf0,0x0324 |
igorsk | 0:90ade34a3b71 | 393 | |
igorsk | 0:90ade34a3b71 | 394 | END |
igorsk | 0:90ade34a3b71 | 395 | ;******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE**** |