www.pudn.com > fft_iccavr.rar > fft.s
.module fft.c .area text(rom, con, rel) .dbfile D:\HJN\Design\AVR\fft\fft.c .dbfunc e four1 _four1 fV ; theta -> y+52 ; wpi -> y+48 ; wpr -> y+44 ; wtemp -> y+40 ; m -> y+36 ; istep -> y+32 ; n -> y+28 ; mmax -> y+24 ; wr -> y+20 ; wi -> y+16 ; tempi -> y+12 ; tempr -> y+8 ; i -> y+4 ; j -> y+0 ; isign -> R10,R11 ; nn -> y+64 ; data -> R12,R13 .even _four1:: st -y,r19 st -y,r18 xcall push_gset4 movw R12,R16 sbiw R28,56 movw R30,R28 subi R30,188 ; addi 68 sbci R31,255 ldd R10,z+0 ldd R11,z+1 .dbline -1 .dbline 9 ; /*data是输入和输出(复数),nn是FFT的点数 isign指示FFT变换方向1为正变换, ; -1为反变换,程序出自《Numerical Recipes in C》 */ ; ; ; #include; #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr ; ; void four1(float data[], unsigned long nn, int isign) ; { .dbline 14 ; unsigned long n,mmax,m,j,istep,i; ; double wtemp,wr,wpr,wpi,wi,theta; ; float tempr,tempi; ; ; n=nn << 1; //nn乘以2赋给n,作为取样点数 movw R30,R28 subi R30,192 ; addi 64 sbci R31,255 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 lsl R2 rol R3 rol R4 rol R5 movw R30,R28 std z+28,R2 std z+29,R3 std z+30,R4 std z+31,R5 .dbline 15 ; j=1; ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 std z+0,R20 std z+1,R21 std z+2,R22 std z+3,R23 .dbline 16 ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 std z+4,R20 std z+5,R21 std z+6,R22 std z+7,R23 xjmp L5 L2: .dbline 16 ; for (i=1;i i) { movw R30,R28 ldd R2,z+4 ldd R3,z+5 ldd R4,z+6 ldd R5,z+7 movw R30,R28 ldd R6,z+0 ldd R7,z+1 ldd R8,z+2 ldd R9,z+3 cp R2,R6 cpc R3,R7 cpc R4,R8 cpc R5,R9 brlo X0 xjmp L6 X0: .dbline 17 .dbline 18 ; SWAP(data[j],data[i]); movw R30,R28 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R5 st -y,R4 st -y,R3 st -y,R2 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 movw R30,R28 std z+8,R2 std z+9,R3 std z+10,R4 std z+11,R5 .dbline 18 movw R30,R28 ldd R2,z+4 ldd R3,z+5 ldd R4,z+6 ldd R5,z+7 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R5 st -y,R4 st -y,R3 st -y,R2 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 movw R30,R28 ldd R6,z+0 ldd R7,z+1 ldd R8,z+2 ldd R9,z+3 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R9 st -y,R8 st -y,R7 st -y,R6 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 std z+0,R2 std z+1,R3 std z+2,R4 std z+3,R5 .dbline 18 movw R30,R28 ldd R2,z+4 ldd R3,z+5 ldd R4,z+6 ldd R5,z+7 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R5 st -y,R4 st -y,R3 st -y,R2 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 movw R26,R28 adiw R26,8 ld R2,x+ ld R3,x+ ld R4,x+ ld R5,x std z+0,R2 std z+1,R3 std z+2,R4 std z+3,R5 .dbline 19 ; SWAP(data[j+1],data[i+1]); ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 add R2,R20 adc R3,R21 adc R4,R22 adc R5,R23 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R5 st -y,R4 st -y,R3 st -y,R2 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 movw R30,R28 std z+8,R2 std z+9,R3 std z+10,R4 std z+11,R5 .dbline 19 ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ldd R2,z+4 ldd R3,z+5 ldd R4,z+6 ldd R5,z+7 add R2,R20 adc R3,R21 adc R4,R22 adc R5,R23 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R5 st -y,R4 st -y,R3 st -y,R2 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 ldd R2,z+0 ldd R3,z+1 ldd R4,z+2 ldd R5,z+3 ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ldd R6,z+0 ldd R7,z+1 ldd R8,z+2 ldd R9,z+3 add R6,R20 adc R7,R21 adc R8,R22 adc R9,R23 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R9 st -y,R8 st -y,R7 st -y,R6 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 std z+0,R2 std z+1,R3 std z+2,R4 std z+3,R5 .dbline 19 ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ldd R2,z+4 ldd R3,z+5 ldd R4,z+6 ldd R5,z+7 add R2,R20 adc R3,R21 adc R4,R22 adc R5,R23 ldi R20,4 ldi R21,0 ldi R22,0 ldi R23,0 st -y,R5 st -y,R4 st -y,R3 st -y,R2 movw R16,R20 movw R18,R22 xcall empy32u movw R30,R16 add R30,R12 adc R31,R13 movw R26,R28 adiw R26,8 ld R2,x+ ld R3,x+ ld R4,x+ ld R5,x std z+0,R2 std z+1,R3 std z+2,R4 std z+3,R5 .dbline 20 ; } L6: .dbline 21 ; m=n >> 1; //将n除以2的值赋给m movw R30,R28 ldd R2,z+28 ldd R3,z+29 ldd R4,z+30 ldd R5,z+31 lsr R5 ror R4 ror R3 ror R2 movw R30,R28 std z+36,R2 std z+37,R3 std z+38,R4 std z+39,R5 xjmp L9 L8: .dbline 23 .dbline 24 movw R30,R28 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 movw R30,R28 ldd R6,z+0 ldd R7,z+1 ldd R8,z+2 ldd R9,z+3 sub R6,R2 sbc R7,R3 sbc R8,R4 sbc R9,R5 movw R30,R28 std z+0,R6 std z+1,R7 std z+2,R8 std z+3,R9 .dbline 25 movw R30,R28 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 lsr R5 ror R4 ror R3 ror R2 movw R30,R28 std z+36,R2 std z+37,R3 std z+38,R4 std z+39,R5 .dbline 26 L9: .dbline 22 ; while (m >= 2 && j > m) ldi R20,2 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 cp R2,R20 cpc R3,R21 cpc R4,R22 cpc R5,R23 brlo L11 movw R30,R28 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 movw R30,R28 ldd R6,z+0 ldd R7,z+1 ldd R8,z+2 ldd R9,z+3 cp R2,R6 cpc R3,R7 cpc R4,R8 cpc R5,R9 brsh X1 xjmp L8 X1: L11: .dbline 27 movw R30,R28 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 movw R30,R28 ldd R6,z+0 ldd R7,z+1 ldd R8,z+2 ldd R9,z+3 add R6,R2 adc R7,R3 adc R8,R4 adc R9,R5 movw R30,R28 std z+0,R6 std z+1,R7 std z+2,R8 std z+3,R9 .dbline 28 L3: .dbline 16 ldi R20,2 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ldd R2,z+4 ldd R3,z+5 ldd R4,z+6 ldd R5,z+7 add R2,R20 adc R3,R21 adc R4,R22 adc R5,R23 movw R30,R28 std z+4,R2 std z+5,R3 std z+6,R4 std z+7,R5 L5: .dbline 16 movw R30,R28 ldd R2,z+28 ldd R3,z+29 ldd R4,z+30 ldd R5,z+31 movw R30,R28 ldd R6,z+4 ldd R7,z+5 ldd R8,z+6 ldd R9,z+7 cp R6,R2 cpc R7,R3 cpc R8,R4 cpc R9,R5 brsh X2 xjmp L2 X2: .dbline 29 ; { ; j -= m; ; m >>= 1; //将m除以2的值赋给m ; } ; j += m; ; } ; mmax=2; ldi R20,2 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 std z+24,R20 std z+25,R21 std z+26,R22 std z+27,R23 xjmp L13 L12: .dbline 30 ; while (n > mmax) { .dbline 31 ; istep=mmax << 1; movw R30,R28 ldd R2,z+24 ldd R3,z+25 ldd R4,z+26 ldd R5,z+27 lsl R2 rol R3 rol R4 rol R5 movw R30,R28 std z+32,R2 std z+33,R3 std z+34,R4 std z+35,R5 .dbline 32 ; theta=isign*(6.28318530717959/mmax); movw R16,R10 xcall int2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 ldi R16, L15 xcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 ldi R16, L16 xcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 movw R30,R28 ; stack offset 12 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 lsr R5 ror R4 ror R3 ror R2 movw R16,R2 movw R18,R4 xcall long2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 xcall empy32fs ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 ; stack offset 12 ldd R2,z+36 ldd R3,z+37 ldd R4,z+38 ldd R5,z+39 and R2,R20 and R3,R21 and R4,R22 and R5,R23 movw R16,R2 movw R18,R4 xcall long2fp st -y,R19 st -y,R18 st -y,R17 st -y,R16 xcall add32fs xcall div32fs xcall empy32f movw R30,R28 std z+52,R16 std z+53,R17 std z+54,R18 std z+55,R19 .dbline 33 ; wtemp=sin(0.5*theta); ldi R16, L17 xcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 movw R30,R28 ; stack offset 4 ldd R2,z+56 ldd R3,z+57 ldd R4,z+58 ldd R5,z+59 st -y,R5 st -y,R4 st -y,R3 st -y,R2 xcall empy32f xcall _sin movw R30,R28 std z+40,R16 std z+41,R17 std z+42,R18 std z+43,R19 .dbline 34 ; wpr = -2.0*wtemp*wtemp; ldi R16, L18 xcall lpm32 st -y,R19 st -y,R18 st -y,R17 st -y,R16 movw R30,R28 ; stack offset 4 ldd R2,z+44 ldd R3,z+45 ldd R4,z+46 ldd R5,z+47 st -y,R5 st -y,R4 st -y,R3 st -y,R2 xcall empy32fs movw R30,R28 ; stack offset 4 ldd R2,z+44 ldd R3,z+45 ldd R4,z+46 ldd R5,z+47 st -y,R5 st -y,R4 st -y,R3 st -y,R2 xcall empy32f movw R30,R28 std z+44,R16 std z+45,R17 std z+46,R18 std z+47,R19 .dbline 35 ; wpi=sin(theta); movw R30,R28 ldd R16,z+52 ldd R17,z+53 ldd R18,z+54 ldd R19,z+55 xcall _sin movw R30,R28 std z+48,R16 std z+49,R17 std z+50,R18 std z+51,R19 .dbline 36 ; wr=1.0; ldi R16, L19 xcall lpm32 movw R30,R28 std z+20,R16 std z+21,R17 std z+22,R18 std z+23,R19 .dbline 37 ; wi=0.0; ldi R16, L20 xcall lpm32 movw R30,R28 std z+16,R16 std z+17,R17 std z+18,R18 std z+19,R19 .dbline 38 ldi R20,1 ldi R21,0 ldi R22,0 ldi R23,0 movw R30,R28 std z+36,R20 std z+37,R21 std z+38,R22 std z+39,R23 xjmp L24 L21: .dbline 38 ; for (m=1;m