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