2023年12月10日发(作者:生态文明校园)
《DSP原理及应用》――FIR滤波器的C54X实现
一、 实验目的
用matlab获得FIR滤波器的抽头系数,用汇编语言实现FIR滤波器。产生一混频信号,用所设计的滤波器进行滤波,查看滤波器输出。
二、实验仪器
1.PC一台(win7系统);
2.Code Compor Studio 3.1 软件;
3.MATLAB 2009;
4.Dev C++ 6.0 软件。
三、实验要求
1.设计一个FIR低通滤波器,通带边界频率为2500Hz,通带波纹小于1dB;阻带边界频率为3000Hz,阻带衰减大于40dB;采样频率为10000Hz。
2.设计一个采样频率Fs为10000Hz,输入信号频率为2000Hz和3250Hz的合成信号,通过设计的低通滤波器将3250Hz信号滤掉,余下2000Hz信号。
3.用循环缓冲区和双操作数寻址方法编写实现FIR滤波的程序。
四、实验原理
如果FIR 滤波器的冲激响应为h(0),h(1), ...,h(N-1)。X(n)表示滤波器在n 时刻的输入,则n 时刻的输出为:
y(n) = h(0)x(n) + h(1)x(n-1) + ... + h(N-1)x[n-(N-1)]
使用MAC 或FIRS 指令可以方便地实现上面的计算。
图1 说明了使用循环寻址实现FIR 滤波器的方法。为了能正确使用循环寻址,必须先初始化BK,块长为N。同时,数据缓冲区和冲激响应(FIR 滤波器的系数)的开始地址必须是大于N
的2 的最小幂的倍数。例如,N=11,大于N 的最小2 的幂为16,那么数据缓冲区的第一个地址应是16 的倍数,因此循环缓冲区起始地址的最低4 位必须是0。
在图1 中,滤波系数指针初始化时指向h(N-1),经过一次FIR 滤波计算后,在循环寻址的作用下,仍然指向h(N-1)。而数据缓冲区指针指向的是需要更新的数据,如x(n)。在写入新数据并完成FIR 运算后,该指针指向x(n-(N-1))。所以,使用循环寻址可以方便地完成滤波窗口数据的自动更新。
五、实验内容及步骤
1.FIR滤波器的设计
FIR滤波器的设计可以用MATLAB软件的窗函数法进行,这里选择Hamming窗,程序为:
b=fir1(16,1500/8000*2)
得到FIR数字滤波器系数b为:
b0 = 0 b9 = 0.2834
b1 = 0.0048 b10 = 0.0973
b2 = 0.008 b11 = -0.029
b3 = -0.0089 b12 = -0.0429
b4 = -0.0429 b13 = -0.0089
b5 = -0.029 b14 = 0.008
b6 = 0.0973 b15 = 0.0048
b7 = 0.2834 b16 = 0
b8 = 0.3745
在DSP汇编语言中,不能直接输入十进制小数,在MATLAB中进行如下转换:
h=round(b*2^15)
将系数转换为Q15的定点小数形式,为:
h0 = 0 h9 = 9287
h1 = 158 h10 = 3187
h2 = 264 h11 = -951
h3 = -290 h12 = -1406
h4 = -1406 h13 = -290
h5 = -951 h14 = 264
h6 = 3187 h15 = 158
h7 = 9287 h16 = 0
h8 = 12272
2.产生滤波器输入信号文件
以下是一个产生输入信号的C语言程序,信号是频率为1000Hz和2500Hz的正弦波合成的波形。文件名为firinput.c 。
#include
#include
void main()
{
int i;
double f[256];
FILE *fp;
if((fp=fopen("","wt"))==NULL)
{
printf("can't open file! n");
return;
} for(i=0;i<256;i++)
{
f[i]=sin(2*3.14159*i*1000/8000)+sin(2*3.14159*i*2500/8000);
fprintf(fp," .word %ldn",(long)(f[i]*32768/2));
}
fclo(fp);
}
该程序产生名为 的输入信号程序。文件的部分内容如下:
.word 0
.word 26722
.word 4798
.word 5315
.word 16384
:
:
.word -5319
.word -4793
.word -26721
在DSP汇编语言程序中通过.copy汇编命令将生成的数据文件 复制到汇编程序中,作为FIR滤波器的输入数据。
3.编写FIR数字滤波器的汇编源程序
FIR数字滤波器汇编程序如下:
.mmregs
.global start
.def start,_c_int00
INDEX .t 1
KS .t 256 ;模拟输入数据缓冲区大小
N .t 17
COFF_FIR .ct "COFF_FIR" ;FIR滤波器系数
.word 0
.word 158
.word 264
.word -290
.word -1406
.word -951
.word 3187
.word 9287
.word 12272
.word 9287
.word 3187
.word -951
.word -1406 .word -290
.word 260
.word 158
.word 0
.data
INPUT .copy "" ;模拟输入在数据存储区0x2400
OUTPUT .space 1024 ;输出数据在数据区0x2500
COFFTAB .uct "FIR_COFF",N
DATABUF .uct "FIR_BFR",N
BOS .uct "STACK",0Fh
TOS .uct "STACK",1
.text
.asg AR0,INDEX_P
.asg AR4,DATA_P ;输入数据x(n)循环缓冲区指针
.asg AR5,COFF_P ;FIR系数表指针
.asg AR6,INBUF_P ;模拟输入数据指针
.asg AR7,OUTBUF_P;FIR滤波器输出数据指针
_c_int00
b start
nop
nop
start: ssbx FRCT
STM #COFFTAB,COFF_P
RPT #N-1 ;将FIR系数从程序存储器移动
MVPD #COFF_FIR,*COFF_P+ ;到数据存储器
STM #INDEX,INDEX_P
STM #DATABUF,DATA_P
RPTZ A,#N-1
STL A,*DATA_P+ ;将数据循环缓冲区清零
STM #(DATABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]
STM #COFFTAB,COFF_P
FIR_TASK:
STM #INPUT,INBUF_P
STM #OUTPUT,OUTBUF_P
STM #KS-1,BRC
RPTBD LOOP-1
STM #N,BK ;FIR循环缓冲区大小
LD *INBUF_P+,A ;装载输入数据
FIR_FILTER:
STL A,*DATA_P+%
RPTZ A,N-1 MAC *DATA_P+0%,*COFF_P+0%,A
STH A,*OUTBUF_P+
LOOP:
EEND B EEND
.end
4.编写FIR滤波器链接命令文件
对应以上汇编程序的链接命令文件如下:
-m
-o
MEMORY
{
PAGE 0: ROM1(RIX) :ORIGIN=0080H,LENGTH=100H
PAGE 1: INTRAM1(RW) :ORIGIN=2400H,LENGTH=0200H
INTRAM2(RW) :ORIGIN=2600H,LENGTH=0100H
INTRAM3(RW) :ORIGIN=2700H,LENGTH=0100H
B2B(RW) :ORIGIN=0070H,LENGTH=10H
}
SECTIONS
{
.text : {}>ROM1 PAGE 0
.data : {}>INTRAM1 PAGE 1
FIR_COFF: {}>INTRAM2 PAGE 1
FIR_BFR : {}>INTRAM3 PAGE 1
STACK : {}>B2B PAGE 1
}
5.在Code Compor Studio 3.1 软件中将有关程序运行并调试。
六、实验结果及分析
1.观察输入信号的波形,如图2所示。
2.观察输入信号的频谱,如图3所示。
3.观察输出信号的波形,如图4所示。
4.观察输出信号的频谱,如图5所示。
七、实验总结
这次实验完成了FIR滤波器在DSP上仿真实现,对FIR滤波器有更深入的了解,进一步掌握对CCS软件的使用方法,巩固了对DSP汇编语言的理解,对以后深入学习有很大帮助。
本文发布于:2023-12-10 23:11:11,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1702221071117651.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:FIR CCS 实验报告.doc
本文 PDF 下载地址:FIR CCS 实验报告.pdf
留言与评论(共有 0 条评论) |