基于matlab的语音采集及处理

时间:2024-04-12 17:57:03

一.课程设计的目的

通过数字信号处理的课程设计,使学生对信号的采集,处理,传输,显示,存储和分析等有一个系统的掌握和理解。巩固和运用数字信号处理课程中的理论知识和实验技能,掌握最基本的数字信号处理的理论和方法,培养学生发现问题,分析问题和解决问题的能力。

二.课程设计的题目

语音信号的采集、分析与处理。

三.设计内容 主要技术关键的分析、解决思路和方案比较等

对一段语音信号进行采样;画出采样后语音信号的时域波形和频谱图;给定滤波器的性能指标,采用窗函数法和双线性变换设计滤波器,并画出滤波器的频率响应;然后用自己设计的滤波器对采集的信号进行滤波,画出滤波后信号的时域波形和频谱,并对滤波前后的信号进行对比,分析信号的变化;回放语音信号;最后,设计一个信号处理系统界面。

设计内容:采样一段语音信号;画出语音信号的时域波形和频谱图;给定滤波器的性能指标,设计数字滤波器,并画出滤波器的频率响应;然后用设计的滤波器对采集的信号进行滤波,画出滤波后信号的时域波形和频谱。

关键技术:频谱图的理解;设计数字滤波器;数字滤波的方法;

解决思路:对语音号进行快速傅里叶变换,得到信号的频谱特性;在MATLAB环境中可以利用函数fir设计FIR滤波器,可以利用函数butter设计IIR滤波器;利用MATLAB中的函数freqz画出各滤波器的频率响应。

 

四、设计原理及步骤

原理:

1.语音信号的采集 

语音信号是一种模拟信号,首先须经过采样将其转换为数字信号,实质是把连续信号变为脉冲或数字序列。  我们可以用录音软件先录一段wav格式的音频。然后用matlab的audioread函数采集,记住采样频率和采样点。然后用sound函数来使用。

 2.语音信号的频谱特性 

在MATLAB中,可以利用函数fft对信号进行快速傅里叶变换,得到信号的频谱特性。

快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

3.语音信号的时域分析    

     语音信号的时域分析就是分析和提取语音信号的时域参数。进行语  音分析时,最先接触到并且也是最直观的是它的时域波形。语音信号本身就是时域信号,因而时域分析是最早使用,也是应用最广泛的一种分析方法,这种方法直接利用语音信号的时域波形。时域分析通常用于最基本的参数分析及应用,如语音的分割、预处理、大分类等。这种分析方法的特点是: 

①表示语音信号比较直观、物理意义明确。

②实现起来比较简单、运算且少。

③可以得到语音的一些重要的参数。 

④只使用示波器等通用设备,使用较为简单等。  

语音信号的时域参数有短时能量、短时过零率、短时白相关函数和短时平均幅度差函数等,这是语音信号的一组最基本的短时参数,在各种语音信号数字处理技术中都要应用。在计算这些参数时使用的一般是方窗或汉明窗。对语音信号进行分析,发现发浊音时,尽管声道有若干个共振峰,但由于声门波引起谱的高频跌落,所以其话音能量约集中在3kHz以下。而发清音时,多数能量出现在较高频率上。高频就意味着高的平均过零率,低频意味着低的平均过零率,所以可以认为浊音时具有较低的过零率,而清音时具有较高的过零率。当然,这种高低仅是相对而言,并没方精确的数值关系。

4.语音信号的频域分析  

语音信号的频域分析就是分析语音信号的频域持征。从广义上讲,语音信号的频域分析包括语音信号的频谱、功率谱、倒频谱、频谱包络分析等,而常用的频域分析方法有带通滤波器组法、傅里叶变换法、线件预测法等几种。因为语音波是一个非平稳过程,因此适用于周期、瞬变或平稳随机信号的标准傅里叶变换不能用来直接表示语音信号,而应该用短时傅里叶变换对语音信号的频谱进行分析,相应的频谱称为“短时谱”。

5.采样定理

在进行模拟与数字信号的转换过程中,当采样大于最高频率的2倍时,则采样之后的数字信号完整的保留了原始信号中的信息,一般实际应用中保证采样频率为信号最高频率的5~10倍。

6.采样频率

采样频率是指计算机每秒钟采样多少个声音样本,是描述声音文件的音质、音频、衡量声卡、声音文件的质量标准。采样频率越高,即采样的时间间隔越短,则在单位时间内计算机得到的声音样本数据越多,对声音波形的表示也越准确。

7.采样位数

采样位数即采样值或取样值,用来衡量声音波动变化的参数,是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。采样位数和采样率对于音频接口来说是最为重要的两个指标。无论采样频率如何,理论上来说采样的位数决定了音频数据最大的力度范围。采样位数越多则捕捉到的信号越精确。

