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

📄 mtd_16.asm

📁 Tiger sharec系列DSP的短点FFT代码(4,6,8,16点FFT),全汇编实现,将DSP的性能发挥到极致,在超高实时要求应用下有意义.
💻 ASM
字号:
//////////////////////////////////////////////
//调用程序时注意原始数据和输出数据,旋转因子和buff的section分配,不同的分配可能造成执行
//的相关而产生延时降低了效率.
//一次加海明权的16点FFT,时钟为69个.
//程序中buff可以和input共用
#include "TS101_def.h"
.section M1DATA;
.align 4;
.var fft16Result[32]; 
.var win[32]="win32.dat";
.var twid[16]="twid16.dat";
.section M2DATA;
.align 4;
.var fft16input[32]="fft16input.dat";
.var buff[32];
.section M0CODE;
.global _main;
_main: 
		k0=fft16input;;
		j0=win;;//win存放的section不能和输入数据同一
		j1=fft16Result;;
		j2=j1+16;;
		j3=buff;;//j3,j4,j5,k2,k3,k4的值在程序中被修改,但最后都返回了初始值,为下一次的循环做好了准备
		j4=j3+16;;
		j5=j3;;
		k2=twid;;//不和buff放在同一section
		k3=k2+4;;//读W2
		k4=k2+12;;//读W6
		yr1:0=l[k0+=2]; yr17:16=l[j0+=2];;        //yr0=real[x(0)],yr1=imag[x(0)];//这里的k0+=2的2表示了读数据的步进量
        xr1:0=l[k0+=2]; xr17:16=l[j0+=2];;        //xr0=real[x(1)],xr1=imag[x(1)];
        yr9:8=l[k0+=2]; yr19:18=l[j0+=2];;        //yr8=real[x(2)],yr9=imag[x(2)]
        xr9:8=l[k0+=2]; xr19:18=l[j0+=2]; fr0=r0*r16;;//xr8=real[x(3)],yr9=imag[x(3)]
        yr5:4=l[k0+=2]; yr21:20=l[j0+=2]; fr1=r1*r17;;//yr4=real[x(4)],yr5=imag[x(4)];
        xr5:4=l[k0+=2]; xr21:20=l[j0+=2]; fr8=r8*r18;;//xr4=real[x(5)],xr5=imag[x(5)]
        yr13:12=l[k0+=2];yr23:22=l[j0+=2]; fr9=r9*r19;;//yr12=real[x(6)],yr13=imag[x(6)]
        xr13:12=l[k0+=2];xr23:22=l[j0+=2]; fr4=r4*r20;;//xr12=real[x(7)],xr13=imag[x(7)]
        yr3:2=l[k0+=2]; yr25:24=l[j0+=2]; fr5=r5*r21;;//yr2=real[x(8)],yr3=imag[x(8)];
        xr3:2=l[k0+=2]; xr25:24=l[j0+=2]; fr12=r12*r22;;//xr2=real[x(9)],xr3=imag[x(9)];
        yr11:10=l[k0+=2];yr17:16=l[j0+=2]; fr13=r13*r23;;//yr10=real[x(10)],yr11=imag[x(10)]
        xr11:10=l[k0+=2];xr17:16=l[j0+=2]; fr2=r2*r24;;//xr10=real[x(11)],xr11=imag[x(11)]
        yr7:6=l[k0+=2]; yr19:18=l[j0+=2]; fr3=r3*r25;;//yr6=real[x(12)],yr7=imag[x(12)]
        xr7:6=l[k0+=2]; xr19:18=l[j0+=2]; fr10=r10*r16;;//xr6=real[x(13)],xr6=imag[x(13)]    
        yr15:14=l[k0+=2];yr27:26=l[j0+=2]; fr11=r11*r17;;//yr14=real[x(14)],yr15=imag[x(14)]
        xr15:14=l[k0+=2];xr27:26=l[j0+=-30]; fr6=r6*r18;;//xr14=real[x(15)],xr15=imag[x(15)]//j0指回win的开始处
        //一二级开始
        fr0=r0+r2, fr20=r0-r2;fr7=r7*r19;;
	    fr2=r1+r3, fr29=r1-r3;fr14=r14*r26;;
     	fr4=r4+r6, fr21=r4-r6;fr15=r15*r27;;
	    fr5=r5+r7, fr28=r5-r7;;
		fr18=r8+r10, fr22=r8-r10;;			
		fr19=r9+r11, fr31=r9-r11;;			
	    fr26=r12+r14, fr23=r12-r14;;						
	    fr27=r13+r15, fr30=r13-r15;;  
	    fr20=r20+r28, fr28=r20-r28;;						
		fr29=r29+r21, fr21=r29-r21;;						
		fr22=r22+r30, fr30=r22-r30;;
		fr31=r31+r23, fr23=r31-r23;;
		fr16=r0+r4, fr24=r0-r4;;
		fr17=r2+r5, fr25=r2-r5;;
		fr18=r18+r26, fr26=r18-r26;r11:10=l[k31+k3];;//读旋转因子W2到R11:10中
		fr19=r19+r27, fr27=r19-r27;;//1,2级完成
		/////第3级开始有一个W0,和W4,不用乘法,W2,W6要用乘法.
		fr0=r16+r18,fr8=r16-r18;fr2=r22*r10;;
		fr1=r17+r19,fr9=r17-r19;fr3=r23*r11;;
		fr4=r24+r27,fr12=r24-r27;fr14=r22*r11;r19:18=l[k31+k4];;//读W6
		fr13=r25+r26,fr5=r25-r26;fr15=r23*r10;;
		fr16=r2-r3;fr24=r30*r18;q[j3+=8]=r1:0;;
		fr17=r14+r15;fr27=r31*r19;q[j4+=8]=r9:8;;
		fr2=r20+r16,fr10=r20-r16;fr25=r30*r19;q[j3+=-4]=r5:4;;
		fr3=r21+r17,fr11=r21-r17;fr26=r31*r18;q[j4+=-4]=r13:12;;///W2旋转因子的蝶形运算完毕.
		///对W4进行计算
		fr19=r24-r27;q[j3+=8]=r3:2;yr5:4 = l[k2+=2];;//读W0
		fr18=r25+r26;q[j4+=8]=r11:10;xr5:4=l[k2+=2];;//读W1
		fr6=r28+r19,fr14=r28-r19;yr3:0=q[j5+=4];;//按yr0,yr1,yr2,yr3读数为最后一级服务
		fr7=r29+r18,fr15=r29-r18;xr3:0=q[j5+=4];;///W6旋转因子的蝶形运算完毕.
		q[j3+=-12]=r7:6;;
		q[j4+=-12]=r15:14;;
		////最后一级...第三级计算完成后数据按yr0(real),yr1(imag),xr0(real),yr1(imag)
		//yr2,yr3,xr2,xr3.....yr14,yr15,xr15,xr15
		//由于标准的FFT程序(AD公司提供,在3到log2(n)-1级时数据按yr0,yr1,xr0,xr1存放在
		//内存中,在最后一级时将这四个值从内存中按yr0,yr1,yr2,yr3读出                              		            
        yr11:8=q[j5+=4];  yr13:12=l[k2+=2]; fr6=r2*r4;;                                                         		
	    xr11:8=q[j5+=4];  xr13:12=l[k2+=2]; fr7=r3*r5;;                              			
        fr14=r2*r5;;                             		
	    fr6=r10*r12;  fr16=r6-r7;;               		
    	yr23:20=q[j5+=4]; yr5:4=l[k2+=2];   fr15=r3*r4;;                             		
	    xr23:20=q[j5+=4]; xr5:4=l[k2+=2];   fr7=r11*r13;;                            		
	    fr14=r10*r13; fr17=r14+r15;;             			
	    fr6=r22*r4;   fr18=r6-r7;;               		
   	    yr31:28=q[j5+=4]; yr13:12=l[k2+=2]; fr15=r11*r12; fr24=r0+r16, fr26=r0-r16;; 		
  	    xr31:28=q[j5+=-28]; xr13:12=l[k2+=-14]; fr7=r23*r5;   fr25=r1+r17, fr27=r1-r17;;//K2指回twid的开始处为下处的循环调用准备
        q[j1+=4]=r25:24; fr14=r22*r5;  fr19=r14+r15;;//最后结果放入
		q[j2+=4]=r27:26; fr6=r30*r12;  fr16=r6-r7;;                 	
		fr15=r23*r4;  fr24=r8+r18,  fr26=r8-r18;;  	
		fr7=r31*r13;  fr25=r9+r19,  fr27=r9-r19;;	
		q[j1+=4]=r25:24; fr14=r30*r13; fr17=r14+r15;;        	
		q[j2+=4]=r27:26; fr6=r2*r4; fr18=r6-r7;;            	
		fr15=r31*r12; fr24=r20+r16, fr26=r20-r16;;
		fr7=r3*r5; fr25=r21+r17, fr27=r21-r17;;
        q[j1+=4]=r25:24; fr14=r2*r5;   fr19=r14+r15;;               		
		q[j2+=4]=r27:26; fr6=r10*r12;  fr16=r6-r7;;                 	
        fr15=r3*r4;   fr24=r28+r18, fr26=r28-r18;;
	    fr7=r11*r13;  fr25=r29+r19, fr27=r29-r19;; 
		q[j1+=4]=r25:24;;
		q[j2+=4]=r27:26;;
		
_main.end:

⌨️ 快捷键说明

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