基于MATLAB 的语音信号分析和处理
【摘要】:
本文通过用三星手机系统自带录音机采集了一段语音,wav格式转换后再Matlab平台上对其进行了时域分析,频谱分析,分析语音信号的特性。利用函数对采样频率进行控制,比较其波形。通过对两段铃声(分别为男声、女声)进行分析初步找出男声女声的特点和区别。应用Matlab平台对录制的语音信号加入噪声,对比加噪前后的语音信号的时域和频域特性,回放加噪语音信号。
【关键词】:
语音信号 ;频域特性 ; 时域特性 ; 滤波器
目录
一、 背景介绍
1.1 语音信号的概述
1.2 语音信号处理工具的选择
二、 语音信号的录制采集和分析
2.1 语音信号的采集
2.2 语音信号的读入与打开
2.3 取不同采样频率得出的波形比较
三、 对男声、女声语音信号特点的分析
3.1女声(vfemale.wav)男声(vmale.wav)的时域分析
3.2女声(vfemale.wav)男声(vmale.wav)的频域分析
四、 加噪声与滤波处理分析
4.1 高斯白噪声(SNR=30)
4.2 单频正弦噪声
五、 心得与体会
一、 背景介绍
1.1 语音信号的概述
语言是人类创造的,是人类区别于其他地球生命的本质特征之一。人类用语言交流的过程可以看成是一个复杂的通信过程,为了获取便于分析和处理的语音信源,必须将在空气中传播的声波转变为包含语音信息并且记载着声波物理性质的模拟(或数字)电信号,即语音信号,因此语音信号就成为语音的表现形式或载体。
1.2 语音信号处理工具的选择
语音信号的进一步处理分析工作选用了Matlab平台。Matlab是一种科学计算软件,专门以矩阵的形式处理数据。Matlab将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,不断完善Matlab产品以提高产品自身的竞争能力Matlab的数据分析和处理功能十分强大,运用它来进行语音信号的分析、处理和可视化相当便捷。在编程效率、程序可读性、可移植性和可扩充性上Matlab远远优于其它的高级编程语言,而且编程易学、直观,代码非常符合人们的思维习惯。另外Matlab为用户提供了丰富的windows图形界面设计方法,使用户能够在利用其强大的数值计算功能的同时可设计出友好的图形界面,它受到了越来越多的用户的欢迎。
Matlab几乎可以在各种机型和操作系统上运行,所以在可移植性和可扩充性上,Matlab远优越于其他的高级编程语言。Matlab语言具有强大的数值计算能力和视图能力,其偏微分方程工具箱提供了有限元求解的一个强大而灵活的环境,并且有限元网格可做精细划分以满足要求。但是,和其他的高级语言相比,Matlab程序的执行速度较慢。在目前电脑处理速度不断提升的情况下,如果实时性要求不是非常高的情况下,使用Matlab开发就不存在此类问题了。
二、 语音信号的录制采集与分析
2.1 语音信号的采集
用手机自带的录音软件录音,录制时配备电话耳机作为麦克风,在安静,低噪声的环境下录制。将得到的m4a格式的音频文件转换成wav格式,便于在Matlab平台上处理。本人录制的是朗读的是的《沁园春*长沙》。
2.2 语音信号的读入与打开
在Matlab中,[y,fs,bits]=wavread('Blip',[N1 N2]);用于读取语音,采样值放在向量y中,fs表示采样频率(Hz),bits表示采样位数。[N1 N2]表示读取的值从N1点到N2点的值。
sound(y); 用于对声音的回放。向量y则就代表了一个信号,也即一个复杂的“函数表达式”,也可以说像处理一个信号的表达式一样处理这个声音信号。
下面是语音信号在MATLAB中的语言程序,它实现了语音的读入与打开,并绘出了语音信号的波形频谱图。
Matlab的M文件:
[x,fs,bits]=wavread('C:\\Users\\Day\\Desktop\\02120011.wav');
sound(x,fs,bits);
X=fft(x);
subplot(221);plot(x);title('原始信号波形');
subplot(222);plot(X); title('原始信号频谱');
subplot(223);plot(abs(X));title('原始信号幅值');
subplot(224);plot(angle(X));title('原始信号相位');
程序运行可以听到自己录制的声音,得到的结果如图2.2.1所示:
2.2.1 语音信号的读入与打开
2.2.2 用Matlab得出fs,bits的值
2.3 取不同采样频率得出的波形比较
在Matlab中,resample函数用于改采样的频率,Y=resample(X,P,Q)表示对X取P/Q倍的原始采样频率,P,Q,必须为正整数。
1) fs=22050hz:(y=resample(x,1,2);)
2.3.1 采样频率fs=22050hz的波形
2) fs=11025hz: (y=resample(x,1,4);)
2.3.2 采样频率fs=11025hz的波形
3) fs=5512.5hz: (y=resample(x,1,8);)
2.3.3 采样频率fs=5512.5hz的波形
4) fs=2756.25hz:(y=resample(x,1,16);)
2.3.4 采样频率fs=2756.25hz的波形
分析:
随着采样频率的降低,录制的声音音调变得越来越高,语速也将越来越快,fs=22050hz时自己的声音特别像当红动画《神偷奶爸》里的小黄人的声音,让人捧腹。当采样频率降到1/4的时候已经听不出录制的诗词了,当采样频率降到1/128的时候已经听不到声音了。
三、 对女声、男声语音信号特点的分析
选择男声的信号文件(vmale.wav)是截取一首歌曲《直到世界的尽头》的副歌部分,女声的信号文件(vfemale.wav)是截取一首歌曲《I Will Always Love You》的副歌部分,通
过时序分析和频域分析进行比较。
3.1 女声(vfemale.wav)男声(vmale.wav)的时域分析:
3.2 女声(vfemale.wav)男声(vmale.wav)的频域分析:
Matlab的M文件:
[y1,fs1,bits1]=wavread('C:\\Users\\Day\\Desktop\\vfemale.wav');
[y2,fs2,bits2]=wavread('C:\\Users\\Day\\Desktop\\vmale.wav');
fs1=44100;
fs2=44100;
Y1=fft(y1);
Y2=fft(y2);
df1=fs1/length(Y1);
fx1=df1*(0:length(Y1)-1);%将横轴变成频率轴
df2=fs2/length(Y2-1);
fx2=df2*(0:length(Y2)-1);
subplot(211);plot(fx1,abs(Y1));
axis([0 5000 0 10000]);
title('女声语音频域幅值波形');xlabel('frequency/Hz');
subplot(212);plot(fx2,abs(Y2));
axis([0 5000 0 10000]);
title('男声语音频域幅值波形'):xlabel('frequency/Hz');
分析男声和女声的差别,女声的音调比男生高一些,根据声音的特点,得知音调由频率决定,从图中可以看出,女声频率集中在1000Hz,男声频率集中在200Hz。基于此特点,可以通过程序初步判断一段音频是男声还是女声。
四、 加噪声与滤波处理分析
4.1 高斯白噪声(SNR=30)
Matlab的M文件:
[x1,fs,bits]=wavread('C:\\Users\\Day\\Desktop\\02120011.wav');
y1=fft(x1);
x2=awgn(x1,30);
%sound(x2,fs,bits);
y2=fft(x2+x1);
f=0:fs/44100:fs/44100*44099;
subplot(221);plot(x1);title('原始语音信号的时域波形');
subplot(222);plot(x2);title('加入高斯白噪声语音信号的时域波形');
subplot(223);plot(abs(y1));title('原始语音信号的频域幅值波形');
subplot(224);plot(abs(y2));title('加入白噪声语音信号的频域幅值波形');
4.2 单频正弦噪声
Matlab的M文件:
[x1,fs,bits]=wavread('C:\\Users\\Day\\Desktop\\02120011.wav');
[team,row]=size(x1);
if row==2 道
%判别x1是双声道信号吗,是就通过取两列信号的平均值来变成单声
x1=(x1(:,1)+x1(:,2))/2;
end
y1=fft(x1,44100);
N=length(x1)-1;
t=0:1/44100:N/44100;
d=[0.009*sin(6*pi*5000*t)]';
x2=x1+d;
%sound(x2,fs,bits);
y2=fft(x2,44100);
%f=0:fs/44100:fs/44100*44100;
subplot(221);
plot(x1);title('原始语音信号的时域波形');
subplot(222);
plot(x2);title('加入单频正弦语音信号时域波形');
subplot(223);
plot(abs(y1));title('原始语音信号的频域幅值波形');
subplot(224);
plot(abs(y2));title('加入单频正弦语音信号频域幅值波形');
五、 心得与体会
在分析,采样,加噪声的过程中,在对程序的理解和使用上遇到了很多困难,通过Matlab论坛和百度一一查阅理解。遇到最大的困难就是在给语音信号加上单频正弦噪声时总是会出现这样的错误:
一开始的程序如下:
[x1,fs,bits]=wavread('C:\\Users\\Day\\Desktop\\02120011.wav');
y1=fft(x1,44100);
N=length(x1)-1;
t=0:1/44100:N/44100;
d=[0.009*sin(6*pi*5000*t)]';
x2=x1+d;
%sound(x2,fs,bits);
y2=fft(x2,44100);
%f=0:fs/44100:fs/44100*44100;
subplot(221);
plot(x1);title('原始语音信号的时域波形');
subplot(222);
plot(x2);title('加入单频正弦语音信号时域波形');
subplot(223);
plot(abs(y1));title('原始语音信号的频域幅值波形');
subplot(224);
plot(abs(y2));title('加入单频正弦语音信号频域幅值波形');
经过对语音信号的分析和咨询他人之后,问题为此程序是处理单声道语音信号的,却没有预先判别信号是否为单声道就直接加噪声,从而导致x1为2维列向量,而d为一维列向量。解决办法是加上一段程序
[team,row]=size(x1);
if row==2 %判别x1是双声道信号吗,是就通过取两列信号的平均值来变成单声道
x1=(x1(:,1)+x1(:,2))/2;
end
参考文献:
[1] 王祯飞 《基于MATLAB 的语音信号分析和处理》 福建师范大学协和学院