DSP指令功能与程序设计

指令功能与程序设计实验

实验目的
  1、 熟悉开发软件的使用,了解程序的完整的调试过程;
  2、 掌握DSP汇编语言编程及调试方法。

  实验要求
  
按照下面的实验内容建立新工程,调试程序,并验证结果。

  一、定点除法

  在通用DSP芯片中,一般不提供单周期的除法指令,为此必须采用除法子程序来实现。二进制除法是乘法的逆运算。乘法包括一系列的移位和加法,而除法可分解为一系列的减法和移位。下面来说明除法的实现过程。

  设累加器为8位,且除法运算为10除以3。除的过程就是除数逐步移位并与被除数比较的过程,如果能减则将位插入商中。

  (1) 除数的最低有效位对齐被除数的最高有效位。

00001010

- 00011000

11110010

  (2) 由于减法结果为负,放弃减法结果,将被除数左移一位再减。

00010100

- 00011000

11111000

  (3) 结果仍为负,放弃减法结果,被除数左移一位再减。

00101000

- 00011000

00010000

  (4) 结果为正,将减法结果左移一位后加1,作最后一次减。

00100001

- 00011000

00001001

  (5) 结果为正,将结果左移一位加1得最后结果。高4位代表余数,低4位表示商。

00010011

  即商为0011=3,余数为0001=1。

  TMS320没有专门的除法指令,但使用条件减指令SUBC可以完成有效灵活的除法功能。使用这一指令的唯一限制是两个操作数必须为正。程序员必须事先了解其可能的运算数的特性,如其商是否可以用小数表示及商的精度是否可被计算出来。这里每一种考虑可影响如何使用SUBC指令的问题。下面给出两种不同情况下的除法程序。
  (1) 分子小于分母

;=================================================

  分子小于分母除法

  文件名DIV_A.ASM

;=================================================

  title "DIV_A"

  include "vectors.h"

  def _c_int0

  bss NUMERA,1

  bss DENOM,1

  bss TEMSGN,1

  bss QUOT,1

  _c_int0: LDP #6H

  LT NUMERA

  MPY DENOM

  PAC

  SACH TEMSGN ;取商的符号

  LAC DENOM

  ABS

  SACL DENOM ;使分母为正

  ZALH NUMERA ;使分子为正

  ABS

  RPTK 14

  SUBC DENOM ;除循环15次

  SACL QUOT

  LAC TEMSGN

  BGEZ DONE ;若符号为正,则完成

  ZAC

  SUB QUOT

  SACL QUOT ;若为负,则商为负

  DONE: B DONE

  PHANTOM: RET

  .end

  这个程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN为暂存单元。

  (2) 分子大于分母,规定商的精度

;===========================================

  ;文件名DIV_B.ASM

;===========================================

  .title "DIV_B"

  .include "vectors.h"

  .def _c_int0

  .bss NUMERA,1

  .bss DENOM,1

  .bss TEMSGN,1

  .bss QUOT,1

  .bss FRAC,1

  FRAC .set 0ch ;规定商的精度

  _c_int0:

  LDP #6H

  LT NUMERA

  MPY DENOM

  PAC

  SACH TEMSGN ;取商的符号

  LAC DENOM

  ABS

  SACL DENOM ;使分母为正

  LACK 15

  ADD FRAC

  SACL FRAC ;计算循环计数器

  LAC NUMERA

  ABS ;使分子为正

  RPT FRAC

  SUBC DENOM ;除循环16+FRAC次

  SACL QUOT

  LAC TEMSGN

  BGEZ DONE ;若符号为正,则完成

  ZAC

  SUB QUOT

  SACL QUOT ;若为负,则商为负

  DONE: B DONE

  PHANTOM: RET

  .end

  与DIV_A相同,这个程序中,分子在NUMERA中,分母在DENOM中,商存在QUOT中,TEMSGN为暂存单元。FRAC中规定商的精度,如商的精度为Q13,则调用程序前FRAC单元中的值应为13。

  二、采用查表和线性插值法求正弦值

  采用查表和线性插值法求正弦值。以下给出线性插值的图形和具体的算式。

  图3-1 线性插值法

  计算一个角度的正弦值

  输入:0~360角度值(对应0H~FFFFH)存放在内部300H单元;输出:SIN(角度)*32767,格式Q15,存放在301H单元。

