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

📄 fft.asm

📁 最高效的FFT代码
💻 ASM
字号:
**************************************
*基2,时域抽取法,已知实信号的FFT程序*     
**************************************
			.mmregs
			.global reset,start,sav_sin,sav_idx,sav_grp
            .def  	start,_c_int00 
             
DATA		.usect	"DATA",1024	;
           	.copy  	"mdata1.inc"      	;已知信号的数据存在mdata1.inc文件中

N			.set	128					;FFT的长度
LOGN		.set	7					;2的7次方为128,基2算法         	
sav_grp		.usect	"tempv",3
sav_sin		.set	sav_grp+1
sav_idx		.set	sav_grp+2

BOS			.usect	"stack",0Fh
TOS			.usect	"stack",1  

TWI1:    	.sect    "twiddle1"			;正弦表
    			.int    0,201,402,603
    			.int    804,1005,1206,1407
    			.int    1607,1808,2009,2210
    			.int    2410,2611,2811,3011
    			.int    3211,3411,3611,3811
    			.int    4011,4210,4409,4609    
    			.int    4808,5006,5205,5403
    			.int    5602,5800,5997,6195
    			.int    6392,6589,6786,6983
    			.int    7179,7375,7571,7766
    			.int    7961,8156,8351,8545
    			.int    8739,8933,9126,9319
    			.int    9512,9704,9896,10087
    			.int    10278,10469,10659,10849
    			.int    11039,11228,11416,11605
    			.int    11793,11980,12167,12353
    			.int    12539,12725,12910,13094
    			.int    13278,13462,13645,13828
    			.int    14010,14191,14372,14552
    			.int    14732,14912,15090,15269
    			.int    15446,15623,15800,15976
    			.int    16151,16325,16499,16673
    			.int    16846,17018,17189,17360
    			.int    17530,17700,17869,18037  
    			.int    18204,18371,18537,18703
    			.int    18868,19032,19195,19358
    			.int    19519,19681,19841,20001
    			.int    20159,20318,20475,20631
    			.int    20787,20942,21097,21250
    			.int    21403,21555,21706,21856
    			.int    22005,22154,22301,22448
    			.int    22594,22740,22884,23027
    			.int    23170,23312,23453,23593
      			.int    23732,23870,24007,24144
  				.int    24279,24414,24547,24680
  				.int    24812,24943,25073,25201
  				.int    25330,25457,25583,25708
  				.int    25832,25955,26077,26199
  				.int    26319,26438,26557,26674
  				.int    26790,26905,27020,27133
  				.int    27245,27356,27466,27576
  				.int    27684,27791,27897,28002
  				.int    28106,28208,28310,28411
  				.int    28511,28609,28707,28803
  				.int    28898,28993,29086,29178
  				.int    29269,29359,29447,29535
  				.int    29621,29707,29791,29874
  				.int    29956,30037,30117,30196
  				.int    30273,30350,30425,30499
  				.int    30572,30644,30714,30784
  				.int    30852,30919,30985,31050
  				.int    31114,31176,31237,31298
  				.int    31357,31414,31471,31526
  				.int    31581,31634,31685,31736
  				.int    31785,31834,31881,31927
  				.int    31971,32015,32057,32098
  				.int    32138,32176,32214,32250
  				.int    32285,32319,32351,32383
  				.int    32413,32442,32469,32496
  				.int    32521,32545,32568,32589
  				.int    32610,32629,32647,32663
  				.int    32679,32693,32706,32718
  				.int    32728,32737,32745,32752
  				.int    32758,32762,32765,32767
  				.int    32767,32767,32765,32762
  				.int    32758,32752,32745,32737
  				.int    32728,32718,32706,32693
  				.int    32679,32663,32647,32629
  				.int    32610,32589,32568,32545
  				.int    32521,32496,32469,32442
  				.int    32413,32383,32351,32319
  				.int    32285,32250,32214,32176
  				.int    32138,32098,32057,32015
  				.int    31971,31927,31881,31834
  				.int    31785,31736,31685,31634
  				.int    31581,31526,31471,31414
  				.int    31357,31298,31237,31176
  				.int    31114,31050,30985,30919
   				.int  	 30852,30784,30714,30644
  				.int    30572,30499,30425,30350
  				.int    30273,30196,30117,30037
  				.int    29956,29874,29791,29707
  				.int    29621,29535,29447,29359
  				.int    29269,29178,29086,28993
  				.int    28898,28803,28707,28609
  				.int    28511,28411,28310,28208
  				.int    28106,28002,27897,27791
  				.int    27684,27576,27466,27356
  				.int    27245,27133,27020,26905
  				.int    26790,26674,26557,26438
  				.int    26319,26199,26077,25955
  				.int    25832,25708,25583,25457
  				.int    25330,25201,25073,24943
  				.int    24812,24680,24547,24414
  				.int    24279,24144,24007,23870
  				.int    23732,23593,23453,23312
  				.int    23170,23027,22884,22740
  				.int    22594,22448,22301,22154
  				.int    22005,21856,21706,21555
  				.int    21403,21250,21097,20942
  				.int    20787,20631,20475,20318
  				.int    20159,20001,19841,19681
  				.int    19519,19358,19195,19032
  				.int    18868,18703,18537,18371
  				.int    18204,18037,17869,17700
  				.int    17530,17360,17189,17018
  				.int    16846,16673,16499,16325
  				.int    16151,15976,15800,15623
  				.int    15446,15269,15090,14912
  				.int    14732,14552,14372,14191
  				.int    14010,13828,13645,13462
  				.int    13278,13094,12910,12725
  				.int    12539,12353,12167,11980
  				.int    11793,11605,11416,11228
  				.int    11039,10849,10659,10469
  				.int    10278,10087,9896,9704
  				.int    9512,9319,9126,8933
  				.int    8739,8545,8351,8156
  				.int    7961,7766,7571,7375
  				.int    7179,6983,6786,6589
  				.int    6392,6195,5997,5800
  				.int    5602,5403,5205,5006
  				.int    4808,4609,4409,4210
  				.int    4011,3811,3611,3411
    			.int    3211,3011,2811,2611
    			.int    2410,2210,2009,1808
    			.int    1607,1407,1206,1005
    			.int    804,603,402,201     