步骤:

1、语音信号的采集  选取一段2秒左右的音频,以文件名“1”保存在桌面上,文件存储器的后缀默认为.wav;  在Matlab软件平台下可以利用函数audioread对语音信号进行采样,得到了声音数据变量 .

2、2语音信号的频谱分析  画出语音信号的时域波形;  对语音信号进行频谱分析,在Matlab中,我们利用函数fft对信号进行快速傅里叶变换,得到信号的频谱特性。

五、设计过程

5.1信号采集

我们利用函数对语音信号进行采集,原始语音信号及其频谱如下图,信号采集程序见附录。

基于matlab的语音采集及处理

5.2加噪后的波形

基于matlab的语音采集及处理

5.3根据性能指标进行数字滤波器设计

IIR低通滤波器的设计:

IIR低通滤波器的幅频特性如下图,设计程序见附录。

基于matlab的语音采集及处理

 

5.4用滤波器对信号进行滤波

基于matlab的语音采集及处理

 

5.5回放语音信号

经过加噪声处理后,可在Matlab中用函数sound对声音进行回放。其调用格式:sound(y,Fs)。

六、课程设计总结                                                             

    通过这次课程设计,让我对matlab有了深入的了解。知道了函数audioread

和sound的用法。由于电脑安不起matlab其他版本的,只能用matlab 2016a 版本的。像wavread和wavread函数都用不着。所以去查了许多的资料,才完成了这次的实验。

这次设计主要参考的网上的一些前辈们做的设计,看了他们无数的代码,自己才慢慢的懂得了如何去写一些代码,和一些代码的作用。直到现在有些函数都还没有弄懂,这次设计就用了自己会的一些函数,由于是第一次设计,所以还向学霸们请教了一些问题。在设计过程中有不懂的,在他们的帮助下也完成了。

这次设计让我懂得了,要完成一件事需要很多很多的努力。努力就会有收获。

附件:

 Matlab实验代码:

clear

clc

[pyr,fs]=audioread('pyr.wav');%声音读取

sound(pyr,fs);   %声音回放

 

n=length(pyr);

pyr1=fft(pyr,n);                            %快速傅里叶变换

figure(1)

subplot(2,1,1);

plot(pyr);  

xlabel('时间');

ylabel('幅度');

title('初始信号波形');   %绘出时域波

gridon

subplot(2,1,2);                         %绘出频域频谱

plot(abs(fftshift(pyr1)));

title('初始信号频谱');

xlabel('频率');

ylabel('幅度');

gridon

 

noise=0.01*randn(n,1);%加噪声

s=pyr+noise;

 

pause;

sound(s,fs);  %播放加噪的语音

 

n=length(s);   %画出加噪之后,其时域频域

S=fft(s,n);

figure(2)

subplot(2,1,1)

plot(s);

title('加噪声后信号波形')

xlabel('时间');

ylabel('幅度');

grid;

subplot(2,1,2)

plot(abs(fftshift(S)));

xlabel('频率');

ylabel('幅度');

title('加噪声后信号信号频谱');

grid;

pause

 

 

%设计IIR低通滤波器

rp=2,rs=80;

Ft=8000;

Fp=1000;

Fs=2000;                                       

wp=2*pi*Fp/Ft;

ws=2*pi*Fs/Ft    %求出待设计的模拟滤波器的边界频率

[n,wn]=buttord(wp,ws,rp,rs,'s');    %低通滤波器的阶数和截止频率

[b,a]=butter(n,wn,'s');             %S域频率响应的参数即:滤波器的传输函数

[bz,az]=bilinear(b,a,0.5);          %利用双线性变换实现频率响应S域到Z域的变换

 

%低通滤波器特性

figure(3);

[h,w]=freqz(bz,az);

title('IIR低通滤波器');

plot(w*fs/(2*pi),abs(h));

gridon

 

%滤波

z=filter(bz,az,s);

 

%回放滤波后的信号

pause;

sound(z,fs);                   

 

%滤波后画出其频谱,波形

Z=fft(z);                           %滤波后的信号频谱

figure(4)

subplot(2,2,1);

plot(z);

title('低通滤波后的信号波形');

xlabel('时间');

ylabel('幅度');

grid;

subplot(2,2,2)

plot(s)

title('加噪声后信号波形');

xlabel('时间');

ylabel('幅度');

grid;

subplot(2,2,3);

plot(abs(fftshift(S)));

title('加噪声后信号频谱');

xlabel('频率');

ylabel('幅度');

grid;

subplot(2,2,4);

plot(abs(fftshift(Z)));

title('低通滤波后信号的频谱');

xlabel('频率');

ylabel('幅度');

grid;