;========================================

  ; 文件名sine.asm

;========================================

  .include "F2407REGS.H"

  .mmregs

  .def SIN

  .def _ c_int0

  .sect "vectors"

  .bss angle,1

  .bss RESULT,1

  b _c_int0

;=========================================

  ;主程序

;========================================

.text

  _c_int0:

  .

  .

  LAR AR1,#60H

  MAR *,AR1

  LACC #4000H ;π/2

  SACL *+

  CALL SIN

  b $

;===================================================

  ;SINE子程序

  ;输入:0~360角度值(对应0H~FFFFH)存放在内部300H单元

  ;输出:SIN(角度)*32767,格式Q15,存放在301H单元

;==================================================

  SIN

  LDP #6H

  LT angle ;取变量 (x)

  MAR *+

  LACC #64H

  SACL *

  MPYU * ;

  PAC

  SACH *+

  SACL *

  LACC *,15

  AND #0FFFFH,15

  SACH *-

  BCND equal_sin,eq

  LACC #Table_sin ;表格的其始地址

  ADD *-

  TBLR *+ ;yi

  ADD #1H

  TBLR * ;装载yi+1的值

  LACC *-

  SUB *+ ;yi+1-yi

  SACL *+

  LT *-

  MPY *

  SPH *- ;在yi+1和yi之间插值

  LACC *+

  ADD *,1

  LDP #6H

  SACL RESULT ;存结果

  RET

  equal_sin

  LACC #Table_sin ;表格的其始地址

  ADD *- ;指向表格的索引的地址

  TBLR *

  LACC *+

  LDP #6H

  SACL RESULT ;存结果

  end_interp_sin

  RET

  Table_sin .include "sine.tab"

  Table_sin_end

.end

  sine.tab

;====================================================

  ;Table_sin

;====================================================

.word 0

.word 2057

.word 4107

.word 6140

.word 8149

.word 10126

.word 12062

.word 13952

.word 15786

.word 17557

.word 19260

.word 20886

.word 22431

.word 23886

.word 25247

.word 26509

.word 27666

.word 28714

.word 29648

.word 30466

.word 31163

.word 31738

.word 32187

.word 32509

.word 32702

.word 32767

.word 32702

.word 32509

.word 32187

.word 31738

.word 31163

.word 30466

.word 29648

.word 28714

.word 27666

.word 26509

.word 25247

.word 23886

.word 22431

.word 20886

.word 19260

.word 17557

.word 15786

.word 13952

.word 12062

.word 10126

.word 8149

.word 6140

.word 4107

.word 2057

.word 0

.word -2057

.word -4107

.word -6140

.word -8149

.word -10126

.word -12062

.word -13952

.word -15786

.word -17557

.word -19260

.word -20886

.word -22431

.word -23886

.word -25247

.word -26509

.word -27666

.word -28714

.word -29648

.word -30466

.word -31163

.word -31738

.word -32187

.word -32509

.word -32702

.word -32767

.word -32702

.word -32509

.word -32187

.word -31738

.word -31163

.word -30466

.word -29648

.word -28714

.word -27666

.word -26509

.word -25247

.word -23886

.word -22431

.word -20886

.word -19260

.word -17557

.word -15786

.word -13952

.word -12062

.word -10126

.word -8149

.word -6140

.word -4107

. word -2057

  三、 FIR滤波器的定点DSP实现

  TMS320定点DSP芯片所提供的单周期乘/累加带数据移动指令和较大的片内RAM空间,使数字滤波器每个滤波样值的计算可以在一个周期内完成。TMS320LF2407内部具有三个片内的DARAM,分为B0、B1和B2三块。其中B0块(256字)可以用软件编程为数据区(CNFD)或程序区(CNFP),执行CNFP后,B0块映射到程序区的FF00H~FFFFH。采用高效的MACD指令,必须用片内RAM,其中B0块必须配置为程序区。

  采用MACD指令结合RPTK指令就可以实现单周期的滤波样值计算:

   RPTK N-1

   MACD(程序地址),(数据地址)

  其中,RPTK N-1指令将立即数N-1(要求不大于255)装入到重复计数器,使下一条指令重复执行N次。MACD指令实现下列功能:

  (1)将程序在储器地址装入到程序计数器;(2)将存于数据区(B1块)的数据乘以程序区(B0块)的数据;(3)将上次的乘积加到累加器;(4)移动数据,将B1块中的数据向高地址移动一个地址;(5)每次累加后,程序计数器加1,指向下一个单位脉冲响应样值。

  为了使用MACD指令,输入样值x(n)和滤波器系数h(n)必须合理地进行存放。图3.2是输入样值x(n)和滤波器系数h(n)在TMS320LF2407内存中的一种存放方法,以下是高效实现FIR滤波方程的汇编程序。

  B0块 B1块

FF00H

h(N-1)

 

x(n)

 

x(n-1)

 

3FFH

 

h(1)

 

h(0)

x[n-(N-1)

 

 

图3.2 TMS320LF2407的存储器组织方法

;N阶FIR滤波的TMS320LF2407程序

;y(n)=x(n-(N-1))h(N-1)+x(n-(N-2))h(N-2)+…+x(n)h(n)

CNFP ;B0块配置为程序区

   NEXT IN XN,PA0 ;从PA0口取一个样值

LARP AR1

LRLK AR1,3FFH ;AR1指向B1块的底部

MPYK 0 ;P寄存器清零

ZAC ;ACC清零

RPTK N-1 ;重复N-1次

MACD FF00H,*- ;乘/累加

APAC

SACH YN,1

OUT YN,PA1 ;输出滤波器响应y(n)至PA1口

B NEXT ;做下一点滤波

  移序说明:

  (1)FIR滤波器系数h(0),…,h(N-1)均小于1,可用Q15表示;

  (2)输入待滤波样值从PA0口得到,直接送到x(n)对应的存储单元;

  (3)滤波后的样值由SACH YN,1指令送至YN存储单元。由于滤波器系数用Q15表示,因此乘累加后在ACC中的值也是Q15,左移1位并取高16位后得到的数应与输入的样值具有相同的Q值了;

  (4)滤波后的样值在PA1口输出;

  (5)一点滤波结束后,由于MACD指令的作用,所有的输入样值均向高地址移动一个位置,即x[n-(N-2)]移动到x[n-(N-1) ]的位置,x[n-(N-3)]移动到x[n-(N-2)]位置,……,x(n)移动到x(n-1)的位置,从而为下一点滤波做好准备。

  四、IIR滤波器的定点DSP实现

  在IIR滤波器结构中,直接II型结构是最常用的滤波器结构,因为这种结构的二阶形式可作为有级联型和并联型结构中的基本节。二阶直接II型结构IIR滤波器如图3.3所示。

  图3.3 二阶直接II型IIR滤波器

  二阶直接II型结构滤波器的差分方程为:

d(n)=x(n)+a1d(n-1)+a2d(n-2)

y(n)=b0d(n)+b1d(n-1)+b2d(n-2)

  式中,d(n)、d(n-1)、d(n-2)对应于图中具有不同延迟的中间节点值。以下是实现二阶直接II型IIR滤波器的汇编程序。

  本程序实现一个二阶直接II型IIR滤波器

  NEXT IN XN,PA0;从PA0口输入一个样值

  LAC XN,15 ;ACC=x(n)

  LT DN1 ;T=d(n-1)

  MPY A1 ;P=a1*d(n-1)

  LTA DN2 ;ACC=x(n)+a1*d(n-1),T=d(n-2)

  MPY A2 ;P=a2*d(n-2)

  APAC ;ACC=x(n)+a1*d(n-1)+a2*d(n-2)

  SACH DN,1 ;d(n)=x(n)+a1*d(n-1)+a2*d(n-2)

  ZAC ;ACC=0

  MPY B2 ;P=b2*d(n-2)

  LTD DN1 ;T=d(n-1),ACC=b2*d(n-2),d(n-2)=d(n-1)

  MPY B1 ;P=b1*d(n-1)

  LTD DN ;T=d(n), ACC=b2*d(n-1)+b1*d(n-1),d(n-1)=d(n)

  MPY B0 ;p=b0*d(n)

  APAC ;ACC=b2*d(n-2)+b1*d(n-1)+b0*d(n)

  SACH YN,1 ;y(n)=b0*d(n)+b1*d(n-1)+b0*d(n)

  OUT YN,PA1 ;输出滤波样值至PA1口

  B NEXT

  程序说明:

  (1)在这个例子中,DN、DN1和DN2分别是二阶基本节中三个中间延迟节点d(n)、d(n-1)和d(n-2)的存储器单元,三个存储单元占据三个连续的存储空间,DN在低地址,DN2在高地址,DN1在中间。这是为了保证连续滤波时d(n)、d(n-1)、d(n-2)三个中间结果正确的存储位置。一点滤波结束后,由于LTD指令的作用,d(n)移动到d(n-1)、d(n-1)移动到d(n-2),为下一点滤波做好准备。

  (2)A1、A2和B0、B1、B2分别是滤波器系数a1、a2和b0、b1、b2对应的存储单元;

  (3)XN为新输入样值x(n)的存储单元,YN为滤波后输出样值y(n)对应的存储单元;

  (4)滤波器的五个滤波器系数均小于1,用Q15表示;

  (5)滤波器的输入样值从PA0口输入,LAC XN,15指令将输入样值x(n)左移15位后送入累加器ACC,这是为了与下面乘积相加时保证小数点对齐;

  (6)SACH DN,1和SACH YN,1指令将ACC中的值左移1位,并将高16位存入d(n)和y(n)。假设x(n)的Q值为0,左移15位后送入ACC,相当于Q15,与乘积相加后的值也为Q15。左移1位相当于得到Q 16的数,而将高16位直接存入d(n)和y(n)又相当于将结果右移16位。因此d(n)和y(n)的Q值又变为0,从而与x(n)的Q值一致。

  五、 PID算法实验

  程序的入口参数:参考量Vref,测量值V;

  程序的出口参数:t=kT时的控制量u(k);

  程序中用到的资源:PID的三个参数Kp、Ki、Kd,t=(k-1)T时的控制量u(k-1),t=(k-2)T、t=(k-1)T、t=kT时的误差e(k-2)、e(k-1)、e(k),VCC、SXM、TREG、PREG以及三个临时单元PIDTMP1、PIDTMP2、PIDTMP3;

  说明:程序中用到的参数规格化格式在程序注释栏中标明,如Q15×32表示该参数是被规格化为Q15格式值乘以32得到。

;=====================================================

  ;文件名:PID.asm

;======================================================?

  .title "PID"

  .include "vectors.h"

  .def _c_int0

  .bss V,1

  .bss VE2,1

  .bss VE1,1

  .bss VE0,1

  .bss PIDTMP1,1

  .bss PIDTMP2,1

  .bss PIDTMP3,1

  .bss KP,1

  .bss KI,1

  .bss KD,1

  .bss U,1

  VREF .set 00FFh

  _c_int0: LDP #4H ;数据页4 200h~0280h

  SETC SXM ;允许符号扩展  

  LACL VREF ;Vref,Q.15*256

  SUB V ;V,Q.15*256

  SACL VE2 ;e(k)= Vref-V,Q15*256

  SUB VE1 ;e(k-1),Q15*256

  SACL PIDTMP1 ;Delta(e(k))=e(k)-e(k-1),Q15/256

  SUB VE1

  ADD VE0 ;e(k-2),Q15*256

  SACL PIDTMP3 ;Delta(e(k)) -Delta(e(k-1))= e(k)-2e(k-1)+e(k-2)

   ;Q15*256

  LT KP ;Kp,Q15*32

  MPY PIDTMP1

  PAC ;Kp*Delta(e(k)),Q30*8192

  RPT #4

  SFL ;Kp*Delta(e(k)),Q30*256

  SACH PIDTMP1,1 ;Kp*Delta(e(k)),Q15*256

  LT KI ;Ki,Q15*32

  MPY VE2

  PAC ;Ki*e(k),Q30*8192

  RPT #4

  SFL ;Ki*e(k),Q30*256

  SACH PIDTMP2,1 ;Ki*e(k),Q15*256

  LT KD ;Kd,Q15*32

  MPY PIDTMP3

  PAC ;Kd* Delta(e(k))-Delta(e(k-1)),Q30*8192

  RPT #4

  SFL ;Kd* Delta(e(k))-Delta(e(k-1)),Q30*256

  SACH PIDTMP3,1 ;Kd* Delta(e(k))-Delta(e(k-1)),Q15*256

  LACL U ;u(k-1),Q15*256

  ADD PIDTMP1

  ADD PIDTMP2

  ADD PIDTMP3

  SACL U ;u(k),Q15*256

  SUB #4B00H ;150V,Q15*256

  BCND PID1,LEQ

  SPLK #4A3DH,U ;上限幅

  B PID2

  PID1: BIT U,0

  BCND PID2,NTC

  SPLK #0,U ;下限幅

  PID2: LACL VE1 ;平移保存

  SACL VE0 ;e(k-2)=e(k-1)

  LACL VE2

  SACL VE1 ;e(k-1)=e(k)

  DONE: B DONE

  

  PHANTOM: RET

.end

  六FFT的定点DSP实现

  基2的DIT FFT的蝶形如下图

  图3-4 基2的DIT FFT的蝶形运算

  考虑N点FFT第m级的基2碟形,输出可以表示为:

  KN Pm+1=Pm+ W Q

  kN Qm+1=Pm- W Qm

  这里,Pm和Qm是输入,Pm+1和Qm+1是输出。一般的,Pm,Qm,Pm+1和Qm+1与蝶形因子一样是复数。蝶形因子可以表示为:

  KN W =e-j(2π/N)k=cos(x)-jsin(x)

  式中,X=(2π/N)k。这样Pm和Qm可以用实部和虚部表示为:

  Pm=PR+jPI

  Qm=QR+jQI

  由上两式可得:

  Pm+1=PR+ jPI+[QRcos(x)+QIsin(x)]+j[QIcos(x)-QRsin(x)]

  =[PR+QRcos(x)+QIsin(x)]+j[PI+QIcos(x)-QRsin(x)]

  Qm+1=PR+ jPI-[QRcos(x)+QIsin(x)]-j[QIcos(x)-QRsin(x) ]

  =[PR-QRcos(x)-QIsin(x)+j[PI-QIcos(x)+QRsin(x) ]

  假设每个蝶形的输入用Q15表示,幅度小于1,则上式输出的最大幅度为

  1+ 1sin(45°)+1cos(45°)=2.414213562

  为了避免溢出,可在FFT的每一级用因子2.414213562进行归一化。但是,每一级用这样的一个因子归一化势必增加运算量。考虑到大多数情况属是实数FFT,最大幅度不超过2,因此可在每一级用因子2进行归一化。运用DSP芯片的移位特性,用2归一化不增加任何运算量。这样,如果FFT包含M级,则输出相当于除以2M=N,其中N为FFT的长度。

  FFT的运算时间往往被用来衡量DSP芯片性能的一个重要指标,因此,提高FFT的运算速度也是非常重要的。在用DSP芯片实现FFT算法时,应充分利用DSP芯片所提供的各种软硬件资源。例如对于TMS320LF2407,可供利用的一些资源包括:(1)片内RAM,片内B0和B1块可以实现256点复数FFT;(2)比特反转寻址方式,这种寻址方式是专门为FFT运算提供的。

  下面是一个8~256点基2复数FFT的TMS320 LF2407汇编程序。

  程序说明:

  (1)数据页指针DP=0

  (2)用到的寄存器:AR0、AR1、AR2、AR3

  (3)输入参数:N、M、WKAD、NOM

  其中,N=FFT的点数,M=Log2(N),WKAD为系数的存放地址;

  32点FFT:N=32,M=5,WKAD=WK32;

  64点FFT:N=64,M=6,WKAD=WK64;

  128点FFT:N=128,M=7,WKAD=WK128;

  256点FFT:N=256,M=8,WKAD=WK256;

  NOM:控制FFT运算是否进行归一化

  (4)调用FFT子程序前输入数据已经存放在INDATR、INDATI,存放顺序为:

  实部:在INDATR,按顺序存放

  虚部:在INDATI,按顺序存放

  .title "fft"

  .include "vectors.h"

  .global _c_int0

  INPUT .equ 200h ;FFT运算时输入数据的位置

  INDATR .equ 9000h ;输入数据实部存放地址

  INDATI .equ 9100h ;输入数据虚存放地址

  SINTAB .equ 9200h ;系数表在内存中的地址

  ;内部存储器定义:

  N .equ 118 ;FFT点数

  M .equ 119 ;pow(2,M)=N

  WKAD .equ 120 ;系数的起始地址

  NOM .equ 121 ;归一化(0),不归一化(1)

  IW .equ 122 ;系数增量

  XT .equ 123 ;暂存

  YT .equ 124 ;暂存

  ID .equ 125 ;DISTANT BETWEEN 2 COMPUTING DATAS

  C1 .equ 126 ;循环计数器

  C2 .equ 127 ;循环计算器

   .text

  _c_int0:

  LDP #0H

  SETC INTM

  LALK 256

  SACL N

  LACK 8

  SACL M

  LACK 0

  SACL NOM

  LALK WK256

  LRLK AR1,SINTAB

  RPTK 255

  TBLR *+,AR1 ;将系数表调入SINTAB开始的RAM中

  CALL FFT ;作FFT运算

  HERE: B HERE

  ;以下是FFT子程序

  FFT: LDP 0

  LACC M

  SUBK 1

  SACL M ;M=M-1

  LARP AR1

  LALK SINTAB

  SACL WKAD

  FFT1: LAR AR0,N

  LAC N

  SUBK 1

  SACL N ;N=N-1

  LARP AR1

  ;将输入数据调入片内RAM,存放顺序为:实部、虚部;实部、虚部;……

  LRLK AR2,INPUT

  LRLK AR1,INDATR

  LAR AR3,N

  MF1: LAC *+,0,AR1

  SACL *BR0+,0,AR3

  BANZ MF1,*-,AR2

  LRLK AR1,INDATI

  LAR AR3,N

  MF2: LAC *+,0,AR1

  SACL *BR0+,0,AR3

  BANZ MF2,*-,AR2

  SOVM

  SSXM ;符号扩展

  SPM 1 ;结果左移一位

  LACK 1

  SACL ID ;ID=1

  LAC N

  ADDK 1

  SACL IW,1 ;IW=2*N

  LAR AR2,M

  LOOP3: LRLK AR1,INPUT ;AR1=INPUT P.X

  LAC ID,1

  SACL ID ;ID=2*ID=2

  LAC IW ;IW=IW/2=N

  LAC IW,15

  SACH C2 ;C2=IW/2=N/2

  LAR AR0,ID

  LOOP2: LAR AR3,WKAD ;AR3指向WK的起始地址

  LAC ID,15

  SACH C1 ;C1=ID/2=1

  MAR *0+,AR3 ; AR1=AR1+D→Q.X

  LOOP1: ZAC

  LT *+,AR1

  MPY *+,AR3

  LT *,AR1

  MPYA *-,AR3

  SPAC

  SACH XT ;XT=Q.X*COS-Q.Y*SIN

  ZAC

  LT *-,AR1

  MPY *+,AR3

  LT *,AR1

  MPYA *-

  APAC

  SACH YT ;YT=Q.X*SIN+Q.Y*COS

  LAC NOM

  BNZ D2 ;IF NOM=1 归一化

  *********A_BEGIN ************ ;else 不归一化

  MAR *0- ;(AR1)=P.X

  LAC *

  ADD XT

  SACL *0+ ;P.X=XT+P.X

  SUB XT,1

  SACL *+ ;Q.X=P.X-XT;(AR1)=Q.Y

  MAR *0- ;(AR1)=P.Y

  LAC *

  ADD YT

  SACL *0+ ;P.Y+YT

  SUB YT,1

  SACL *+,0,AR3 ;Q.Y=P.Y-YT

  B D ;(AR1)=Q.Y+1→NEXT Q.X

  ********A_END************

  ********B_BEGIN**********

  D2: MAR *0- ;(AR1)=P.X

  LAC *,15

  ADD XT,15

  SACH *0+ ;P.X=(XT+P.X)/2

  SUBH XT

  SACH *+ ;Q.X=(P.X-XT)/2;(AR1)=Q.Y

  MAR *0- ;(AR1)=P.Y

  LAC *,15

  ADD YT,15

  SACH *0+ ;P.Y=(P.Y+YT)/2

  SUBH YT

  SACH *+,0,AR3 ;Q.Y=*(P.Y-YT)/2

   ;(AR1)=Q.Y+1→NEXT Q.X

  ****** B_END ******

  D: LAR AR0,IW

  MAR *0+ ;(AR3)=(AR3)+IW→WK.COS

  LAR AR0,ID ;(AR0)=ID

  LAC C1

  SUBK 1

  SACL C1 ;C1=C1-1

  BGZ LOOP1

  LAC C2

  SUBK 1

  SACL C2 ;C2=C2-1

  BGZ LOOP2

  LARP AR2

  BANZ LOOP3,*-,AR1

  RET

  ;上述程序中,当NOM为1时,FFT运算进行归一化,否则不进行归一化。其中,A_BEGIN到A_END之间的程序为不需要归一化的程序,而B_BEGIN到B_END之间的程序为需要归一化的程序。FFT的运算结果在200H~(200H+2*N-1)的片内

  ;以下是8点~256点FFT系数表,存放顺序为cos,sin;cos;cos,sin;…

.data

  WK8 .equ $

  .word 07fffh,00h,05a82h,0a57eh,00h,08001h,0a57eh,0a57eh

  WK16 .equ $

.word 07fffh,00h,07642h,0cf05h,05a82h,0a57eh,030fch,089bfh

.word 00h,08001h,0cf04h,089bfh,0a57eh,0a57eh,089beh,0cf05h

  WK32 .equ $

.word 07fffh,00h,07d8ah,0e708h,07642h,0cf05h,06a6eh,0b8e4h

.word 05a82h,0a57eh,0471dh,09593h,030fch,089bfh,018f9h,08276h

.word 00h,08001h,0e707h,08276h,0cf04h,089bfh,0b8e3h,09593h

.word 0a57eh,0a57eh,09592h,0b8e4h,089beh,0cf05h,08276h,0e708h

  WK64 .equ $

.word 07fffh,00h,07f62h,0f375h,07d8ah,0e708h,07a7dh,0dad8h

.word 07642h,0cf05h,070e3h,0c3aah,06a6eh,0b8e4h,062f2h,0aecdh

.word 05a82h,0a57eh,05134h,09d0eh,0471dh,09593h,03c57h,08f1eh

.word 030fch,089bfh,02528h,08583h,018f9h,08276h,0c8ch,0809eh

.word 00h,08001h,0f374h,0809eh,0e707h,08276h,0dad8h,08583h

.word 0cf04h,089bfh,0c3a9h,08f1eh,0b8e3h,09593h,0aecch,09d0eh

.word 0a57eh,0a57eh,09d0eh,0aecdh,09592h,0b8e4h,08f1dh,0c3aah

.word 089beh,0cf05h,08583h,0dad8h,08276h,0e708h,0809eh,0f375h

  WK128 .equ $

.word 07fffh,00h,07fd9h,0f9b9h,07f62h,0f375h,07e9dh,0ed38h

.word 07d8ah,0e708h,07c2ah,0e0e7h,07a7dh,0dad8h,07885h,0d4e1h

.word 07642h,0cf05h,073b6h,0c946h,070e3h,0c3aah,06dcah,0be32h

.word 06a6eh,0b8e4h,066d0h,0b3c1h,062f2h,0aecdh,05ed7h,0aa0bh

.word 05a82h,0a57eh,055f6h,0a129h,05134h,09d0eh,04c40h,09931h

.word 0471dh,09593h,041ceh,09236h,03c57h,08f1eh,036bah,08c4bh

.word 030fch,089bfh,02b1fh,0877ch,02528h,08583h,01f1ah,083d7h

.word 018f9h,08276h,012c8h,08163h,0c8ch,0809eh,0648h,08028h

.word 00h,08001h,0f9b8h,08028h,0f374h,0809eh,0ed38h,08163h

.word 0e707h,08276h,0e0e6h,083d7h,0dad8h,08583h,0d4e1h,0877ch

.word 0cf04h,089bfh,0c946h,08c4bh,0c3a9h,08f1eh,0be32h,09236h

.word 0b8e3h,09593h,0b3c0h,09931h,0aecch,09d0eh,0aa0ah,0a129h

.word 0a57eh,0a57eh,0a129h,0aa0bh,09d0eh,0aecdh,09930h,0b3c1h

.word 09592h,0b8e4h,09236h,0be32h,08f1dh,0c3aah,08c4ah,0c946h

.word 089beh,0cf05h,0877bh,0d4e1h,08583h,0dad8h,083d6h,0e0e7h

.word 08276h,0e708h,08163h,0ed38h,0809eh,0f375h,08027h,0fb9h

  WK256 .equ $

.word 07fffh,00h,07ff6h,0fcdch,07fd9h,0f9b9h,07fa7h,0f69h

.word 07f62h,0f375h,07f0ah,0f055h,07e9dh,0ed38h,07e1eh,0ea1eh

.word 07d8ah,0e708h,07ce4h,0e3f5h,07c2ah,0e0e7h,07b5dh,0ddddh

.word 07a7dh,0dad8h,0798ah,0d7dah,07885h,0d4e1h,0776ch,0d1efh

.word 07642h,0cf05h,07505h,0cc22h,073b6h,0c946h,07255h,0c674h

.word 070e3h,0c3aah,06f5fh,0c0e9h,06dcah,0be32h,06c24h,0bb86h

.word 06a6eh,0b8e4h,068a7h,0b64ch,066d0h,0b3c1h,064e9h,0b141h

.word 062f2h,0aecdh,060ech,0ac65h,05ed7h,0aa0bh,05cb4h,0a7beh

.word 05a82h,0a57eh,05843h,0a34ch,055f6h,0a129h,0539bh,09f14h

.word 05134h,09d0eh,04ec0h,09b18h,04c40h,09931h,049b4h,0975ah

.word 0471dh,09593h,0447bh,093dch,041ceh,09236h,03f17h,090a1h

.word 03c57h,08f1eh,0398dh,08dabh,036bah,08c4bh,033dfh,08afch

.word 030fch,089bfh,02e11h,08894h,02b1fh,0877ch,02827h,08676h

.word 02528h,08583h,02224h,084a3h,01f1ah,083d7h,01c0ch,0831dh

.word 018f9h,08276h,015e2h,081e3h,012c8h,08163h,0fabh,080f7h

.word 0c8ch,0809eh,096bh,08059h,0648h,08028h,0324h,0800ah

.word 00h,08001h,0fcdch,0800ah,0f9b8h,08028h,0f695h,08059h

.word 0f374h,0809eh,0f055h,080f7h,0ed38h,08163h,0ea1eh,081e3h

.word 0e707h,08276h,0e3f4h,0831dh,0e0e6h,083d7h,0dddch,084a3h

.word 0dad8h,08583h,0d7d9h,08676h,0d4e1h,0877ch,0d1efh,08894h

.word 0cf04h,089bfh,0cc21h,08afch,0c946h,08c4bh,0c673h,08dabh

.word 0c3a9h,08f1eh,0c0e9h,090a1h,0be32h,09236h,0bb85h,093dch

.word 0b8e3h,09593h,0b64ch,0975ah,0b3c0h,09931h,0b140h,09b18h

.word 0aecch,09d0eh,0ac65h,09f14h,0aa0ah,0a129h,0a7bdh,0a34ch

.word 0a57eh,0a57eh,0a34ch,0a7beh,0a129h,0aa0bh,09f14h,0ac65h

.word 09d0eh,0aecdh,09b17h,0b141h,09930h,0b3c1h,09759h,0b64ch

.word 09592h,0b8e4h,093dch,0bb86h,09236h,0be32h,090a1h,0c0e9h

.word 08f1dh,0c3aah,08dabh,0c674h,08c4ah,0c946h,08afbh,0cc22h

.word 089beh,0cf05h,08894h,0d1efh,0877bh,0d4e1h,08676h,0d7dah

.word 08583h,0dad8h,084a3h,0ddddh,083d6h,0e0e7h,0831ch,0e3f5h

.word 08276h,0e708h,081e2h,0ea1eh,08163h,0ed38h,080f6h,0f055h

.word 0809eh,0f375h,08059h,0f696h,08027h,0f9b9h,0800ah,0fcdch

  PHANTOM RET

.end

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值