TWI2:       	.sect    "twiddle2"				;余弦表
    		    .int    32767,32767,32765,32762
    			.int    32758,32752,32745,32737
    			.int    32728,32718,32706,32693
    			.int    32679,32663,32647,32629
    			.int    32610,32589,32568,32545
    			.int    32521,32496,32469,32442
    			.int    32413,32383,32351,32319
    			.int    32285,32250,32214,32176
    			.int    32138,32098,32057,32015
    			.int    31971,31927,31881,31834
    			.int    31785,31736,31685,31634
    			.int    31581,31526,31471,31414
    			.int    31357,31298,31237,31176
    			.int    31114,31050,30985,30919
    			.int    30852,30784,30714,30644
    			.int    30572,30499,30425,30350
    			.int    30273,30196,30117,30037
    			.int    29956,29874,29791,29707
    			.int    29621,29535,29447,29359
    			.int    29269,29178,29086,28993
    			.int    28898,28803,28707,28609
    			.int    28511,28411,28310,28208
    			.int    28106,28002,27897,27791
    			.int    27684,27576,27466,27356
    			.int    27245,27133,27020,26905
    			.int    26790,26674,26557,26438
    			.int    26319,26199,26077,25955
    			.int    25832,25708,25583,25457
    			.int    25330,25201,25073,24943
    			.int    24812,24680,24547,24414
    			.int    24279,24144,24007,23870
    			.int    23732,23593,23453,23312
    			.int    23170,23027,22884,22740
    			.int    22594,22448,22301,22154
    			.int    22005,21856,21706,21555
    			.int    21403,21250,21097,20942
    			.int    20787,20631,20475,20318
    			.int    20159,20001,19841,19681
    			.int    19519,19358,19195,19032
  				.int    18868,18703,18537,18371
  				.int    18204,18037,17869,17700
  				.int    17530,17360,17189,17018    
  				.int    16846,16673,16499,16325
  				.int    16151,15976,15800,15623
  				.int    15446,15269,15090,14912
  				.int    14732,14552,14372,14191
  				.int    14010,13828,13645,13462
  				.int    13278,13094,12910,12725
  				.int    12539,12353,12167,11980
  				.int    11793,11605,11416,11228
  				.int    11039,10849,10659,10469
  				.int    10278,10087,9896,9704
  				.int    9512,9319,9126,8933
  				.int    8739,8545,8351,8156
  				.int    7961,7766,7571,7375
  				.int    7179,6983,6786,6589
  				.int    6392,6195,5997,5800
  				.int    5602,5403,5205,5006
  				.int    4808,4609,4409,4210
  				.int    4011,3811,3611,3411
  				.int    3211,3011,2811,2611
  				.int    2410,2210,2009,1808
  				.int    1607,1407,1206,1005
  				.int    804,603,402,201
  				.int    0,201,-402,-603
  				.int    -804,-1005,-1206,-1407
  				.int    -1607,-1808,-2009,-2210
  				.int    -2410,-2611,-2811,-3011
  				.int    -3211,-3411,-3611,-3811
  				.int    -4011,-4210,-4409,-4609
  				.int    -4808,-5006,-5205,-5403
  				.int    -5602,-5800,-5997,-6195
  				.int    -6392,-6589,-6786,-6983
  				.int    -7179,-7375,-7571,-7766
  				.int    -7961,-8156,-8351,-8545
  				.int    -8739,-8933,-9126,-9319
  				.int    -9512,-9704,-9896,-10087
  				.int    -10278,-10469,-10659,-10849
  				.int    -11039,-11228,-11416,-11605
  				.int    -11793,-11980,-12167,-12353
  				.int    -12539,-12725,-12910,-13094
  				.int    -13278,-13462,-13645,-13828
  				.int    -14010,-14191,-14372,-14552
  				.int    -14732,-14912,-15090,-15269
      			.int    -15446,-15623,-15800,-15976
    			.int    -16151,-16325,-16499,-16673
    			.int    -16846,-17018,-17189,-17360
    			.int    -17530,-17700,-17869,-18037
    			.int    -18204,-18371,-18537,-18703
    			.int    -18868,-19032,-19195,-19358
    			.int    -19519,-19681,-19841,-20001
    			.int    -20159,-20318,-20475,-20631
    			.int    -20787,-20942,-21097,-21250
    			.int    -21403,-21555,-21706,-21856
    			.int    -22005,-22154,-22301,-22448
    			.int    -22594,-22740,-22884,-23027
    			.int    -23170,-23312,-23453,-23593
    			.int    -23732,-23870,-24007,-24144
    			.int    -24279,-24414,-24547,-24680
    			.int    -24812,-24943,-25073,-25201
    			.int    -25330,-25457,-25583,-25708
    			.int    -25832,-25955,-26077,-26199
    			.int    -26319,-26438,-26557,-26674
    			.int    -26790,-26905,-27020,-27133
    			.int    -27245,-27356,-27466,-27576
    			.int    -27684,-27791,-27897,-28002
    			.int    -28106,-28208,-28310,-28411
    			.int    -28511,-28609,-28707,-28803
    			.int    -28898,-28993,-29086,-29178
    			.int    -29269,-29359,-29447,-29535
    			.int    -29621,-29707,-29791,-29874
    			.int    -29956,-30037,-30117,-30196
    			.int    -30273,-30350,-30425,-30499
    			.int    -30572,-30644,-30714,-30784
    			.int    -30852,-30919,-30985,-31050
    			.int    -31114,-31176,-31237,-31298
    			.int    -31357,-31414,-31471,-31526
    			.int    -31581,-31634,-31685,-31736
    			.int    -31785,-31834,-31881,-31927
    			.int    -31971,-32015,-32057,-32098
    			.int    -32138,-32176,-32214,-32250
    			.int    -32285,-32319,-32351,-32383
    			.int    -32413,-32442,-32469,-32496
    			.int    -32521,-32545,-32568,-32589
    			.int    -32610,-32629,-32647,-32663
    			.int    -32679,-32693,-32706,-32718
    			.int    -32728,-32737,-32745,-32752
    			.int    -32758,-32762,-32765,-32767

			
			.text
