DSP课程设计报告11.docx
《DSP课程设计报告11.docx》由会员分享,可在线阅读,更多相关《DSP课程设计报告11.docx(24页珍藏版)》请在冰豆网上搜索。
![DSP课程设计报告11.docx](https://file1.bdocx.com/fileroot1/2023-1/2/9f20c6be-df21-4ae3-9bd1-9eb4c4909bdc/9f20c6be-df21-4ae3-9bd1-9eb4c4909bdc1.gif)
DSP课程设计报告11
课程设计报告
课程设计名称:
DSP原理与应用
系部:
三系
学生姓名:
班级:
学号:
成绩:
指导教师:
开课时间:
2010-2011学年2学期
目录
一、设计的要求1
二、设计原理1
2.1、FIR滤波器的特点1
2.2、FIR滤波器的基本结构1
2.3、FIR滤波器的窗函数设计法2
三、设计步骤3
3.1语音采集的采集与分析3
3.2用MATLAB给原始信号加噪声5
四、设计一定参数的滤波器7
4.1用MATLAB设计滤波器7
4.2、用FIR滤波器滤除高频11
五、设计体会17
六、参考文献17
基于TMS320VC5509DSP的FIR滤波器设计
一、设计的要求
1、系统地理解和掌握高速数字信号处理器的特点和基本概念。
2、了解TMS320054xDSP汇编语言的特点,掌握TMS320C54xDSP常用的开发工具,掌握集成开发环境CCS的使用,熟练掌握利用CCS进行程序开发的一般过程。
3、掌握汇编语言程序的编写方法,汇编器和链接器的用法,能利用汇编指令实现高速数字信号处理器的一些典型用法。
4、在DSP应用方面得到系统锻炼,通过该课程的学习为今后从事使用DSP技术在通讯、控制等相关领域的应用、研究和开发打下良好的基础,为进入社会增加一种工作技能。
5、要求认真查阅所需资料,按照选题编制程序框图,编写源代码程序,并在DSP开发环境中进行调试,最终实现课题所要求的功能。
二、设计原理
在数字信号处理中,滤波占有极其重要的地位。
数字滤波是语音处理、图像处理、模式识别、频谱分析等应用中的基本处理算法。
用DSP芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好等特点。
2.1、FIR滤波器的特点
(1)系统的单位冲激响应h(n)在有限个n值处不为零;
(2)系统函数H(z)在|z|>0处收敛,在|z|>0处只有零点,有限z平面只有零点,而全部极点都在z=0处(因果系统);
(3)结构上主要是非递归结构,没有输出到输入的反馈,但有些结构(例如频率抽样结构)中也包含有反馈的递归结构。
2.2、FIR滤波器的基本结构
数字滤波是将输入的信号序列,按规定的算法进行处理,从而得到所期望的输出序列。
一个线性位移不变系统的输出序列y(n)和输入序列x(n)之间的关系,应满足常系数线性差分方程:
(1)
x(n):
输入序列,y(n):
输出序列,ai、bi:
滤波器系数,N:
滤波器的阶数。
在式
(1)中,若所有的ai均为0,则得FIR滤波器的差分方程:
(2)
对式
(2)进行z变换,可得FIR滤波器的传递函数:
FIR滤波器的基本结构是一个分节的延时线,把每一节的输出加权累加,得到滤波器的输出。
FIR滤波器的结构图如图2.1所示:
图2.1FIR滤波器的结构图
FIR滤波器的单位冲激响应h(n)为有限长序列。
若h(n)为实数,且满足偶对称或奇对称的条件,则FIR滤波器具有线性相位特性。
偶对称:
h(n)=h(N-1-n);
奇对称:
h(n)=-h(N-1-n)。
在数字滤波器中,FIR滤波器具有如下几个主要特点:
①FIR滤波器无反馈回路,是一种无条件稳定系统;
②FIR滤波器可以设计成具有线性相位特性。
2.3、FIR滤波器的窗函数设计法
常用的FIR滤波器的设计方法有窗函数设计法和频率抽样设计法。
窗函数法设计的基本思想是设计一个有限长滤波器频率响应来逼近理想滤波器的频率响应。
设理想滤波器的频率响应为Hd(ejw),其单位抽样响应用hd(n)表示。
通常选择Hd(ejw)为具有分段常数特性的理想滤波器,因此hd(n)是无限长非因果的,不能直接作为FIR数字滤波器的单位抽样响应。
窗函数设计法就是截取hd(n)的一段为有限长因果序列,并选择合适的窗函数进行加权作为FIR数字滤波器的单位抽样响应。
窗函数法设计线性相位FIR滤波器的一般步骤为:
(1)首先是给定所要求的频率响应函数Hd(ejw);
(2)求理想滤波器的单位抽样响应
(3)由过渡带带宽及阻带最小衰减的要求,选定窗函数w(n),并估计窗口长度N;
(4)求得所设计的FIR滤波器的单位抽样响应
(5)求FIR滤波器的系统函数
三、设计步骤
3.1语音信号的采集与分析
(1)录制语音,并命名为“wjj”,保存在相应的位置(C盘)。
单击开始菜单——程序——附件——娱乐——录音机,然后设计属性:
单击文件——属性,在弹出的文本框中单击立即转换——设计格式(PCM)——属性(8000KHz16位单声道16KB/秒,然后点击确定。
开始录音。
(2)用MATLAB对原始语音信号进行分析,画出它的时域波形和频谱。
程序如下:
fs=22050;
x1=wavread('C:
\wjj.wav');
sound(x1,22050);%播放语音信号
y1=fft(x1,1024);%对信号做1024点FFT变换
f=fs*(0:
511)/1024;
figure
(1)
plot(x1)%做原始语音信号的时域图形
title('原始语音信号');
xlabel('timen');
ylabel('fuzhin');
figure
(2)
freqz(x1)%绘制原始语音信号的频率响应图
title('频率响应图')
figure(3)
subplot(2,1,1);
plot(abs(y1(1:
512)))%做原始语音信号的FFT频谱图
title('原始语音信号FFT频谱')
subplot(2,1,2);
plot(f,abs(y1(1:
512)));
title('原始语音信号频谱')
xlabel('Hz');
ylabel('幅值');
图3.1原始语音信号图
图3.2频率响应图
图3.3原始语音信号FFT频谱和信号频谱图
3.2用MATLAB给原始信号加噪声
给原始的语音信号加上一个高频余弦噪声,频率为(5—6Khz任选),形成噪声文件。
再对加噪后的语音进行分析,并画出其信号时域和频谱图。
程序如下:
fs=22050;
x1=wavread('C:
\wjj.wav');
f=fs*(0:
511)/1024;t=0:
1/fs:
(length(x1)-1)/fs;
Au=0.03;d=[Au*cos(2*pi*5500*t)]';
x2=x1+d;
sound(x2,22050);
y2=fft(x2,1024);
figure(4);plot(t,x2)
title('加噪后的信号');
xlabel('timen');
ylabel('fuzhin');
figure(5)
subplot(2,1,1);
plot(f,abs(y1(1:
512)));
title('原始语音信号频谱');
xlabel('Hz');
ylabel('fuzhi');
subplot(2,1,2);
plot(f,abs(y2(1:
512)));
title('加噪后的信号频谱');
xlabel('Hz');
ylabel('fuzhi');
wavwrite(x2,8000,16,'C:
\wjj1.wav');%用于生成噪声语音
图3.4加噪后的信号
通过比较图1和图4,可以看出,加噪声后的信号的幅值明显比原始信号的幅值高。
图3.5原始语音和加噪后的信号频谱对比图
四、设计一定参数的滤波器
4.1用MATLAB设计滤波器
使用fir2函数设计一个35阶低通滤波器,信号的采样频率为8000Hz,滤波器的通带截止频率为3100Hz,阻带截止频率为3500Hz。
在函数中,其截止频率均用归一化频率表示。
归一化频率的计算方法:
f=实际频率/(采样频率/2),则将截止频率归一化后的截止频率值为0.775、0.875。
4.1.1用matlab求fir2的参数:
运行下列程序:
f=[00.7750.8751]
m=[1100]
b=fir2(34,f,m)
得到的数据
f=
00.77500.87501.0000
m=
1100
b=
Columns1through7
0.0000-0.00030.0007-0.00130.0017-0.0012-0.0012
Columns8through14
0.0059-0.01210.0170-0.01640.00580.0175-0.0528
Columns15through21
0.0950-0.13560.16500.82420.1650-0.13560.0950
Columns22through28
-0.05280.01750.0058-0.01640.0170-0.01210.0059
Columns29through35
-0.0012-0.00120.0017-0.00130.0007-0.00030.0000
4.1.2、FIR滤波器的程序流程图
4.1.3、滤波程序:
#include"myapp.h"
#include"ICETEK-VC5509-EDU.h"
#include"scancode.h"
#include
#defineFIRNUMBER35
#defineSIGNAL1F3100
#defineSIGNAL2F3500
#defineSAMPLEF8000
#definePI3.1415926
floatInputWave();
floatFIR();
floatfHn[FIRNUMBER]={0.0000,-0.0003,0.0007,-0.0013,0.0017,-0.0012,-0.0012,
0.0059,-0.0121,0.0170,-0.0164,0.0058,0.0175,-0.0528,
0.0950,-0.1356,0.1650,0.8242,0.1650,-0.1356,0.0950,-0.0528,
0.0175,0.0058,-0.0164,0.0170,-0.0121,0.0059,
-0.0012,-0.0012,0.0017,-0.0013,0.0007,-0.0003,0.0000};
floatfXn[FIRNUMBER]={0.0};
floatfInput,fOutput;
floatfSignal1,fSignal2;
floatfStepSignal1,fStepSignal2;
floatf2PI;
inti;
floatfIn[256],fOut[256];
intnIn,nOut;
main()
{
nIn=0;nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while
(1)
{
fInput=InputWave();
fIn[nIn]=fInput;
nIn++;nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;/*breakpoint*/
if(nOut>=256)
{
nOut=0;
}
}
}
floatInputWave()
{
for(i=FIRNUMBER-1;i>0;i--)
fXn[i]=fXn[i-1];
fXn[0]=sin((double)fSignal1)+cos((double)fSignal2)/6.0;
fSignal1+=fStepSignal1;
if(fSignal1>=f2PI)fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if(fSignal2>=f2PI)fSignal2-=f2PI;
return(fXn[0]);
}
floatFIR()
{
floatfSum;
fSum=0;
for(i=0;i{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
FIR滤波器的DSP实现程序采用C语言编写,滤波器时频特性如图4.2和图4.5所示。
图4.1
图4.4
图4.2
图4.3
图4.5
图4.6
4.2、用FIR滤波器滤除高频噪声
4.2.1、对生成的加噪语音进行噪声滤波,并对滤波后的语音进行分析。
语音信号的FIR滤波程序流程图如下:
4.2.2、语音信号的FIR滤波程序
#include"5509.h"
#include"util.h"
#include"audio.h"
//AIC23ControlRegisteraddresses
#defineAIC23_LT_LINE_CTL0x00//0
#defineAIC23_RT_LINE_CTL0x02//1
#defineAIC23_LT_HP_CTL0x04//2
#defineAIC23_RT_HP_CTL0x06//3
#defineAIC23_ANALOG_AUDIO_CTL0x08//4
#defineAIC23_DIGITAL_AUDIO_CTL0x0A//5
#defineAIC23_POWER_DOWN_CTL0x0C//6
#defineAIC23_DIGITAL_IF_FORMAT0x0E//7
#defineAIC23_SAMPLE_RATE_CTL0x10//8
#defineAIC23_DIG_IF_ACTIVATE0x12//9
#defineAIC23_RESET_REG0x1E//F-Writing0tothisregtriggersreset
//AIC23ControlRegistersettings
#definelt_ch_vol_ctrl0x0017/*0*/
#definert_ch_vol_ctrl0x0017/*1*/
#definelt_ch_headph_ctrl0x0079/*2*/
#definert_ch_headph_ctrl0x0079/*3*/
#definealog_au_path_ctrl0x0000/*4*/
#definedigi_au_path_ctrl0x0000/*5*/
#definepow_mgt_ctrl_ctrl0x0002/*6*/
#definedigi_au_intf_ctrl0x000D/*7*/
#defineau_FS_TIM_ctrl0x0000/*8MCLK=12MHz,SampleRatesetting*/
#definedigi_intf1_ctrl0x0001/*9*/
#definedigi_intf2_ctrl0x00FF/*10*/
#defineDIGIF_FMT_MS0x40
#defineDIGIF_FMT_LRSWAP0x20
#defineDIGIF_FMT_LRP0x10
#defineDIGIF_FMT_IWL0x0c
#defineDIGIF_FMT_FOR0x03
#defineDIGIF_FMT_IWL_160x00
#defineDIGIF_FMT_IWL_200x04
#defineDIGIF_FMT_IWL_240x08
#defineDIGIF_FMT_IWL_320xc0
#defineDIGIF_FMT_FOR_MSBRIGHT0x00
#defineDIGIF_FMT_FOR_MSLEFT0x01
#defineDIGIF_FMT_FOR_I2S0x02
#defineDIGIF_FMT_FOR_DSP0x03
#definePOWER_DEV0x80
#definePOWER_CLK0x40
#definePOWER_OSC0x20
#definePOWER_OUT0x10
#definePOWER_DAC0x08
#definePOWER_ADC0x04
#definePOWER_MIC0x02
#definePOWER_LINE0x01
#defineSRC_CLKOUT0x80
#defineSRC_CLKIN0x40
#defineSRC_SR0x3c
#defineSRC_BOSR0x02
#defineSRC_MO0x01
#defineSRC_SR_440x20
#defineSRC_SR_320x18
#defineSRC_SR_80x0c
#defineANAPCTL_STA0xc0
#defineANAPCTL_STE0x20
#defineANAPCTL_DAC0x10
#defineANAPCTL_BYP0x08
#defineANAPCTL_INSEL0x04
#defineANAPCTL_MICM0x02
#defineANAPCTL_MICB0x01
#defineDIGPCTL_DACM0x08
#defineDIGPCTL_DEEMP0x06
#defineDIGPCTL_ADCHP0x01
#defineDIGPCTL_DEEMP_DIS0x00
#defineDIGPCTL_DEEMP_320x02
#defineDIGPCTL_DEEMP_440x04
#defineDIGPCRL_DEEMP_480x06
#defineDIGIFACT_ACT0x01
#defineLT_HP_CTL_LZC0x80
#defineRT_HP_CTL_RZC0x80
voidAIC23_Write(unsignedshortregaddr,unsignedshortdata)
{
unsignedcharbuf[2];
buf[0]=regaddr;
buf[1]=data;
I2C_Write(I2C_AIC23,2,buf);
}
voidMcBSP0_InitSlave()
{
PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;
//PuttheMCBSPinreset
Write(pMCBSP0->spcr1,0);
Write(pMCBSP0->spcr2,0);
//Configframeparameters(32bit,singlephase,nodelay)
Write(pMCBSP0->xcr1,XWDLEN1_32);
Write(pMCBSP0->xcr2,XPHASE_SINGLE|XDATDLY_0);
Write(pMCBSP0->rcr1,RWDLEN1_32);
Write(pMCBSP0->rcr2,RPHASE_SINGLE|RDATDLY_0);
//Disableintframegenerationandenableslavew/extframesignalsonFSX
//Framesyncisactivehigh,dataclockedonrisingedgeofclkx
Write(pMCBSP0->pcr,PCR_CLKXP);
//Bringtransmitterandreceiveroutofreset
SetMask(pMCBSP0->spcr2,SPCR2_XRST);
SetMask(pMCBSP0->spcr1,SPCR1_RRST);
}
voidAIC23_Init()
{
I2C_Init();
//ResettheAIC23andturnonallpower
AIC23_Write(AIC23_RESET_REG,0);
AIC23_Write(AIC23_POWER_DOWN_CTL,0);
AIC23_Write(AIC23_ANALOG_AUDIO_CTL,ANAPCTL_DAC|ANAPCTL_INSEL);//使用麦克风音源
AIC23_Write(AIC23_DIGITAL_AUDIO_CTL,0);
//Turnonvolumeforlineinputs
AIC23_Write(AIC23_LT_LINE_CTL,0x000);
AIC23_Write(AIC23_RT_LINE_CTL,0x000);
//ConfiguretheAIC23formastermode,44.1KHzstereo,16bitsamples
//Use12MHzUSBclock
AIC23_Write(AIC23_DIGITAL_IF_FORMAT,DIGIF_FMT_MS|DIGIF_FMT_IWL_16|DIGIF_FMT_FOR_DSP);
AIC23_Write(AIC23_SAMPLE_RATE_CTL,SRC_SR_44|SRC_BOSR|SRC_MO);
//Turnonheadphonevolumeanddigitalinterface
AIC23_Write(AIC23_LT_HP_CTL,0x07f);//0x79forspeakers
AIC23_Write(AIC23_RT_HP_CTL,0x07f);
AIC23_Write(AIC23_DIG_IF_ACTIVATE,DIGIFACT_ACT);
//SetMcBSP0tobetransmitslave
McBSP0_InitSlave();
}
voidAIC23_Disable()
{
PC55XX_MCSPpMCBSP0=(PC55XX_MCSP)C55XX_MSP0_ADDR;
I2C_Disable();
//PuttheMCBSPinreset
Write(pMCBSP0->spcr1,0);
Write(pMCBSP0->