一、实验项目名称
语音信号的处理
二、实验目的
综合运用数字信号处理课程的理论知识进行频谱分析以及滤波器设计,通过理论推导得出相应结论,并进行计算机仿真,从而复习巩固了课堂所学的理论知识,提高了对所学知识的综合应用能力。
三、实验内容
- 语音信号的采集
- 语音信号的频谱分析
- 设计数字滤波器和画出频率响应
- 用滤波器对信号进行滤波
- 比较滤波前后语音信号的波形及频谱
- 回放语音信号
四、实验具体方案
1.语音信号采集
录制一段语音信号并保存为文件,长度控制在1秒,并对录制的信号进行采样;录制时使用Windows自带的录音机。
采样是将一个信号(即时间或空间上的连续函数)转换成一个数值序列(即时间或空间上的离散函数)。采样定理指出,如果信号是带限的,并且采样频率高于信号带宽的两倍,那么,原来的连续信号可以从采样样本中完全重建出来。如果信号带宽不到采样频率的一半(即奈奎斯特频率),那么此时这些离散的采样点能够完全表示原信号。高于或处于奈奎斯特频率的频率分量会导致混叠现象。大多数应用都要求避免混叠,混叠问题的严重程度与这些混叠频率分量的相对强度有关。
用Windows自带录音机录入一段音乐,2秒钟,用audioread读取音频内容,这里不使用waveread是因为他要求音频文件格式为.wav ,并且我进行了尝试但没有成功,画出音频信号的时域波形图
[y1,fs] = audioread('F:\MATLAB\ren.m4a');
figure(1);
plot( y1 );
title( 'Ô原语音信号时域波形图' );
xlabel( '单位' );ylabel( '幅度' );
2.语音信号频谱分析
首先画出语音信号的时域波形,然后对语音信号进行频谱分析。在matlab中利用fft对信号进行快速傅里叶变换,得到信号的频谱特性。
Matlab的信号处理工具箱中的函数FFT可用于对序列的快速傅里叶变换分析,其调用格式是y=fft(x,N),其中,x是序列,y是序列的FFT变换结果,N为整数,代表做N点的FFT,若x为向量且长度小于N,则函数将x补零至长度N;若向量x长度大于N,则截断x使之长度为N。
N= length(y1);
f1= (0:N-1)*fs/N;
y2 = fft (y1,N);
plot( f1, abs(y2) );
axis([-1000 5000 0 3000]);
title( '原语音信号频域波形图' );
xlabel('单位');ylabel('幅度');
原始语音信号的频率基本上集中在5kHz以内。其中原始语音信号FFT频谱和原始语音信号频谱的区别是:前者是频率为1递增的频谱,而后者是以f1= (0:N-1)*fs/N递增,后者是在"不小于原始信号的频率(采样定理)"上完全展开的频谱。
3.设计滤波器和画出频率响应
根据语音信号的特点给出有关滤波器的新能指标:
① 低通滤波器的性能指标:fp=1000Hz,fc=1200Hz,As=100dB,Ap=1dB;
低通数字滤波器的设计采用二次映射的方法,就是先将整个s平面压缩到s1平面的一个
的横形条带范围内,然后再将这个条带映射到z平面上,就能建立s平面到z平面的一一对应关系。映射关系为 ,其中T为抽样周期。
Fp=1000;Fs=1200;Ft=8000;As=100;Ap=1;
wp=2*pi*Fp/Ft;ws=2*pi*Fs/Ft;
[n,wn]=ellipord(wp,ws,Ap,As,'s');
[b,a]=ellip(n,Ap,As,wn,'s');
[B,A]=bilinear(b,a,1);
[h,w]=freqz