语音信号的fir滤波器处理华南农业大学doc.docx
《语音信号的fir滤波器处理华南农业大学doc.docx》由会员分享,可在线阅读,更多相关《语音信号的fir滤波器处理华南农业大学doc.docx(28页珍藏版)》请在冰豆网上搜索。
语音信号的fir滤波器处理华南农业大学doc
DSP课程设计报告
语音信号的FIR滤波器处理
姓名:
XXXXXXXXX
班级:
10电信1
学号:
XXXXXXXX
指导老师:
徐梅宣
日期:
2013.06.10~2013.06.21
华南农业大学工程学院
摘要
DSP(DigitalSignalProcessing)也就是我们常说的数字信号处理,它是利用计算机或专用处理设备,以数字形式对信号进行采集、变换、滤波、估值、增强、压缩、识别等处理,以得到符合人们需要的信号形式。
DSP芯片在信号处理、通信、雷达等许多领域得到广泛的应用。
Matlab是一款强大的软件,它将数值分析、矩阵计算、科学数据可视化等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案。
CSS集成开发环境使用CCS内置的软件仿真simulator对程序进行编译,调试和运行,主要用于检测目标程序运行的正确性和连贯性,并能通过仿真器与目标板连接,在目标板上实时观察效果。
在本次设计中,我们选择的课题是基于DSP的语言信号的FIR滤波处理。
首先利用MATLAB进行了仿真,得到滤波前后的时域波形和频谱。
然后通过调用MATLAB的分析工具FDATOOL,根据仿真结果导出了滤波器的相关参数,将原始信号数据和滤波器参数输入CCS进行DSP编程。
最后在DSP中实现了FIR带通滤波,并通过CCS的频谱分析功能查看了最终DSP的滤波效果。
关键词:
语音信号DSPFIR滤波MATLABCCS
1.前言4
2.设计原理4
2.1数字信号处理器4
2.2滤波器简介5
2.3fir滤波器原理6
2.4窗函数简介7
3.FIR滤波器的Matlab设计8
3.1总体方案的设计8
3.2语音信号的采集9
3.3MATLAP的具体处理10
3.5FIR滤波器的系统参数14
4.FIR滤波器的CCS设计与仿真16
4.1CCS程序流程图17
4.2CCS仿真结果20
5.问题及解决办法22
6.设计感想23
参考文献23
7.附录24
1前言
随着信息与数字技术的发展,数字信号处理已经成为当今极其重要而学科与技术领域之一。
它在通信、语音、图像、自动控制、雷达、军事、航空航天、医疗和家用电器等众多领域得到了广泛的应用。
在数字信号处理的基本方法中,通常会涉及到变换、滤波、频谱分析、调制解调和编码解码等处理。
其中滤波是应用非常广泛的一个环节,数字滤波器的理论和相关设计也一直都是人们研究的重点之一。
FIR滤波器的是非递归的,稳定性好,精度高;更重要的是,FIR滤波器在满足幅频响应要求的同时,可以获得严格的线性相位特征。
因此,它在高保真的信号处理,如数字音频、图像处理、数据传输和生物医学等领域得到广泛应用。
在数字信号处理中,滤波占有极其重要的地位。
数字滤波是语音信号处理、图像处理、模式识别、频谱分析等应用的基本处理算法。
用DSP芯片实现数字滤波除了具有稳定性好、精确度高、不受环境影响等优点外,还具有灵活性好等特点。
本文介绍了数字滤波器的设计基础及用窗函数法设计FIR滤波器的方法,运用MATHLAB语言实现了低通滤波器的设计并用CCS3.3进行观察效果。
2设计原理
2.1数字信号处理器
DSP(DigitalSignalProcessor)是一种独特的微处理器,是以数字信号来处理大量信息的器件。
其工作原理是接收模拟信号,转换为0或1的数字信号。
再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。
它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。
它的强大数据处理能力和高运行速度,是最值得称道的两大特色。
由Ti公司提供专业的开发工具CCS,自带DSP/BIOS操作系统,能够直接编写适合DSP开发工程及文件,满足DSP程序设计要求。
由MathWorks公司和TI公司联合开发的DSPMATLABLinkforCCSDevelopmentTools(简称CCSLink)是MATLAB6.5版本(Release13)中增加的一个全新的工具箱,它提供了MATLAB、CCS和DSP目标板的接口,利用此工具可以像操作MATLAB变量一样来操作DSP器件的存储器和寄存器,使开发人员在MATLAB环境下完成对DSP的操作,从而极大地提高DSP应用系统的开发进程。
本设计主要是使用DSP对语音噪声信号进行处理,使用CCS开发工具编写程序,同时利用MATLAB操作DSP器件的存储器和寄存器。
2.2滤波器简介
滤波器,顾名思义,是对波进行过滤的器件。
“波”是一个非常广泛的物理概念,在电子技术领域,“波”被狭义地局限于特指描述各种物理量的取值随时间起伏变化的过程。
该过程通过各类传感器的作用,被转换为电压或电流的时间函数,称之为各种物理量的时间波形,或者称之为信号。
因为自变量时间‘是连续取值的,所以称之为连续时间信号,又习惯地称之为模拟信号(AnalogSignal)。
随着数字式电子计算机(一般简称计算机)技术的产生和飞速发展,为了便于计算机对信号进行处理,产生了在抽样定理指导下将连续时间信号变换成离散时间信号的完整的理论和方法。
也就是说,可以只用原模拟信号在一系列离散时间坐标点上的样本值表达原始信号而不丢失任何信息,波、波形、信号这些概念既然表达的是客观世界中各种物理量的变化,自然就是现代社会赖以生存的各种信息的载体。
信息需要传播,靠的就是波形信号的传递。
信号在它的产生、转换、传输的每一个环节都可能由于环境和干扰的存在而畸变,有时,甚至是在相当多的情况下,这种畸变还很严重,以致信号及其所携带的信息被深深地埋在噪声当中了。
滤波,本质上是从被噪声畸变和污染了的信号中提取原始信号所携带的信息的过程。
滤波器特性可以用其频率响应来描述,按其特性的不同,可以分为低通滤波器,高通滤波器,带通滤波器和带阻滤波器等。
带通滤波器(英语:
Band-passfilter)是指能通过某一频率范围内的频率分量、但将其他范围的频率分量衰减到极低水平的滤波器,与带阻滤波器的概念相对。
一个模拟带通滤波器的例子是电阻-电感-电容电路(RLCcircuit)。
这些滤波器也可以用低通滤波器同高通滤波器组合来产生。
2.3FIR滤波器原理
FIR滤波器(有限长单位冲激响应滤波器)是在数字信号处理(DSP)中经常使用的两种基本的滤波器之一,另一个为IIR滤波器。
IIR滤波器是无限冲激响应滤波器。
不论哪一种滤波器设计方法,都要求出滤波器的单位冲激响应h(n),然后才能在时域中实现频域中的滤波。
在频域,当其输入信号为X(ejω)时,如滤波器的频率响应为H(ejω),则其输出信号为Y(ejω)=X(ejω)H(ejω)。
在时域,设滤波器的单位冲激响应h(n)为一N点序列,即0≤n≤N-1时h(n)的值不为零,根据离散傅氏变换的性质,则可以将滤波器的输入序列x(n)的响应y(n)表示为x(n)与h(n)的卷积和,即:
这就是滤波系统的差分方程,它给滤波器的实现奠定了理论基础。
即求出时域的h(n)后,便可通过卷积来实现频域的滤波。
卷积和运算主要有以下几个步骤:
(1)h(n)序列N个点数值的存储
由于h(n)是根据滤波性能要求已经设计好的有限长单位冲激响应,故其N个点的数值是已知的,因此可以存放在ROM或RAM当中,且对应着N个不同的地址,便于寻址。
(2)输入序列x(n)的移位寄存
输入序列x(n)是不断变化的,因此只能对其进行移位寄存,寄存器的个数为N,即N个寄存器中分别存放着x(n)、x(n-1)……x(n-N+1),它们都随着n的变化而变化。
(3)乘法器
用以完成两个数值的乘法,即h(m)x(n-m),也就是将存储器中N地址所对应的N个固定数值h(m)分别与N个移位寄存器中的不断变化的N个变化数值x(n-m)相乘。
(4)累加器
用以实现N个乘积的累加,即将当前x(n)所对应的N个乘积进行累加,所得到的和就是y(n)。
当滤波器的下一个输入值即x(n+1)到来时,累加器清零,并重新将下一组x(n+1)所对应的N个乘积进行累加,所得到的和就是y(n+1)。
2.4窗函数简介
数字信号处理的主要数学工具是傅里叶变换。
而傅里叶变换是研究整个时间域和频率域的关系。
不过,当运用计算机实现工程测试信号处理时,不可能对无限长的信号进行测量和运算,而是取其有限的时间片段进行分析。
做法是从信号中截取一个时间片段,然后用观察的信号时间片段进行周期延拓处理,得到虚拟的无限长的信号,然后就可以对信号进行傅里叶变换、相关分析等数学处理。
无线长的信号被截断以后,其频谱发生了畸变,原来集中在f(0)处的能量被分散到两个较宽的频带中去了(这种现象称之为频谱能量泄漏)。
为了减少频谱能量泄漏,可采用不同的截取函数对信号进行截短,截断函数称为窗函数,简称为窗。
信号截短以后产生的能量泄漏现象是必然的,因为窗函数w(t)是一个频带无限的函数,所以即使原信号x(t)是有限带宽信号,而在截短以后也必然成为无限带宽的函数,即信号在频域的能量与分布被扩展了。
又从采样定理可知,无论采样频率多高,只要信号一经截短,就不可避免地引起混叠,因此信号截短必然导致一些误差。
泄漏与窗函数频谱的两侧旁瓣有关,如果两侧瓣的高度趋于零,而使能量相对集中在主瓣,就可以较为接近于真实的频谱,为此,在时间域中可采用不同的窗函数来截短信号。
3FIR滤波器的Matlab设计
3.1.总体方案设计
本次课程设计所采用的主要软件为Matlab。
设计中用到的函数主要有wavread,sound,fft,subplot,plot,fir1,freqz,filter。
课程设计利用窗函数法设计FIR数字滤波器,并利用MATLAB作为辅助工具仿真滤波前后的时域波形和频谱。
对于DSP的处理,首先,通过Matlab给语音信号添加高频噪音,即将原始信号调制到某一高频上(本设计用10000hz),再将其与原始语音信号相叠加,最后将这个叠加后的信号转化为数据(matlab编程),并存入后缀为dat的文件中。
之后根据仿真结果使用MATLAB的设计分析工具FDATOOL产生滤波器参数。
将混叠后的信号数据和滤波器参数输入CCS进行DSP编程,在DSP中实现FIR带通滤波,并使用CCS的频谱分析功能,查看最终DSP的滤波效果。
3.2语音信号的采集
使用PC机上的声卡和WINDOWS操作系统可以进行数字信号的采集。
将话筒插入计算机的语音输入插口上,启动MOOo录音专家。
按下录音按钮,接着对话筒录音,录音结束后屏幕左侧将显示所录声音的长度。
点击放音按钮,可以实现所录音的重现。
如图3.1所示,以文件名“voice”保存入matlab当前工作路径中。
可以看到,文件存储器的后缀默认为.wav,这是WINDOWS操作系统规定的声音文件存的标准。
3.3matlab具体处理
初始化
读入语音信号
原始音频抽样
加噪声并带通滤波
导出混合信号供DSP处理
3.3.1原始音频抽样
Fs=10000;
bits=16;
T=1;ts=1/Fs;
N=38;
[x,Fs,bits]=wavread('voice.wav');%
x=x(:
1);
m=length(x);
%sound(x,Fs,bits);
y=fft(x,m);%对录制的信号进行傅立叶变换
f=(Fs/m)*[1:
m];
t=[1:
m]/Fs;
figure
(1);
subplot(211);plot(t,x);title('原始信号波形');xlabel('time(s)');
subplot(212);plot(f,abs(y));title('原始信号频谱');xlabel('frequency(hz)');
noise4=0.01*sin(2*pi*5000*t)+0.01*sin(2*pi*200*t);带通噪声%
3.3.2加噪声并带通滤波
fpl4=500;
fph4=2000;
fsl4=700;
fsh4=1800;
wp4=[2*fpl4/Fs2*fph4/Fs];
ws4=[2*fsl4/Fs2*fsh4/Fs];
X4=x+noise4';%加了带通噪声的信号
%sound(X4,Fs,bits);%回放噪声信号
Y41=fft(X4,m);%对加了带通噪声的信号进行傅立叶变换
figure
(2);
subplot(211);plot(t,X4);title('加了带通噪声的信号时域图');xlabel('time(s)');
subplot(212);plot(f,abs(Y41));title('加了带通噪声的信号频谱图');xlabel('frequency(hz)');
figure(3);
wc4=(wp4+ws4)/2;
b4=fir1(N,wc4,kaiser(N+1));%调用kaiser计算带通FIRDF的b4(n)
[hn4wp4]=freqz(b4,1,512);
subplot(211);plot(wp4/pi,20*log10(abs(hn4)));title('带通滤波器幅频');xlabel('w');
subplot(212);plot(wp4/pi,unwrap(angle(hn4)));title('带通滤波器相频');xlabel('w');
figure(4);
x4get=filter(b4,1,X4);
Y4get=fft(x4get,m);
%sound(x4get,Fs,bits);
subplot(211);plot(t,x4get);title('加了带通噪声的信号滤波后时域图');xlabel('time(s)');
subplot(212);plot(f,abs(Y4get));title('加了带通噪声的信号滤波后频谱图');xlabel('frequency(hz)');
3.3.3导出混合信号供DSP处理
xout=X4/max(X4);
xto_ccs=round(32767*xout);
%由于TMS32054X是16位定点处理器,在进行汇编程序设计时,FIR滤波器系数需要采用Q15格式。
myfile=fopen('fir1.dat','w');%新建
fprintf(myfile,'16511e5112c\n');
fprintf(myfile,'%d\n',xto_ccs);%把调制信号+原始信号输出fir.dat文件
fclose(myfile);
3.5FIR滤波器的系统参数
在本设计中,使用MATLAB模拟产生合成信号,然后利用CCS进行滤波。
因此设计一个FIR带通滤波器,其参数为:
采样频率:
Fs=44100Hz
通带1:
Fp=700Hz
阻带1:
Fc=500Hz
通带2:
Fp=1800Hz
阻带2:
Fp=2000Hz
通带最大衰减:
1dB
阻带最少衰减:
100dB
滤波器级数:
N=38(由MATLAB根据前述参数求得。
)
其中,采样频率由[y,fs,bits]=wavread()求出。
其中fs为采样频率。
执行程序可得fs为22050HZ。
滤波器级数由%据ωp1=2*fp1/fs;ωc1=2*fc1/fs,B(带宽)=ωp1-ωc1,N(窗口长度)=ceil(6.6/B),n(阶数)=N-1;算出阶数为38。
滤波器系数使用matlab滤波器的设计/分析工具FDATOOL设计FIR滤波器。
步骤如下图所示:
图9Matlab声音信号调制示意图
4FIR滤波器的检验
图10Matlab滤波器设计
在选项中选择或输入滤波器参数,然后点击”DesignFilter”按钮完成滤波器设计。
设计成功后的结果如图下图所示。
在fdatool中,选择Targets->CodeComposerStudio™IDE。
在出现的对话框中选择输出文件类型为C.headerfile,输出系数类型为signed16-bitinteger,如图11—13。
点击Generate按钮,选择路径,即可输出前一步设计出的FIR滤波器系数表。
4FIR滤波器的CCS设计与仿真
CCS是一种针对TMS320系列DSP的集成开发环境,在windows操作系统下,采用图形接口界面,提供环境配置、源文件编辑、程序调试、跟踪和分析等工具,提供了配置、建立、调试、跟踪和分析程序的工具,从而完成编辑、编译、链接、调试和数据分析等工作。
在CCS中编写汇编语言程序,进行调试,实现FIR滤波的功能。
本课程设计使用CCS开发应用程序的一般步骤为:
(1)创建一个工程项目文件fir2.h,用汇编语言编写处理主程序fir2.asm。
另外根据板上的存储器配置方式,编写存储器配置文件fir.cmd文件,将MATLAB生成的fir2.h和indata.dat文件拷贝到工程文件夹下。
(2)编辑各类文件。
使用CCS提供的集成编辑环境,对头文件、链接命令文件和源程序进行编辑。
(3)对工程项目进行编译,生成可执行文件。
如出现语法错误,将在构建窗口中显示错误信息。
用户可以根据显示信息定位错误信息,更改错误。
(4)下载程序、输入数据,执行程序,对结果和数据进行分析和算法评估。
利用CCS提供的探测点、图形显示等工具,对运行结果、输出数据进行分析,评估算法性能。
4.1CCS程序流程图
图15CCS汇编程序流程图
开始
DSP初始化
将滤波系数分别存放在存储单元bn中
从第L个数开始读入抽样值
抽样值存入在存储单元xn中
将bn中和xn中对应的值相乘累加bn*xn+ACC=>ACC
L=L+1
输出结果
4.1.1程序分析
FIR滤波器的DSP实现主要有线性缓冲区法和循环缓冲区法两种。
线性缓冲区法又称延迟线法。
其特点:
(1)对于N级的FIR滤波器,在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本;
(2)从最老样本开始取数,每取一个样本后,将此样本向下移位;
(3)读完最后一个样本后,输入最新样本存入缓冲区的顶部。
循环缓冲区法的特点如下:
(1)对于N级FIR滤波器,在数据存储器中开辟一个N单元的缓冲区(滑窗),用来存放最新的N个输入样本;
(2)从最新样本开始取数;
(3)读完最后一个样本(最老样本)后,输入最新样本来代替最老样本,而其他数据位置不变;
(4)用片内BK(循环缓冲区长度)寄存器对缓冲区进行间接寻址,使循环缓冲区地址首尾相邻。
本次设计的FIR滤波器所采用的就是循环缓冲区法。
对DSP进行初始化,并设置好存储单元。
为数字滤波作准备,将预先设计好的有N个抽头的FIR数字滤波器的冲激响应序列h(n)中的N个数值放入存储单元bn中,从indata数据存储段中读入抽样值,将抽样值逐一放入存储单元xn中。
主要循环程序如下:
STM#-1,AR0
RPTZA,#N;将ACC累加器清零,循环N次
MAC*AR2+0%,*AR3+0%,A
STHA,*(yn);保存输出
MVKD*(yn),*AR5+
将累加器清零,将存储单元bn与xn值对应相乘并累加到ACC中,循环N次将ACC中的值保存输出。
再从indata数据存储段中读入一个新的数据,代替原来的最老样本MVDD*AR4+,*AR2+0%,重复循环直到数据全部处理完。
最后将处理完的数据输入到outdata数据存储段中。
4.1.2数据输入
MATLAB辅助DSP实现FIR滤波器滤波,其总体过程是为DSP中编写处理程序提供滤波器系数。
在MATLAB中利用滤波器设计、分析工具(FDATOOL),根据指定的滤波器性能快速设计一个FIR,然后把滤波器系数以头文件形式导入CCS中,头文件中包含MATLAB辅助DSP实现FIR数字滤波器的阶数和系数数组,在MATLAB中调试、运行DSP程序并显示、分析处理后的数据。
打开CCSIDE中file的data加载初始化data数据,在Address中输入数据存放的起始地址indata,并设置数据栈长度。
4.1.3运行程序仿真
运行程序,查看输入输出波形,修改相应参数进行调试。
在View的Graph中单击Time/frequency出现graphpropertydialog框。
将显示类型,图形名称,起始地址,抽样点数,数据类型等分别进行设置,输出各种波形。
输出滤波前的信号时域波形。
首先,设置如下图所示,输出滤波前的信号时域波形。
图16滤波前语音信号的时域GraphPropertyDialog设置参数图
将DisplayType改为FFTMagnitude就可以看到滤波前信号的频谱,将StartAddress改为outdata就可以看到滤波后信号的时域波形和频谱。
4.2CCS仿真结果
图17滤波前语音信号的时域波形图
图18滤波前信号频谱波形图
4.2.2FIR滤波器滤波后的信号
图19滤波后信号时域波形图
图20滤波后信号频谱图
图17波前的信号,由高频信号和原信号叠加而成的波形较为杂乱,加噪后的信号幅值较大。
图19波后的信号,从图上可以看到信号幅度较低,波形较为清晰。
对比图18图20可以看到加躁后信号幅值较大,信号的能量集中在高频段,滤波后,高频成分大部分被滤去,信号的能量主要集中在低频段。
5问题及解决方法
1.为什么存入DAT文件的信号数据要乘上32768?
由于TMS32054X是16位定点处理器,在进行汇编程序设计时,FIR滤波器系数需要采用Q15格式,即必须将上述系数据转化位Q15定点式。
2.matlab编译错误出现如下错误?
Thecarrierfrequencymustbelessthanhalfthesamplingfrequency.故降低载波频率
3.在View的Graph中单击Time/frequency出现graphpropertydialog框,未修改抽样点数,显示的图形出现差异.
4.在CCS编译时,发现fir.h文件老是出错,最后发现滤波系数要以整数体现,而且不能加分号。
6设计感想
通过本次课程设计,我们发现在课本上学到的知识实在是不能使我们有能力驾驭这个课程设计。
一开始决定做这个课题,我们就去查找了大量资料,通过查找资料我们都清楚了大概要做些什么。
首先要进行MATLAB仿真,并通过MATLAB设计的FIR滤波器输出滤波器系数。
接着便是通过CCS编程,并在DSP上运行。
我们觉得思路是很清晰的,但是实际操作起来却困难重重。
原始信号有了,我们也得了教训,便开始计划开来。
于是,翻书看完有关FIR滤波器的相关介绍,重点看了凯塞窗。
然后查资料找出与本次设计有关的MATLAB知识。
做完这些自然是开始设计,总体框架,具体步骤,都在脑袋瓜里转了几转。
动工,这时才深刻体会到“纸上学来终觉浅,用到实际才叫真!
”开始设计从噪