DSP串口数据采集发送及FIR滤波器的DSP实现Word文件下载.docx
《DSP串口数据采集发送及FIR滤波器的DSP实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《DSP串口数据采集发送及FIR滤波器的DSP实现Word文件下载.docx(25页珍藏版)》请在冰豆网上搜索。
有限长单位冲激响应滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性,同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。
因此,FIR滤波器在通信、图像处理、模式识别等领域都有着广泛的应用。
TMS320C5402(简称C5402)提供了2个支持高速、全双工、带缓冲、多种数据格式等优点的多通道缓冲串行口McBSP。
MCBSP分为数据通路和控制通路。
通信数据通过McBSP的数据发送(DX)引脚发送,通过数据接收(DR)引脚接收。
时钟和帧同步控制信息通过CLKX、CLKR、FSX和FSR给出。
C54xx通过16位宽可访问控制寄存器经外部外设总线与McBSP通信。
CPU或MDA控制器从数据接收寄存器(DRR[1,2])中读取接收待的数据,并把要发送的数据写到数据发送寄存器(DXR[1,2])中;
然后,写到DXR[1,2]中的数据通过发送移位寄存器(XSR[1,2])从DX引脚移出。
类似地,DR引脚上的接收数据被移入到接收移位寄存器(RSR[1,2]),并被复制到接收缓冲接存器(RBR[1,2])中;
然后,(RBR[1,2])被复制到DRR[1,2],则CPU或DMA控制器即可通过(DRR[1,2])获得接收数据。
这样,便可实现同时移动内部和外部帧同步脉冲有效表示传输的开始。
本次课设就是用DSP的多通道缓冲串行口接收数据,在通过FIR滤波后,输出出去。
二、方案设计与论证
C语言编程产生滤波器模拟输入4KHz方波信号;
设计一个FIR滤波器,经FIR滤波后得到4KHz的正弦波信号。
FIR滤波器的DSP编程采用分别采用线性缓冲区法和循环缓冲区法。
由实验箱信号发生器产生4KHz的模拟方波信号,然后进行AD转换,采样频率为32KHz,对采样数字信号进行数字滤波得到4KHz的正弦波信号,存放在内存单元中观察这些数据的波形,并通过串口DAC转换后输出,在示波器上观察输出信号。
三、单元程序设计与参数计算
3.1设计一个FIR低通滤波器,通带边界频率为6500Hz,通带波纹小于1dB;
阻带边界频率为2000Hz,阻带衰减大于40dB;
采样频率为32000Hz。
FIR滤波器的设计可以用MATLAB窗函数法进行,例如选择Hamming窗,其程序为:
b=fir1(16,6500/32000*2);
在DSP汇编语言中,不能直接输入十进制小数,在MATLAB中进行如下转换:
h=round(b*2^15);
则将系数转换为Q15的定点小数形式,为
h=
-748136775-1303-1581251096451333096452510-1581-13037536781-74
3.2用C语言实现C语言编程产生滤波器模拟输入4KHz方波信号或者三角波信号。
程序如下:
方案一:
#include<
stdio.h>
math.h>
stdlib.h>
voidmain()
{
inti;
intvalue=1;
intf[256];
FILE*fp;
if((fp=fopen("
iiirin.inc"
"
wt"
))==NULL)
{
printf("
can'
topenfile!
\n"
);
return;
}
for(i=0;
i<
256;
i++)
{
if(i%8==0)
value*=-1;
f[i]=value;
fprintf(fp,"
.word%1d\n"
(long)(f[i]*32768/2));
fclose(fp);
}
方案二:
inti,k;
intj;
doublef[256];
iirin.inc"
for(j=0;
j<
=15;
j++)
for(i=0;
i<
i++)
{m=0
n=7
k=i+16*j;
if(i%16<
=7)f[k]=m++;
elsef[k]=n--;
fprintf(fp,"
(long)(f[k]*32768/2));
}}
}
方案三:
c语言产生三角波:
inti,k,m,n;
{m=0;
n=7;
(long)(f[k]*32768/10));
该程序将产生名为firin.inc的输入信号数据文件。
在DSP汇编语言程序中通过.copy汇编命令将生成的数据文件firin.inc拷贝到汇编程序中,作为FIR滤波器的输入数据。
3.3应用循环缓冲区法编程实现FIR滤波器
.mmregs
.defstart,_c_int00
INDEX.set-1
KS.set256;
模拟输入数据缓冲区大小
N.set17
COEF_FIR.sect"
COEF_FIR"
;
FIR滤波器系数
.word-74
.word81
.word367
.word75
.word-1303
.word-1581
.word2510
.word9645
.word13330
.data
INPUT.copy"
firin.inc"
;
模拟输入在数据存储区0x2400
OUTPUT.space256*16;
输出数据在数据区0x2500
b.usect"
FIR_COEF"
N
x.usect"
FIR_BFR"
.text
_c_int00
bstart
nop
start:
ssbxFRCT
STM#b,AR5
RPT#N-1;
将FIR系数从程序存储器移动到数据存储器
MVPDCOEF_FIR,*AR5+;
STM#INDEX,AR0
STM#x,AR4
RPTZA,#N-1
STLA,*AR4+;
将数据循环缓冲区清零
STM#(x+N-1),AR4;
数据缓冲区指针指向x[n-(N-1)]
STM#b+N-1,AR5;
FIR系数表指针
FIR_TASK:
STM#INPUT,AR6
STM#OUTPUT,AR7
STM#KS-1,BRC
RPTBDLOOP-1
STM#N,BK;
FIR循环缓冲区大小
LD*AR6+,A;
装载输入数据
FIR_FILTER:
STLA,*AR4+0%
RPTZA,#N-1
MAC*AR4+0%,*AR5+0%,A
STHA,*AR7+
LOOP:
EENDBEEND
.end
-mxunhuan.map
-oxunhuan.out
MEMORY
PAGE0:
ROM1(RIX):
ORIGIN=0080H,LENGTH=100H
PAGE1:
INTRAM1(RW):
ORIGIN=2400H,LENGTH=0200H
INTRAM2(RW):
ORIGIN=2600H,LENGTH=0100H
INTRAM3(RW):
ORIGIN=2700H,LENGTH=0100H
SECTIONS
.text:
{}>
ROM1PAGE0
.data:
INTRAM1PAGE1
FIR_COEF:
INTRAM2PAGE1
FIR_BFR:
INTRAM3PAGE1
}
3.4应用线性缓冲区法编程实现FIR滤波器
.mmregs
.globalstart
.defstart,_c_int00
KS.set256
COFF_FIR.sect"
COFF_FIR"
.wo