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

📄 fft2.s

📁 在ICCAVR 环境实现的fft,
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module fft2.c
	.area text(rom, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\fft2.c
	.dbfunc e FFT _FFT fV
;             l0 -> y+36
;             vi -> y+32
;             vr -> y+28
;             is -> y+26
;              i -> y+24
;          poddi -> y+20
;          poddr -> y+16
;              q -> y+12
;              p -> y+8
;              s -> y+4
;              m -> y+2
;             nv -> y+0
;             it -> R20,R21
;              j -> R10,R11
;             il -> y+70
;              l -> y+68
;             fi -> R12,R13
;             fr -> R14,R15
;              k -> y+62
;              n -> y+60
;             pi -> y+58
;             pr -> y+56
	.even
_FFT::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,46
	movw R30,R28
	subi R30,192  ; addi 64
	sbci R31,255
	ldd R14,z+0
	ldd R15,z+1
	movw R30,R28
	subi R30,190  ; addi 66
	sbci R31,255
	ldd R12,z+0
	ldd R13,z+1
	.dbline -1
	.dbline 10
; #include<math.h>
; 
; /*pr:输入实部
; pi:输入虚部
; n为2^k,n不小于数据个数
; l:为0表示正变换,1表示反变换
; il:1表示fr为取模结果。0表示fr输出实部fi输出虚部
; */
; void FFT(double* pr, double* pi, int n, int k, double* fr, double* fi, int l, int il)
; {
	.dbline 13
; int it,m,is,i,j,nv,l0;
; double p,q,s,vr,vi,poddr,poddi;
; for(it = 0;it <= n - 1;it ++)
	clr R20
	clr R21
	xjmp L5
L2:
	.dbline 14
; {
	.dbline 15
; m = it;
	std y+3,R21
	std y+2,R20
	.dbline 16
; is = 0;
	clr R2
	clr R3
	std y+27,R3
	std y+26,R2
	.dbline 17
; for(i = 0;i <= k - 1;i ++)
	std y+25,R3
	std y+24,R2
	xjmp L9
L6:
	.dbline 18
	.dbline 19
	ldi R18,2
	ldi R19,0
	ldd R16,y+2
	ldd R17,y+3
	xcall div16s
	movw R10,R16
	.dbline 20
	ldi R16,2
	ldi R17,0
	movw R18,R10
	xcall empy16s
	ldd R2,y+2
	ldd R3,y+3
	sub R2,R16
	sbc R3,R17
	ldd R18,y+26
	ldd R19,y+27
	ldi R16,2
	ldi R17,0
	xcall empy16s
	movw R4,R16
	add R4,R2
	adc R5,R3
	std y+27,R5
	std y+26,R4
	.dbline 21
	std y+3,R11
	std y+2,R10
	.dbline 22
L7:
	.dbline 17
	ldd R24,y+24
	ldd R25,y+25
	adiw R24,1
	std y+25,R25
	std y+24,R24
L9:
	.dbline 17
	ldd R24,y+62
	ldd R25,y+63
	sbiw R24,1
	ldd R2,y+24
	ldd R3,y+25
	cp R24,R2
	cpc R25,R3
	brge L6
	.dbline 23
	ldd R18,y+26
	ldd R19,y+27
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+56
	ldd R1,y+57
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R30,R16
	add R30,R14
	adc R31,R15
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 24
	ldd R18,y+26
	ldd R19,y+27
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+58
	ldd R1,y+59
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	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 25
L3:
	.dbline 13
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 13
	ldd R24,y+60
	ldd R25,y+61
	sbiw R24,1
	cp R24,R20
	cpc R25,R21
	brlt X3
	xjmp L2
X3:
	.dbline 26
; {
; j = m / 2;
; is = 2 * is + (m - 2 * j);
; m = j;
; }
; fr[it] = pr[is];
; fi[it] = pi[is];
; }
; pr[0] = 1.0;
	ldi R16,<L10
	ldi R17,>L10
	xcall lpm32
	movw R2,R16
	movw R4,R18
	ldd R30,y+56
	ldd R31,y+57
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 27
; pi[0] = 0.0;
	ldi R16,<L11
	ldi R17,>L11
	xcall lpm32
	movw R2,R16
	movw R4,R18
	ldd R30,y+58
	ldd R31,y+59
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 28
; p = 6.283185306 / (1.0 * n);
	ldi R16,<L12
	ldi R17,>L12
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	ldi R16,<L10
	ldi R17,>L10
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
 ; stack offset 8
	movw R30,R28
	subi R30,188  ; addi 68
	sbci R31,255
	ldd R16,z+0
	ldd R17,z+1
	xcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall empy32fs
	xcall div32f
	movw R30,R28
	std z+8,R16
	std z+9,R17
	std z+10,R18
	std z+11,R19
	.dbline 29
; pr[1] = cos(p);
	movw R30,R28
	ldd R16,z+8
	ldd R17,z+9
	ldd R18,z+10
	ldd R19,z+11
	xcall _cos
	movw R2,R16
	movw R4,R18
	ldd R30,y+56
	ldd R31,y+57
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	.dbline 30
; pi[1] = -sin(p);
	movw R30,R28
	ldd R16,z+8
	ldd R17,z+9
	ldd R18,z+10
	ldd R19,z+11
	xcall _sin
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall neg32f
	ldd R30,y+58
	ldd R31,y+59
	std z+4,R16
	std z+5,R17
	std z+6,R18
	std z+7,R19
	.dbline 31
; if(l != 0)
	movw R30,R28
	subi R30,188  ; addi 68
	sbci R31,255
	ldd R0,z+0
	ldd R1,z+1
	tst R0
	brne X0
	tst R1
	breq L13
X0:
	.dbline 32
; pi[1] = -pi[1];
	ldd R24,y+58
	ldd R25,y+59
	adiw R24,4
	movw R2,R24
	movw R30,R24
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	xcall neg32f
	movw R30,R2
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
L13:
	.dbline 33
; for(i = 2;i <= n - 1;i ++)
	ldi R24,2
	ldi R25,0
	std y+25,R25
	std y+24,R24
	xjmp L18
L15:
	.dbline 34
	.dbline 35
	ldd R18,y+24
	ldd R19,y+25
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	sbiw R30,4
	ldd R0,y+56
	ldd R1,y+57
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R30,R0
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32f
	movw R30,R28
	std z+8,R16
	std z+9,R17
	std z+10,R18
	std z+11,R19
	.dbline 36
	ldd R18,y+24
	ldd R19,y+25
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	sbiw R30,4
	ldd R0,y+58
	ldd R1,y+59
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R30,R0
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32f
	movw R30,R28
	std z+12,R16
	std z+13,R17
	std z+14,R18
	std z+15,R19
	.dbline 37
	ldd R18,y+24
	ldd R19,y+25
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R24,R16
	sbiw R24,4
	movw R30,R24
	ldd R0,y+56
	ldd R1,y+57
	add R30,R0
	adc R31,R1
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	movw R30,R24
 ; stack offset 4
	ldd R0,y+62
	ldd R1,y+63
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall add32fs
 ; stack offset 4
	ldd R30,y+60
	ldd R31,y+61
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
 ; stack offset 8
	movw R26,R28
	subi R26,190  ; addi 66
	sbci R27,255
	ld R30,x+
	ld R31,x
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall add32fs
	xcall empy32f
	movw R30,R28
	std z+4,R16
	std z+5,R17
	std z+6,R18
	std z+7,R19
	.dbline 38
	ldd R18,y+24
	ldd R19,y+25
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+56
	ldd R1,y+57
	add R30,R0
	adc R31,R1
	movw R26,R28
	adiw R26,8
	ld R2,x+
	ld R3,x+
	ld R4,x+
	ld R5,x
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R26,R28
 ; stack offset 4
	adiw R26,16
	ld R2,x+
	ld R3,x+
	ld R4,x+
	ld R5,x
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall sub32f
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 39
	movw R30,R28
	ldd R2,z+4
	ldd R3,z+5
	ldd R4,z+6
	ldd R5,z+7
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R30,R28
 ; stack offset 4
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall sub32fs
	movw R30,R28
 ; stack offset 4
	ldd R2,z+16
	ldd R3,z+17
	ldd R4,z+18
	ldd R5,z+19
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall sub32f
	ldd R18,y+24
	ldd R19,y+25
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+58
	ldd R1,y+59
	add R30,R0
	adc R31,R1
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 40
L16:
	.dbline 33
	ldd R24,y+24
	ldd R25,y+25
	adiw R24,1
	std y+25,R25
	std y+24,R24
L18:
	.dbline 33
	ldd R24,y+60
	ldd R25,y+61
	sbiw R24,1
	ldd R2,y+24
	ldd R3,y+25
	cp R24,R2
	cpc R25,R3
	brlt X4
	xjmp L15
X4:
	.dbline 41
; {
; p = pr[i - 1] * pr[1];
; q = pi[i - 1] * pi[1];
; s = (pr[i - 1] + pi[i - 1]) * (pr[1] + pi[1]);
; pr[i] = p - q;
; pi[i] = s - p - q;
; }
; for(it = 0;it <= n - 2;it = it + 2)
	clr R20
	clr R21
	xjmp L22
L19:
	.dbline 42
	.dbline 43
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R30,R16
	add R30,R14
	adc R31,R15
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+28,R2
	std z+29,R3
	std z+30,R4
	std z+31,R5
	.dbline 44
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	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+32,R2
	std z+33,R3
	std z+34,R4
	std z+35,R5
	.dbline 45
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R2,R16
	add R2,R14
	adc R3,R15
	movw R30,R28
	ldd R4,z+28
	ldd R5,z+29
	ldd R6,z+30
	ldd R7,z+31
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	movw R30,R2
	ldd R4,z+4
	ldd R5,z+5
	ldd R6,z+6
	ldd R7,z+7
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	xcall add32f
	movw R30,R2
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 46
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R2,R16
	add R2,R12
	adc R3,R13
	movw R30,R28
	ldd R4,z+32
	ldd R5,z+33
	ldd R6,z+34
	ldd R7,z+35
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	movw R30,R2
	ldd R4,z+4
	ldd R5,z+5
	ldd R6,z+6
	ldd R7,z+7
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	xcall add32f
	movw R30,R2
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 47
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R24,R16
	add R24,R14
	adc R25,R15
	adiw R24,4
	movw R2,R24
	movw R30,R28
	ldd R4,z+28
	ldd R5,z+29
	ldd R6,z+30
	ldd R7,z+31
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	movw R30,R24
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	xcall sub32f
	movw R30,R2
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 48
	ldi R16,4
	ldi R17,0
	movw R18,R20
	xcall empy16s
	movw R24,R16
	add R24,R12
	adc R25,R13
	adiw R24,4
	movw R2,R24
	movw R30,R28
	ldd R4,z+32
	ldd R5,z+33
	ldd R6,z+34
	ldd R7,z+35
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	movw R30,R24
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	st -y,R7
	st -y,R6
	st -y,R5
	st -y,R4
	xcall sub32f
	movw R30,R2
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 49
L20:
	.dbline 41
	subi R20,254  ; offset = 2
	sbci R21,255
L22:
	.dbline 41
	ldd R24,y+60
	ldd R25,y+61
	sbiw R24,2
	cp R24,R20
	cpc R25,R21
	brlt X5
	xjmp L19
X5:
	.dbline 50
; {
; vr = fr[it];
; vi = fi[it];
; fr[it] = vr + fr[it + 1];
; fi[it] = vi + fi[it + 1];
; fr[it + 1] = vr - fr[it + 1];
; fi[it + 1] = vi - fi[it + 1];
; }
; m = n / 2;
	ldi R18,2
	ldi R19,0
	ldd R16,y+60
	ldd R17,y+61
	xcall div16s
	std y+3,R17
	std y+2,R16
	.dbline 51
; nv = 2;
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	.dbline 52
; for(l0 = k - 2;l0 >= 0;l0 --)
	ldd R24,y+62
	ldd R25,y+63
	sbiw R24,2
	std y+37,R25
	std y+36,R24
	xjmp L26
L23:
	.dbline 53
; {
	.dbline 54
; m = m / 2;
	ldi R18,2
	ldi R19,0
	ldd R16,y+2
	ldd R17,y+3
	xcall div16s
	std y+3,R17
	std y+2,R16
	.dbline 55
; nv = 2 * nv;
	ldd R18,y+0
	ldd R19,y+1
	ldi R16,2
	ldi R17,0
	xcall empy16s
	std y+1,R17
	std y+0,R16
	.dbline 56
; for(it = 0;it <= (m - 1) * nv;it = it + nv)
	clr R20
	clr R21
	xjmp L30
L27:
	.dbline 57
; for(j = 0;j <= (nv / 2) - 1;j ++)
	clr R10
	clr R11
	xjmp L34
L31:
	.dbline 58
	.dbline 59
	ldd R16,y+2
	ldd R17,y+3
	movw R18,R10
	xcall empy16s
	movw R18,R16
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+56
	ldd R1,y+57
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R18,2
	ldi R19,0
 ; stack offset 4
	ldd R16,y+4
	ldd R17,y+5
	xcall div16s
	movw R18,R20
	add R18,R10
	adc R19,R11
	add R18,R16
	adc R19,R17
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	add R30,R14
	adc R31,R15
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32f
	movw R30,R28
	std z+8,R16
	std z+9,R17
	std z+10,R18
	std z+11,R19
	.dbline 60
	ldd R16,y+2
	ldd R17,y+3
	movw R18,R10
	xcall empy16s
	movw R18,R16
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+58
	ldd R1,y+59
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R18,2
	ldi R19,0
 ; stack offset 4
	ldd R16,y+4
	ldd R17,y+5
	xcall div16s
	movw R18,R20
	add R18,R10
	adc R19,R11
	add R18,R16
	adc R19,R17
	ldi R16,4
	ldi R17,0
	xcall empy16s
	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
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32f
	movw R30,R28
	std z+12,R16
	std z+13,R17
	std z+14,R18
	std z+15,R19
	.dbline 61

⌨️ 快捷键说明

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