dsp滤波要点

  • 格式:doc
  • 大小:971.00 KB
  • 文档页数:23

下载文档原格式

  / 23
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
fprintf(fp," .word %1d\n",(long)(f[i]*32768/3));
}
fclose(fp);
}
该文件会生成一个.inc的文件,由于比较冗长,在此不再赘述。然后,在DSP汇编语言中通过.copy汇编命令将生成的数据文件iirin.inc复制到汇编程序中,作为IIR滤波器的输入数据。此过程的作用相当于把信号通பைடு நூலகம்了AD转换。
.mmregs
.global start
.def start,_c_int00
KS .set 256 ;输入样本数据个数
N .set 49 ;FIR滤波器阶数
COEF_FIR .sect "COEF_FIR" ;FIR滤波器系数
.word -358, 632, 30, -284, -184, 211, 371, -6, -448
利用MATLAB中的FDA工具导出正确的参数。
2.产生滤波器输入信号文件
以下是一个产生输入信号的C语言程序,信号是频率为1000Hz、2500Hz和4000Hz的正弦波合成的波形:
#include <stdio.h>
#include <math.h>
void main()
{
int i;
double f[256];
FIR滤波器的单位冲激响应h(n)为有限长序列。
若h(n)为实数,且满足偶对称或奇对称的条件,则FIR滤波器具有线性相位特性。
在数字滤波器中,FIR滤波器具有如下几个主要特点:
①FIR滤波器无反馈回路,是一种无条件稳定系统;
②FIR滤波器可以设计成具有线性相位特性。
本实验程序设计的就是一种偶对称的线性相位滤波器。
STM #KS-1,BRC
RPTB LOOP-1
LD *INBUF_P+,A ;装载输入数据
FIR_FILTER: ;FIR滤波运算
STL A,*DATA_P ;输入样本值x(n)
STM #(DATABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]
RPTZ A,N-1
MACD *DATA_P-,COEF_FIR,A ;FIR滤波运算
BOS .usect "STACK",0Fh
TOS .usect "STACK",1
.text
.asg AR4,DATA_P ;数据x(n)缓冲区指针
.asg AR6,INBUF_P ;模拟输入数据指针
.asg AR7,OUTBUF_P ;FIR滤波器输出数据指针
_c_int00
b start
nop
一:实验原理
一个线性位移不变系统的输出序列y(n)和输入序列x(n)之间的关系,应满
足常系数线性差分方程:
x(n):输入序列,y(n):输出序列,ai、bi:滤波器系数,N:滤波器的阶数。
在式上式中,若所有的ai均为0,则得FIR滤波器的差分方程:
对上式进行z变换,可得FIR滤波器的传递函数:
FIR滤波器的结构
由此即可得到16位二进制数据表示的离散数据文件,即离散的三频谱叠加的正弦信号。
3.编写滤波器的汇编源程序
(1)低通滤波器
**********一个FIR低通滤波器程序lowpass.asm************
**************使用线性缓冲区法************************
**************使用线性缓冲区法************************
FILE *fp;
if((fp=fopen("in.inc","wt"))==NULL)
{
printf("can't open file! \n");
return;
}
for(i=0;i<=255;i++)
{
f[i]=sin(2*3.14159*i*1000/8000)+sin(2*3.14159*i*2500/8000)+sin(2*3.14159*4000/8000);
.word -142, 572, 396, -263, -448, -6, 371, 211, -184
.word -284, 30, 632, -358
.data
INPUT .copy "highpass.inc" ;输入数据在数据区0x2400
OUTPUT .space 1024 ;输出数据在数据区0x2500
(1)学会编写滤波程序和输入信号程序。
(2)熟悉CCS集成开发环境,熟悉DSK板的使用。
(3)通过实验比较FIR和IIR在设计上和滤波效果上的区别。
二:FIR滤波器的设计
例:设计一个采样频率Fs为8000Hz,输入信号频率为1000HZ、2500HZ与4000HZ的合成信号,通过设计FIR滤波器分别实现低通,高通,带通,带阻的滤波功能。
MAR *DATA_P+ ;调整DATA_P指针指向DATABUF第一个单元
STH A,*OUTBUF_P+
LOOP:
EEND B EEND
.end
(2)高通滤波器
*********一个FIR高通滤波器程序highpass.asm************
**************使用线性缓冲区法************************
nop
start: SSBx FRCT ;小数乘法编程时,设置FRCT(小数方式)位
STM #DATABUF,DATA_P ;数据缓冲区清零
RPTZ A,N-1
STL A,*DATA_P+
FIR_TASK:
STM #DATABUF,DATA_P
STM #INPUT,INBUF_P
STM #OUTPUT,OUTBUF_P
.word 193, 108, -74, -635, -620, 112, 784, 773, 94
.word -533, -431, -18, -243, -946, -741, 1064, 2933, 2307
.word -1241, -4633, -4091, 551, 5088, 5088, 551, -4091, -4633
.word 125, 505, 686, 535, 40, -651, -1260, -1456, -979
.word 248, 2064, 4092, 5839, 6848, 6848, 5839, 4092, 2064
.word 248, -979, -1456, -1260, -651, 40, 535,686, 505
STM #OUTPUT,OUTBUF_P
STM #KS-1,BRC
RPTB LOOP-1
LD *INBUF_P+,A ;装载输入数据
FIR_FILTER: ;FIR滤波运算
STL A,*DATA_P ;输入样本值x(n)
STM #(DATABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]
**************使用线性缓冲区法************************
.mmregs
.global start
.def start,_c_int00
KS .set 256 ;输入样本数据个数
N .set 46 ;FIR滤波器阶数
COEF_FIR .sect "COEF_FIR" ;FIR滤波器系数
程序算法实现采用循环缓冲区法。
二:算法原理:
①在数据存储器中开辟一个N个单元的缓冲区(滑窗),用来存放最新的N个输入样本;
②从最新样本开始取数;
③读完最老样本后,输入最新样本来代替最老样本,而其他数据位置不变;
④用BK寄存器对缓冲区进行间接寻址,使缓冲区地址首尾相邻。
三:实验程序设计步骤
1.FIR滤波器设计
RPTZ A,N-1
MACD *DATA_P-,COEF_FIR,A ;FIR滤波运算
MAR *DATA_P+ ;调整DATA_P指针指向DATABUF第一个单元
STH A,*OUTBUF_P+
LOOP:
EEND B EEND
.end
(4)带阻滤波器
*********一个FIR带阻滤波器程序bandstop.asm************
.word -1241, 2307, 2933, 1064, -741, -946, -243, -18, -431
.word -533, 94, 773, 784, 112, -620, -635, -74, 108, 193
.data
INPUT .copy "bandpass.inc" ;输入数据在数据区0x2400
数字信号处理
综合设计性实验报告
学 院:电子信息工程学院
班 级:自动化0706班
电子0701班
指导教师:高海林
学 生:张越 07213056
陈冠宇07214004
北京交通大学电工电子教学基地
2010年1月20日
利用DSP实现信号滤波
一:实验目的
实现离散信号滤波是DSP的基本功能,本实验中我们尝试实现分别了设计FIR和IIR滤波器实现低通,高通,带通,带阻四种滤波器对正弦离散信号进行滤波。
.word -263, 396, 572, -142, -806, -319, 840, 949, -519
.word -1650, -355, 2294, 2303, -2746, -10014, 19293, -10014, -2746
.word 2303, 2294, -355, -1650, -519, 949, 840, -319, -806
_c_int00
b start
nop
nop
start: SSBx FRCT ;小数乘法编程时,设置FRCT(小数方式)位
STM #DATABUF,DATA_P ;数据缓冲区清零
RPTZ A,N-1
STL A,*DATA_P+
FIR_TASK:
STM #DATABUF,DATA_P
STM #INPUT,INBUF_P
.word 125, -271, -532, -585, -451, -213, 24, 180, 226, 297
.data
INPUT .copy "lowpass.inc" ;输入数据在数据区0x2400
OUTPUT .space 1024 ;输出数据在数据区0x2500
DATABUF .usect "FIR_BFR",N
.mmregs
.global start
.def start,_c_int00
KS .set 256 ;输入样本数据个数
N .set 46 ;FIR滤波器阶数
COEF_FIR .sect "COEF_FIR" ;FIR滤波器系数
.word 297, 226, 180, 24, -213, -451, -585, -532, -271
RPTZ A,N-1
MACD *DATA_P-,COEF_FIR,A ;FIR滤波运算
MAR *DATA_P+ ;调整DATA_P指针指向DATABUF第一个单元
STH A,*OUTBUF_P+
LOOP:
EEND B EEND
.end
(3)带通滤波器
*********一个FIR带通滤波器程序bandpass.asm************
STM #DATABUF,DATA_P
STM #INPUT,INBUF_P
STM #OUTPUT,OUTBUF_P
STM #KS-1,BRC
RPTB LOOP-1
LD *INBUF_P+,A ;装载输入数据
FIR_FILTER: ;FIR滤波运算
STL A,*DATA_P ;输入样本值x(n)
STM #(DATABUF+N-1),DATA_P ;数据缓冲区指针指向x[n-(N-1)]
.asg AR7,OUTBUF_P ;FIR滤波器输出数据指针
_c_int00
b start
nop
nop
start: SSBx FRCT ;小数乘法编程时,设置FRCT(小数方式)位
STM #DATABUF,DATA_P ;数据缓冲区清零
RPTZ A,N-1
STL A,*DATA_P+
FIR_TASK:
OUTPUT .space 1024 ;输出数据在数据区0x2500
DATABUF .usect "FIR_BFR",N
BOS .usect "STACK",0Fh
TOS .usect "STACK",1
.text
.asg AR4,DATA_P ;数据x(n)缓冲区指针
.asg AR6,INBUF_P ;模拟输入数据指针
DATABUF .usect "FIR_BFR",N
BOS .usect "STACK",0Fh
TOS .usect "STACK",1
.text
.asg AR4,DATA_P ;数据x(n)缓冲区指针
.asg AR6,INBUF_P ;模拟输入数据指针
.asg AR7,OUTBUF_P ;FIR滤波器输出数据指针