图2-1
2.3.2 语音信号的录制
利用软件
HA_GoldWave可以进行语音信号的录制。选择录制时间为5秒钟。点击放音
按钮,可以实现所录音的重现。以文件名“wangwei”保存入c :\\ MATLAB \\ work中。可以看到,文件存储器的后缀默认为. wav ,
2.4语音信号的时频分析
2.4.1 FFT概念
傅立叶变换是数字信号处理领域一种很重要的算法。要知道傅立叶变换算法的意义,首
先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位 傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
2.4.2 FFT的MATLAB实现:
在MATLAB的信号处理工具箱中函数FFT和IFFT用于快速傅立叶变换和逆变换。下面
11
介绍这些函数。
函数FFT用于序列快速傅立叶变换。 函数的一种调用格式为 y=fft(x)
其中,x是序列,y是序列的FFT,x可以为一向量或矩阵,若x为一向量,y是x的FFT。且和x相同长度。若x为一矩阵,则y是对矩阵的每一列向量进行FFT。如果x长度是2的幂次方,函数fft执行高速基-2FFT算法;否则fft执行一种混合基的离散傅立叶变换算法,计算速度较慢。
函数FFT的另一种调用格式为y=fft(x,N)
式中,x,y意义同前,N为正整数。函数执行N点的FFT。若x为向量且长度小于N,则函数将x补零至长度N。若向量x的长度大于N,则函数截短x使之长度为N。若x 为矩阵,按相同方法对x进行处理。
经函数fft求得的序列y一般是复序列,通常要求其幅值和相位。MATLAB提供求复数的幅值和相位函数:abs,angle,这些函数一般和 FFT同时使用。
函数abs(x)用于计算复向量x的幅值,函数angle(x)用于计算复向量的相角。 用MATLAB工具箱函数fft进行频谱分析时需注意: (1)函数fft返回值y的数据结构对称性
一般而言,对于N点的x(n)序列的FFT是N点的复数序列,其点n=N/2+1对应Nyquist频率,作频谱分析时仅取序列X(k)的前一半,即前N/2点即可。X(k)的后一半序列和前一半序列时对称的。
(2)频率计算
若N点序列x(n)(n=0,1,?,N-1)是在采样频率下获得的。它的FFT也是N点序列,即X(k)(k=0,1,2,?,N-1),则第k点所对应实际频率值为f=k*f /N.
(3)作FFT分析时,幅值大小与FFT选择点数有关,但不影响分析结果。 利用MATLAB中的“wavread”命令来读入(采集)语音信号,将它赋值给某一向量。再对其进行采样,记住采样频率和采样点数。
下面介绍Wavread 函数几种调用格式。 (1)y=wavread(file)
功能说明:读取file所规定的wav文件,返回采样值放在向量y中。 (2)[y,fs,nbits]=wavread(file)
功能说明:采样值放在向量y中,fs表示采样频率(hz),nbits表示采样位数。 (3)y=wavread(file,N)
功能说明:读取钱N点的采样值放在向量y中。 (4)y=wavread(file,[N1,N2])
功能说明:读取从N1到N2点的采样值放在向量y中。 接下来,对语音信号wangwei.wav进行采样。其程序如下:
12
>> [y,fs,nbits]=wavered (‘wangwei’); %把语音信号加载入Matlab 仿真软件平台中
然后,画出语音信号的时域波形,再对语音信号进行频谱分析。MATLAB提供了快速傅里叶变换算法FFT计算DFT的函数fft,其调用格式如下:
Xk=fft(xn,N)。在本次设计中,我们利用fft对语音信号进行快速傅里叶变换,就可以得到信号的频谱特性。
我们还可以通过sound命令来对语音信号进行回放,以便在听觉上来感受声音的变化。sound(x,fs,bits); 用于对声音的回放。向量y则就代表了一个信号(也即一个复杂的“函数表达式”)也就是说可以像处理一个信号表达式一样处理这个声音信号。下面的一段程序是语音信号在MATLAB中的最简单表现,它实现了语音的读入打开,以及绘出了语音信号的波形频谱图。 其程序如下:
[y,fs,bits]=wavread('wangwei.wav'); sound(y,fs) n=length(y)
y_p=fft(y,n); %用傅里叶变换到频域 f=fs*(0:n/2-1)/n; %频率序列 figure(1) subplot(2,1,1); plot(y);
title('原始语音信号采样后的时域波形'); xlabel('点数') ylabel('幅值A') subplot(2,1,2);
plot(f,abs(y_p(1:n/2)));
title('原始语音信号采样后的频谱图'); xlabel('点数'); ylabel('频率幅值');
程序运行可以听到声音,得到的图形为:
13
图2-2
2.5语音信号加噪与频谱分析
2.5.1 正弦波信号加入原始语音信号
前面已经介绍了MATLAB软件相关知识,那么我们怎么在MATLAB平台上实现对一段原始语音信号加入一个正弦波信号呢?
下面一段程序实现了在原始语音信号加入正弦波信号。程序见附录5
分析此段程序可知,此程序是先对原始语音信号做时域波形分析和频谱分析,然后再对加噪的语音信号做时域波形分析和频谱分析。
首先通过MATLAB中调用和回放语音信号命令来实现对原始语音信号的调用和回放,程序如下:
[y,fs,bits]=wavread('wangwei.wav');
sound(y,fs)
由于在MATLAB中,如要实现两个信号的相加减,那么两个信号的长度和维度都要一样才能相加减。程序中:n=length(y) ,用于计算信号的长度和选取变换的点数。然后用傅里叶变换到频域:y_p=fft(y,n);通过函数 f=fs*(0:n/2-1)/n;计算出对应点的点数,然后绘制出原始语音信号的时域波形和频谱图。图形如下:
14
图 2-3
上段程序中,函数noise是频率为3000Hz的正弦波信号噪音,语句y_z=y+noise实现了两个信号的相加,然后绘制加噪后的语音信号时域波形和频谱图并回放加噪后的语音信号。加噪后的时域波形和频谱图如下:(图)
15