基于信号分析与处理的语谱图显示
1 语谱图
语音的发音过程中, 声道通常都是处于运动状态的, 因此它的共振峰特性也是时变的。不过这个时变过程比起振动过程来说要缓慢得多, 因此一般可以假定它是短时平稳的, 每一时刻我们都可以用这时刻附近的一短段( 例如15ms) 语音信号分析得到一种频谱。对语音信号连续地进行频谱分析就可以得到一种二维图谱短时傅里叶变换matlab程序, 其横坐标表示时间, 纵坐标表示频率, 而每像素的灰度值大小反映相应时刻和相应频率的信号能量密度。这种时频图称为语谱图( Sonogram 或Spectrogam), 这种反映语音信号动态频谱特性的时频图在语音分析中有重要实用价值, 被视为可视语言。从语谱图上不仅能看出任一时刻发音器官的共振峰特征,而且可以看出语音的基音频率, 是否清音、爆破音等。语谱分析在语音识别、合成及编码中很有意义。
1.1 语谱图的产生基理
语音信号是一种典型的非平稳信号, 但是其非平稳性是由发音器官的物理运动过程而产生的, 此过程与声波振动的速度相比较缓慢, 可以假定在10~30ms这样的短时间内是平稳的。傅立叶分
析是分析线性系统和平稳信号稳态特性的强有力的手段, 而短时傅里叶分析, 也叫时间依赖傅立叶变换, 就是在短时平稳的假定下, 用稳态分析方法处理非平稳信号的一种方法。
设离散时域采样信号为x(n), n=0,1,⋯,N- 1, 其中n 为时域采样点序号, N 是信号长度。然后对信号进行分帧处理, 则x(n)表示为xn(m), n=0,1,⋯,N- 1, 其中n 是帧序号, m 是帧同步的时间序号, N 为帧长( 一帧内的采样点数) 。信号{x(n)}短时傅里叶变换为:
其中{w(n)}为窗序列, 则信号x(n)的离散时域傅里叶变换(DTFT) 为:
采用离散傅里叶变换(DFT)得:
则P(n,k)是二维的非负实值函数, 并且不难证明它是信号x(n)的短时自相关函数的傅里叶变换。用时间n 作为横坐标, k 作纵坐标, 将P(n,k)的值表示为灰度级所构成的二维图像就是语谱图。通过变换10log10(P(n,k))能得到语谱图的dB 表示。
2.相关MATLAB 功能函数
2.1 用于短时频谱分析的功能函数
1) 分帧加窗函数: 下面程序中采用的是hanning窗。根据要求还可选用hamming(N),blackman(N)及bartlett(N), 其中N 为窗长( 帧长) 。
2) 快速傅里叶变换函数: fft(s)。s 为加窗后的一帧信号。因为实时信号FFT 的频域样值关于
中点(即采样频率的1/2)对称, 所以fft(s)给出的矩阵数据只有前半部分有用。
3) 复数取共扼函数: conj(z)。
2.2 伪彩映射和语谱图显示的功能函数
1) 伪彩映射函数: colormap(MAP)。其中MAP 是所采用的伪彩映射矩阵, 默认值为JET, 可以通过MAP=colormap 获得当前的伪彩映射矩阵, 它可以是一个任意行的矩阵, 但其必须有且只有三列, 并分别表示红、绿和蓝的饱和度。
2) 频谱图显示函数: imagesc(t, f, L)。当数据比例映射使用整个域时使用该函数, 其它情况下与image()函数作用相同。其中t 是时间坐标, f 是频率坐标,L 则是从功率谱值经伪彩映射后的彩电平值。
3 流程图及实现程序
3.1流程示意图:
3.2源程序:
function sogram(Winsiz,Shift,Base,Mode,Gray)
Winsiz=1024;
Shift=64;
Base=0;
Mode=1;
Gray=64;
[Sg,Fs]=wavread('E:\大家好.wav');
n=floor((length(Sg)-Winsiz)/Shift)+1;
A=zeros(Winsiz/2+1,n);
for i=1:n
n1=(i-1)*Shift+1;
n2=n1+(Winsiz-1);
Sg=Sg(:,1);
s=Sg(n1:n2);
s=s.*hanning(Winsiz);
z=fft(s);
z=z(1:(Winsiz/2)+1);
z=z.*conj(z);
z=10*log10(z);
A(:,i)=z;
end
L0=(A>Base);
L1=(A<Base);
B=A.*L0+Base*L1;
L=(B-Base)./(max(max(B))-Base);
y=[0:Winsiz/2]*Fs/Winsiz;
x=[0:n-1]*Shift;
if Mode==1
colormap('default');
else
mymode=gray;
mymode=mymode(Gray:-1:1,:);
colormap(mymode);
end
imagesc(x,y,L);
axis xy;
3.3 程序中参数说明
Wavnam: 定义待分析信号的路径及文件名。语音信号由计算机声卡录制, 以.wav 格式存储。程序中wavread(Wavnam)读入的语音信号样值赋给矩阵Sg, 也即待分析信号x(n), 采样频率赋给Fs。Winsiz: 定义帧长, 一般应取2 的幂次, 其目的是适合FFT 的要求。通过对Winsiz 的选值可实现宽带频谱或窄带频谱的选择。Shift: 定义帧移值。一般此值小于或等于Winsiz。Shift 值越小, 时域分辨率越高。Base: 基准电平值。注意, 此值的设定需根据实际经验, 可以通过在多次运行此程序中给出不同的Base 值, 观察所获得的频图
的视觉和分辨率效果, 选择一个合适的Base 值, 如果没有特别要求, 可取默认值Base=0。Mo
de: 定义显示模式。1 伪彩映射, 0 为灰度映射。上述程序中, 伪彩映射采用默认值' default' 也即jet, 可选的其它映射还有: bone, cool , copper, flag, hot,hsv, pink, prism。Gray: 灰度显示层数, 当Mode=0 时有效, 且Gray 只能在1~64 间取值, 为了获得较好灰度显示效果, 一般取值64。
4 语谱图显示与分析
语谱图中的花纹有横杠、乱纹和竖直条等。横杠是与时间轴平行的几条深黑带纹, 它们是共振峰。从横杠对应的频率和宽度可以确定相应的共振峰频率和带宽。在一个语音段的语谱图中, 有没有横杠出现是判断它是否是浊音的重要标志。竖直条( 又叫冲直条) 是语谱图中出现与时间轴垂直的一条窄黑条。每个竖直条相当于一个基音, 条纹的起点相当于声门脉冲的起点, 条纹之间的距离表示基音周期。条纹越密表示基音频率越高。
此图为‘大家好’的语谱图显示。Winsiz=1024,Shift=64, Base=0, Mode=1, Gray=64。
此图为灰度映射图, 且窗长较短, 可以获得较高的时间分辨率。
结论:本文叙述了语谱图的产生, 以及如何在MATLAB中编程绘出它的伪彩图及灰度图的方法。当Mode=1时为伪彩映射,Mode=0时为灰度映射。语谱图的高度表示其频率,宽度表示采样点长度。通过计算机声卡, 可以很方便的完成语音录制, 又由于MATLAB有很丰富的
功能函数和方便的绘图功能, 通过编程很容易在普通PC 机上快速实现语谱图显示, 为
进一步语音信号处理提供便利条件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论