⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft.s

📁 在ICCAVR 环境实现的fft,
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 <math.h>
; #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<n;i+=2) {
	.dbline 17
;     if (j > 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
	ldi R17,>L15
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	ldi R16,<L16
	ldi R17,>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
	ldi R17,>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
	ldi R17,>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
	ldi R17,>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
	ldi R17,>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<mmax;m+=2) {
	.dbline 39
	movw R30,R28
	ldd R2,z+36
	ldd R3,z+37
	ldd R4,z+38
	ldd R5,z+39
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	xjmp L28
L25:
	.dbline 39
	.dbline 40
	movw R30,R28
	ldd R2,z+24
	ldd R3,z+25
	ldd R4,z+26
	ldd R5,z+27
	movw R30,R28
	ldd R6,z+4
	ldd R7,z+5

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -