TMS320C54X语音信号去噪和编码系统:语音去噪的主程序

语音信号去噪和编码系统:语音去噪的主程序

*******************************************************************

基于TMS320C54X语音信号去噪和编码系统:语音去噪的主程序

硬件上以:TMS320C54X+TLC320AD50为主实现

*******************************************************************

   .mmregs
   .def main
   .def  ad50_data      
spsa0  .set  38h    ; 缓冲串口0子地址地址寄存器
spcd0  .set  39h    ; 缓冲串口0子地址数据寄存器
drr21  .set  40h    ; 缓冲串口1数据1接收寄存器
drr11  .set  41h    ; 缓冲串口1数据2接收寄存器
dxr21  .set  42h    ; 缓冲串口1数据2发送寄存器
dxr11  .set  43h    ; 缓冲串口1数据1发送寄存器
dxr10  .set  23h    ; 缓冲串口0数据1发送寄存器
drr10  .set  21h    ; 缓冲串口0数据1接收寄存器

spcr10   .set 00h   ; 设置缓冲串口的所有寄存器的子地址
spcr20  .set 01h
rcr10  .set 02h
rcr20  .set  03h
xcr10   .set 04h
xcr20  .set 05h
srgr10  .set 06h
srgr20  .set 07h
mcr10  .set 08h
mcr20  .set 09h
rcera0   .set 0ah
rcerb0  .set 0bh
xcera0  .set 0ch
xcerb0   .set 0dh
pcr0    .set 0eh
  
k_iptr  .set  000111000b<<07  ; 设置中断向量表的地址,指向0x1C00
k_temp  .set  1111111b

b1    .set  0557h   ; 滤波器的参数b1
b2    .set  1067h   ; 滤波器的参数b2
b3    .set  1067h   ; 滤波器的参数b3
b4    .set  0557h   ; 滤波器的参数b4

a1    .set  0EEFh   ; 滤波器的参数a1
a2    .set  10DCh   ; 滤波器的参数a2
a3    .set  0AF9h   ; 滤波器的参数a3

k_a    .set  3        ; 滤波器参数a的个数
k_b    .set  4        ; 滤波器参数b的个数
k_buffer  .set  8        ; 滤波器循环缓冲的大小

buffery  .usect "filter_vars",k_buffer*2    ; 定义滤波器数据输出缓冲区
bufferx  .usect "filter_vars",k_buffer*2    ; 定义滤波器数据输入缓冲区
data_dp  .usect "filter_vars",0    ; 定义数据页指针
  
main:
  STM  4000h,sp    ; 设置堆栈指针
  LD  #0h,dp     ; 设置数据页指针

  LDM   pmst,a     ; 改变中断向量表首地址
  AND   #k_temp,a
  OR    #k_iptr,a
  STL   a,ar6
  MVDM   ar6,pmst
  NOP
  NOP
  NOP
  STM   #0ffffh,tcr   ; 关闭定时器
  STM   #05h,prd   ; 设置定时器周期寄存器
  STM   #08e0h,tcr   ; 设置定时器控制寄存器

  SSBX   intm    ; 关闭中断
  SSBX   sxm
  ST    #2491h,swwsr   ; 设置外设等待时间寄存器
  NOP
  NOP
  SSBX   xf    ; 设置XF引脚为高
  NOP     ; 等待硬件完成高电平检测
  NOP
  
dss_init:
  RSBX   cpl    ; 设置DSP的缓冲串口0的所有寄存器
  NOP
  NOP
  STM   spcr10,spsa0
  NOP
  STM   06h,spcd0       ; 写入06h到spcr10寄存器
  NOP
  stm   spcr20,spsa0
  NOP
  STM   200h,spcd0       ; 写入200h到spcr20寄存器
  NOP
  STM   pcr0,spsa0
  NOP
  STM   0eh,spcd0
  NOP
  STM   rcr10,spsa0
  NOP
  STM   40h,spcd0
  NOP
  STM   rcr20,spsa0
  NOP
  STM   4h,spcd0
  NOP
  STM   xcr10,spsa0
  NOP
  STM   40h,spcd0
  NOP
  STM   xcr20,spsa0
  NOP
  STM   4h,spcd0
  NOP
  
  LD    #64h,a         ; 等待一段时间
  RPT   #50
  NOP
  
  STM   spcr10,spsa0
  NOP
  STM   07h,spcd0       ; 开启缓冲串口
  NOP
  STM   spcr20,spsa0
  NOP
  STM   201h,spcd0
  NOP
  RPT   #50
  NOP

aic_init:     ; 初始化AD50
  STM 0h,imr   ; 设置中断寄存器   
  ORM   10h,imr
  STM 0ffffh,ifr   ; 清上电复位可能影响的中断标志
  PORTW  08h,02h
  NOP
  NOP
  NOP
  CALL   wait
waitr$14$:
  STM   0h,spsa0
  NOP
  LDM   spcd0,a
  NOP
  NOP
  NOP
  AND   #2h,0,a,a
  BC   waitr$14$,aeq   ; 判断是否可以写数据到AD50
  STM   #101h,dxr10   ; 设置AD50的控制寄存器1
  CALL   wait  
  STM   0ffffh,ifr

waitr$17$:
  STM   0h,spsa0
  NOP
  LDM   spcd0,a
  NOP
  NOP
  NOP
  AND  #2h,0,a,a
  BC   waitr$17$,aeq   ; 判断是否可以写数据到AD50
  STM   #210h,dxr10   ; 设置AD50的控制寄存器2
  CALL   wait
  STM   0ffffh,ifr

waitr$22$:
  STM   0h,spsa0
  NOP
  LDM   spcd0,a
  NOP
  NOP
  NOP
  AND   #2h,0,a,a
  BC   waitr$22$,aeq   ; 判断是否可以写数据到AD50
  ; STM   #430h,dxr10   ; 设置20kHz采样频率
  ; STM   #440h,dxr10   ; 设置15kHz采样频率
  STM   #400h,dxr10   ; 设置8kHz采样频率
  CALL   wait    ; 设置AD50的控制寄存器4
  STM   0ffffh,ifr

waitr$24$:
  STM   0h,spsa0
  NOP
  LDM   spcd0,a
  NOP
  NOP
  NOP
  AND   #2h,0,a,a
  BC   waitr$24$,aeq   ; 判断是否可以写数据到AD50
  STM   #301h,dxr10   ; 设置AD50的控制寄存器3
  CALL   wait

  SSBX  frct          ; 设置数据的小数方式位
  STM   #buffery,ar4   ; 设置输出数据指针
  STM   #bufferx, ar3   ; 设置输入数据指针
  STM   #buffery, ar5  
  STM   #k_buffer,bk   ; 设置循环指针
  STM   #1, ar0
  NOP
  STM   0ffffh,ifr   ; 清中断标志寄存器
  NOP
  RSBX   xf
  NOP
  NOP
  NOP
  LDM  drr10,a   ; 清空缓冲串口0的数据接收寄存器
  NOP
  STM   0h,imr
  ORM   10h,imr   ; 设置缓冲串口0的接收中断
  NOP
  NOP
  RSBX  intm    ; 开启总中断
js:
  NOP
  NOP
  B    js
  NOP
  NOP
  NOP
  
wait:      ; 延时子程序
  RPT   #8048
  NOP
  RET
  NOP
  NOP
  
ad50_data:       ; AD50接收数据中断子程序
  LDM   drr10,a     ; 接收数据送到累加器A
  CALL  filter   ; 调用滤波子程序
  NOP
  NOP
  RETE
  NOP
  NOP
  
filter:     ; 滤波子程序
  NOP
  NOP
  NOP
  STL   a,*ar3            ; 采样数据送到ar3指向的数据空间
  NOP
  MAR   *ar3-0%   ; 调整指针ar3,适应滤波器算法
  MAR   *ar3-0%
  MAR   *ar3-0%
     ; 开始做滤波算法
  MPY   *ar3+0%,#b4,b       ; b=b4*x(i)
  LD   a,b
  MPY   *ar3+0%,#b3,b       ; b=b3*x(i+1)
  ADD   a,b
  MPY   *ar3+0%,#b2,b       ; b=b2*x(i+2)
  ADD   a,b
  MPY   *ar3+0%,#b1,b       ; b=b1*x(i+3)
  ADD   a,b            ; y(x+3)=a  
  MPY   *ar4+0%,#a3,b       ; b=y(i)*a3
  ADD   a,b            ; a=a+b
  MPY   *ar4+0%,#a2,b       ; b=y(i+1)*a2
  ADD   a,b            ; a=a+b  
  MPY   *ar4+0%,#a1,b       ; a=y(i+2)*a1
  ADD   a,b            ; y(x+3)=a+b
; STFA  a,-2,b
  STH   b,*ar4-0%         ; FILTER++
; STFA  a,3,a
  STH   a,dxr10          ; 滤波后数据送到DA输出
  MAR   *ar4-0%          ; 调整滤波器数据指针,为下一次数据滤波做准备
  NOP
  NOP
  RET
  NOP
  NOP

 

posted @ 2010-12-28 23:27  ARM与DSP  阅读(413)  评论(0)    收藏  举报