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

📄 ff.s

📁 在ICCAVR 环境实现的fft,
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module ff.c
	.area data(ram, con, rel)
_dataR::
	.blkb 4
	.area idata
	.word 0x0,0x40a0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x40a0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x40a0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x40a0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.dbsym e dataR _dataR A[32:8]D
_dataI::
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.blkb 4
	.area idata
	.word 0x0,0x0
	.area data(ram, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.dbsym e dataI _dataI A[32:8]D
	.area text(rom, con, rel)
	.dbfile D:\HJN\Design\AVR\fft\ff.c
	.dbfunc e FFT _FFT fV
;             xx -> y+12
;             x2 -> R14,R15
;             x1 -> R10,R11
;             x0 -> R12,R13
;              L -> y+24
;              j -> R10,R11
;           temp -> y+8
;             TI -> y+4
;             TR -> y+0
;              b -> y+22
;              p -> R14,R15
;              k -> R12,R13
;          dataI -> y+38
;          dataR -> y+36
	.even
_FFT::
	xcall push_arg4
	xcall push_gset5
	sbiw R28,26
	.dbline -1
	.dbline 10
; #include <iom128v.h>
; #include <math.h>
; #define PI 3.1415926
; 
; unsigned char i,w[32];
; float dataR[]={5,5,5,5,0,0,0,0};
; float dataI[]={0,0,0,0,0,0,0,0};
; 
; void FFT(float dataR[],float dataI[])
; {
	.dbline 17
;    int x0,x1,x2,xx;
;    
;    int L,j,k,b,p;
;    float TR,TI,temp;
; 
; /********** following code invert sequence ************/
;  for(i=0;i<8;i++)
	clr R2
	sts _i,R2
	xjmp L5
L2:
	.dbline 18
	.dbline 19
	clr R14
	clr R15
	clr R10
	clr R11
	clr R12
	clr R13
	.dbline 20
	lds R24,_i
	clr R25
	andi R24,1
	andi R25,0
	movw R12,R24
	.dbline 21
	ldi R18,2
	ldi R19,0
	lds R16,_i
	clr R17
	xcall div16s
	movw R24,R16
	andi R24,1
	andi R25,0
	movw R10,R24
	.dbline 22
	ldi R18,4
	ldi R19,0
	lds R16,_i
	clr R17
	xcall div16s
	movw R24,R16
	andi R24,1
	andi R25,0
	movw R14,R24
	.dbline 23
	ldi R16,2
	ldi R17,0
	movw R18,R10
	xcall empy16s
	movw R2,R16
	ldi R16,4
	ldi R17,0
	movw R18,R12
	xcall empy16s
	movw R4,R16
	add R4,R2
	adc R5,R3
	add R4,R14
	adc R5,R15
	std y+13,R5
	std y+12,R4
	.dbline 24
	lds R2,_i
	ldi R24,4
	mul R24,R2
	movw R30,R0
	ldd R0,y+36
	ldd R1,y+37
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	ldd R18,y+12
	ldd R19,y+13
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+38
	ldd R1,y+39
	add R30,R0
	adc R31,R1
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 25
L3:
	.dbline 17
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
L5:
	.dbline 17
	lds R24,_i
	cpi R24,8
	brsh X0
	xjmp L2
X0:
	.dbline 26
;   { 
;    x0=x1=x2=0;
;    x0=i&0x01; 
;    x1=(i/2)&0x01; 
;    x2=(i/4)&0x01;
;    xx=x0*4+x1*2+x2;
;    dataI[xx]=dataR[i];   //实部的数放在虚部数组中
;   }
;  for(i=0;i<8;i++)
	clr R2
	sts _i,R2
	xjmp L9
L6:
	.dbline 27
	.dbline 28
	lds R2,_i
	ldi R24,4
	mul R24,R2
	movw R2,R0
	movw R30,R2
	ldd R0,y+38
	ldd R1,y+39
	add R30,R0
	adc R31,R1
	ldd R4,z+0
	ldd R5,z+1
	ldd R6,z+2
	ldd R7,z+3
	movw R30,R2
	ldd R0,y+36
	ldd R1,y+37
	add R30,R0
	adc R31,R1
	std z+0,R4
	std z+1,R5
	std z+2,R6
	std z+3,R7
	.dbline 29
	lds R2,_i
	mul R24,R2
	movw R30,R0
	ldd R0,y+38
	ldd R1,y+39
	add R30,R0
	adc R31,R1
	ldi R16,<L10
	ldi R17,>L10
	xcall lpm32
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 30
L7:
	.dbline 26
	lds R24,_i
	subi R24,255    ; addi 1
	sts _i,R24
L9:
	.dbline 26
	lds R24,_i
	cpi R24,8
	brsh X1
	xjmp L6
X1:
	.dbline 32
;   { 
;    dataR[i]=dataI[i];    //将虚部保存的数传回实部
;    dataI[i]=0; 
;   }
; /************** following code FFT *******************/
;  for(L = 1 ; L <= 3 ; L ++ )            // for (1)  L 代表第几级
	ldi R24,1
	ldi R25,0
	std y+25,R25
	std y+24,R24
L11:
	.dbline 33
;   { 
	.dbline 34
;     b = 1 ; 
	ldi R24,1
	ldi R25,0
	std y+23,R25
	std y+22,R24
	.dbline 35
;     i = L - 1 ;          
	ldd R24,y+24
	ldd R25,y+25
	sbiw R24,1
	sts _i,R24
	xjmp L16
L15:
	.dbline 37
	.dbline 38
	ldi R16,2
	ldi R17,0
	ldd R18,y+22
	ldd R19,y+23
	xcall empy16s
	std y+23,R17
	std y+22,R16
	.dbline 39
	lds R24,_i
	subi R24,1
	sts _i,R24
	.dbline 40
L16:
	.dbline 36
;     while ( i > 0 )           //计算第L层旋转因子的个数,即输入口间距 b= 2^(L-1)  
	clr R2
	lds R3,_i
	cp R2,R3
	brlo L15
	.dbline 42
;      {
;        b=b*2; 
;        i--;
;      }                        
;    
;    for ( j = 0 ; j <= b - 1 ; j ++ )    // for (2)  j 用来控制计算第几个旋转因子
	clr R10
	clr R11
	xjmp L21
L18:
	.dbline 43
;     {
	.dbline 44
;        p = 1 ;
	ldi R24,1
	ldi R25,0
	movw R14,R24
	.dbline 45
;        i = 3 - L ;     
	ldi R24,3
	ldd R0,y+24
	ldd R1,y+25
	sub R24,R0
	sbc R25,R1
	sts _i,R24
	xjmp L23
L22:
	.dbline 48
	.dbline 49
	ldi R16,2
	ldi R17,0
	movw R18,R14
	xcall empy16s
	movw R14,R16
	.dbline 50
	lds R24,_i
	subi R24,1
	sts _i,R24
	.dbline 51
L23:
	.dbline 47
;        
;       while ( i > 0 )                           /* p=pow(2,3-L)*j; */
	clr R2
	lds R3,_i
	cp R2,R3
	brlo L22
	.dbline 52
;          {
;           p = p * 2 ; 
;           i -- ;
;          }
;       p=p*j;
	movw R18,R10
	movw R16,R14
	xcall empy16s
	movw R14,R16
	.dbline 54
;        
;         for ( k = j ; k < 8 ; k = k + 2 * b )  /* for (3) */
	movw R12,R10
	xjmp L28
L25:
	.dbline 55
	.dbline 55
	ldi R16,<L29
	ldi R17,>L29
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	movw R16,R14
	xcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall empy32fs
	ldi R16,<L30
	ldi R17,>L30
	xcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	xcall div32f
	xcall fp2int
	movw R14,R16
	.dbline 56
	ldi R16,4
	ldi R17,0
	movw R18,R12
	xcall empy16s
	movw R30,R16
	ldd R0,y+36
	ldd R1,y+37
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 57
	ldi R16,4
	ldi R17,0
	movw R18,R12
	xcall empy16s
	movw R30,R16
	ldd R0,y+38
	ldd R1,y+39
	add R30,R0
	adc R31,R1
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	movw R30,R28
	std z+4,R2
	std z+5,R3
	std z+6,R4
	std z+7,R5
	.dbline 58
	movw R18,R12
	ldd R0,y+22
	ldd R1,y+23
	add R18,R0
	adc R19,R1
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
	ldd R0,y+36
	ldd R1,y+37
	add R30,R0
	adc R31,R1
	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 59
	movw R16,R14
	xcall int2fp
	xcall _cos
	movw R2,R16
	movw R4,R18
	movw R16,R14
	xcall int2fp
	push R2
	push R3
	push R4
	push R5
	xcall _sin
	pop R5
	pop R4
	pop R3
	pop R2
	movw R6,R16
	movw R8,R18
	ldi R16,4
	ldi R17,0
	movw R18,R12
	xcall empy16s
	movw R24,R16
	ldd R0,y+36
	ldd R1,y+37
	add R24,R0
	adc R25,R1
	movw R30,R24
	ldd R20,z+0
	ldd R21,z+1
	ldd R22,z+2
	ldd R23,z+3
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R18,R12
 ; stack offset 4
	ldd R0,y+26
	ldd R1,y+27
	add R18,R0
	adc R19,R1
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
 ; stack offset 4
	ldd R0,y+40
	ldd R1,y+41
	add R30,R0
	adc R31,R1
	ldd R20,z+0
	ldd R21,z+1
	ldd R22,z+2
	ldd R23,z+3
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	xcall empy32fs
	xcall add32fs
	movw R18,R12
 ; stack offset 4
	ldd R0,y+26
	ldd R1,y+27
	add R18,R0
	adc R19,R1
	ldi R16,4
	ldi R17,0
	xcall empy16s
	movw R30,R16
 ; stack offset 4
	ldd R0,y+42
	ldd R1,y+43
	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
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	xcall empy32fs
	xcall add32f
	movw R30,R24
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline 60
	movw R16,R14
	xcall int2fp
	xcall _sin
	movw R2,R16

⌨️ 快捷键说明

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