_c_int00
		b start
		nop
		nop

start:      SSBX 	INTM
			LD		#0,DP 
			STM		#TOS,SP
			STM     #56DBh,SWWSR
		    STM     #1028h,PMST ; 
		    STM     #0,CLKMD
teststa:
			LDM     CLKMD,A
			AND     #01h,A
			BC      teststa,ANEQ
			STM     #01097h,CLKMD
			RPT     #0fffh
			NOP
		    STM		#0,IMR      
	    	RSBX	OVM 
		    SSBX	SXM
		    SSBX	FRCT           
			STM 	#2*N,BK 
			STM		#INPUT,AR3			;已知信号在程序存储器中的首地址
			STM		#DATA,AR7			;存放已知信号的数据存储器的首地址
			MVMM	AR7,AR2				;FFT运算后DATA块中存放的是已知信号的频谱
			STM		#N-1,BRC
			RPTBD	plend-1				;把存放在程序存储器中的已知信号搬到数据存储器
			STM 	#N,AR0
			LDM 	AR3,A    
			READA   *AR2+ 
			ADD     #1,A
			READA   *AR2+
			MAR		*AR3+0B
plend:									;基2FFT运算
			STM		#0,BK		
			LD		#-1,ASM
			MVMM	AR7,AR2
			STM		#DATA+2,AR3
			STM	    #N/2-1,BRC
			LD		*AR2,16,A
			RPTBD	s1end-1
			STM		#3,AR0
			SUB		*AR3,16,A,B
			ADD		*AR3,16,A
			STH		A,ASM,*AR2+
			ST		B,*AR3+
			||LD	*AR2,A
			SUB		*AR3,16,A,B
			ADD		*AR3,16,A
			STH		A,ASM,*AR2+0
			ST		B,*AR3+0%
			||LD	*AR2,A
