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

📄 zhy_219b.asm

📁 FFT算法的DSP的实现。DSP芯片的出现使FFT的实现方法变得更为方便.由于多数DSP芯片都能在一个指令周期内完成一次乘法和一次加法,而且提供专门的FFT指令,使得FFT算法在DSP芯片上实现的速度
💻 ASM
字号:
***************************************************************
*  FFT算法的DSP的实现                                         *
*  傅里叶变换是一种将信号从时域到频域的变换形式,是声学,语音,  *
*  电信和信号处理等领域中的一种重要的分析工具.离散傅里叶变换  *
*  (DFT)是连续傅里叶变换在离散系统中的表现形式.快速傅里叶变换 *
*  (FFT)是离散傅里叶变换的的一种高效运算方法.FFT的出现大大提高*
*  DFT的运算速度,从而使DFT在实际应用中得到广泛的应用          *
*-------------------------------------------------------------*
*  DSP芯片的出现使FFT的实现方法变得更为方便.由于多数DSP芯片   *
*  都能在一个指令周期内完成一次乘法和一次加法,而且提供专门的  *
*  FFT指令,使得FFT算法在DSP芯片上实现的速度更快               *
*-------------------------------------------------------------*
*  FFT运算时间是衡量DSP芯片性能的一个重要指标.在用DSP芯片实现 *
*  FFT算法时,应充分利用DSP芯片提供的各种软硬件资源,如片内RAM  *
*  bit反转寻址方式.
*-------------------------------------------------------------*
*  程序来源:DSP技术与应用实例(赵红怡)     Page 219            *
*-------------------------------------------------------------*
*                                            lvlishan         *
*                                            2009 04 20       *
*                                            2009 04 21       *
***************************************************************
            .title   "fft.asm"
			.mmregs 
			.global reset,start,sav_sin,sav_idx,sav_grp 
            .def  	start,_c_int00  
            .data  
DATA		.space	1024             ;复输出数据的起始地址
            .copy  	"mdata.inc"      ;输入数据
 
N			.set	128              ;复数点数
LOGN		.set	7                ;碟形运算的级数=(logN/log2)
; 为输入数据和旋转因子定义变量
sav_grp		.usect	"tempv",3        ;定义组变量值
sav_sin		.set	sav_grp+1        ;定义旋转因子表索引值
sav_idx		.set	sav_grp+2        ;定义输入数据索引值
OUTPUT		.usect	"OUTPUT",256     ;定义输出数据的数目
 
BOS			.usect	"stack",0Fh      ;定义堆栈
TOS			.usect	"stack",1  
          
	  	    .copy 	"twiddle1.inc"   ;旋转因子sine表
			.copy 	"twiddle2.inc"   ;旋转因子cosine表
 
;以下为程序代码
			.text 
_c_int00 
		b start  
		nop 
		nop 
start: 
			STM		#TOS,SP 
			LD		#0,DP 
			SSBX	FRCT            ;允许小数乘法
** -- ** -- **-- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **
** 输入数据位码倒置:
** AR0 : 位反转寻址索引
** AR2 : 以位反转顺序指向已处理的数据
** AR3 : 指向原始输入数据
** AR7 : 数据的起始地址
**
**
**
** -- ** -- **-- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **
            STM		#DATA,AR7
            RPT     #255
            ST      #0,*AR7+
			STM 	#2*N,BK         ;
			STM		#INPUT,AR3      ; AR3指向第一个输入数据
			STM		#DATA,AR7       ; AR7中存储数据的起始地址
			MVMM	AR7,AR2         ; AR2指向第一个被处理的数据
			STM		#N-1,BRC   ;BRC : 块循环计数器
			RPTBD	plend-1 
			STM 	#N,AR0          ; AR0赋值为循环缓冲器大小的一半
			LDM 	AR3,A           ; 
			READA   *AR2+           
; transfers data from program-memory location specified by
; accumulator A to a data-memory location specififed by  Smem
			ADD     #1,A 
			READA   *AR2+ 
			MAR		*AR3+0B         ; 位反寻址
plend:
** -- ** -- **-- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **
**                         碟形运算
**
**
**
** -- ** -- **-- ** -- ** -- ** -- ** -- ** -- ** -- ** -- **
			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:	 
power:		STM 	#OUTPUT,AR3			;AR3指向输出缓冲地址 
        	STM 	#255,BRC			;块循环计数器设置为255 
        	RPTBD 	power_end-1			;带延迟方式的重复执行指令 
       		STM 	#DATA,AR2			;AR2指向AR[0] 
        	SQUR	*AR2+,A				;A := AR2 
        	SQURA 	*AR2+,A				;A := AR2 + AI2 
        	STH 	A,7,*AR3			;将A中的数据存入输出缓冲中, 
        	ANDM	#7FFFH,*AR3+		;避免输出数据过大在虚拟示波器中显示错误 
power_end: 	B		power_end	 
     		.end
************************************* 
*Radix-2,DIT,Real-input FFT Program * 
*            fft.asm             * 
*************************************

⌨️ 快捷键说明

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