s1end:
			MVMM	AR7,AR2
			STM		#DATA+4,AR3
			STM		#N/4-1,BRC
			LD		*AR2,16,A
			RPTBD	s2end-1
			STM		#5,AR0
			SUB		*AR3,16,A,B
			ADD		*AR3,16,A
			STH		A,ASM,*AR2+
			ST		B,*AR3+
			||LD	*AR2,A
			SUB		*AR3,16,A,B
			ADD		*AR3,16,A
			STH		A,ASM,*AR2+
			STH		B,ASM,*AR3+
			MAR		*AR3+
			ADD		*AR2,*AR3,A
			SUB		*AR2,*AR3-,B
			STH		A,ASM,*AR2+
			SUB		*AR2,*AR3,A
			ST		B,*AR3
			||LD	*AR3+,B
			ST		A,*AR2
			||ADD	*AR2+0%,A
			ST		A,*AR3+0%
			||LD	*AR2,A
s2end:
			STM		#512,BK
			ST		#128,@sav_sin
			STM		#128,AR0
			STM		#TWI2,AR4
			STM     #TWI1,AR5
			STM		#-3+LOGN,AR7
			ST		#-1+N/8,@sav_grp
			STM		#3,AR6
			ST		#8,@sav_idx
stage:
			STM		#DATA,AR2
			LD		@sav_idx,A
			ADD		*(AR2),A
			STLM	A,AR3
			MVDK	@sav_grp,AR1
group:     
			MVMD	AR6,BRC
			RPTBD	bend-1
			LD		*AR4,T
			MPY		*AR3+,A
			MACR	*AR5+0%,*AR3-,A
			ADD		*AR2,16,A,B
			ST		B,*AR2
			||SUB	*AR2+,B
			ST		B,*AR3
			||MPY	*AR3+,A
			MASR	*AR3,*AR4+0%,A
			ADD		*AR2,16,A,B
			ST		B,*AR3+
			||SUB	*AR2,B
			LD		*AR4,T
			ST		B,*AR2+
			||MPY	*AR3+,A
bend:
			PSHM	AR0
			MVDK	sav_idx,AR0
			MAR		*AR2+0
			MAR		*AR3+0
			BANZD	group,*AR1-
			POPM	AR0
			MAR		*AR3-
			LD		sav_idx,A
			SUB		#1,A,B
			STLM	B,AR6
			STL		A,1,sav_idx
			LD		sav_grp,A
			STL		A,ASM,sav_grp
			LD		sav_sin,A
			STL		A,ASM,sav_sin
			BANZD	stage,*AR7-
			MVDK	sav_sin,AR0
;
			STM		#DATA+2,AR2
			STM		#DATA+2*N-2,AR3
			STM		#DATA+2*N+3,AR7
			STM		#DATA+4*N-1,AR6
			STM		#-2+N/2,BRC
			RPTBD	p3end-1
			STM		#3,AR0
;
			ADD		*AR2,*AR3,A
			SUB     *AR2,*AR3,B			
			STH		A,ASM,*AR2+
			STH		A,ASM,*AR3+
			STH		B,ASM,*AR6-
			NEG		B
			STH		B,ASM,*AR7-
			ADD		*AR2,*AR3,A
			SUB		*AR2,*AR3,B
			STH		A,ASM,*AR2+
			STH		A,ASM,*AR3-0
			STH		B,ASM,*AR6-
			NEG		B
			STH		B,ASM,*AR7+0
p3end:
			ST		#0,*AR6-
			ST		#0,*AR6
p3test:
			STM		#DATA,AR2
			STM		#DATA+1,AR4
			STM		#DATA+2*N+1,AR5
			ADD		*AR2,*AR4,A
			SUB		*AR2,*AR4,B
			STH		A,ASM,*AR2+
			ST		#0,*AR2
			MVDD	*AR2+,*AR5-
			STH		B,ASM,*AR5
;
			STM		#DATA+4*N-1,AR3
			STM		#TWI2+512/N,AR4
			STM		#TWI1+512/N,AR5
			STM		#N-2,BRC
			RPTBD	p4end-1
			STM		#512/N,AR0
			LD		*AR2+,16,A
			MACR	*AR4,*AR2,A
			MASR	*AR5,*AR3-,A
			LD		*AR3+,16,B
			MASR	*AR5+0%,*AR2-,B
			MASR	*AR4+0%,*AR3,B
			STH		A,ASM,*AR2+
			STH		B,ASM,*AR2+
			NEG		B
			STH		B,ASM,*AR3-
			STH		A,ASM,*AR3-
p4end:		rsbx	xf					;运算结束后使XF端输出一信号作为结束标志
			nop
			nop
			nop  
			nop
			nop
			nop 
			ssbx	xf     
			nop
			nop
			nop  
			nop
			nop
			nop 
			B		p4end 
			.end
		    .end

⌨️ 快捷键说明

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