【语音分析】基于matlab语音线谱对转换【含Matlab源码 560期】
作者:互联网
一、简介
线谱对分析是一种频域参数分析方法,这种LPC方法求解的模型参数为线谱对(LSP, Line Spectrum Pair)。LSP在数学上等价于其他LPC参数,如αi。如将声道视为由P+1段声管级联而成,则LSP表示声门完全开启或完全闭合下声管的谐振频率。它也可以用于估计语音的基本特性。因为其为频域参数,因而与语音信号的谱包络的峰联系更为密切。同事LSP有良好的量化和差值特性,因而在LPC声码器中得到应用。目前,表示LPC参数最有效的方式为LSP,它的一些特性比其他系数更有吸引力。
LPC分析与格型法分析类似,也是以全极点模型为基础。线谱对分析的基本出发点是通过两个z变换P(z)和Q(z),将A(z)(误差传递函数)的P个零点映射到单位圆上,以使这些零点直接用频率w反应,而P(z)和Q(z)各提供P/2个零点频率。LSP参数的求解有代数方程式求根和DFT方法等。
二、源代码
clear all; clc; close all;
[x,fs]=wavread('C3_6_y.wav');
x=x/max(abs(x)); % 幅值归一化
time=(0:length(x)-1)/fs; % 求出对应的时间序列
N=200; % 设定帧长
M=80; % 设定帧移的长度
xn=enframe(x,N,M)'; % 按照参数进行分帧
s=xn(:,100); % 取分帧后的笫100帧进行分析
p=12; % 设预测阶次
num=256; % 设定频谱的点数
a2 =lpc(s,p); % 利用信号处理工具箱中的函数lpc求预测系数a2
Hw=lpcff(a2,num-1); % 调用lpcar2ff函数从预测系数a求出LP谱Hw
Hw_abs=abs(Hw); % 取Hw的模值
lsf=lpctolsf(a2); % 调用ar2lsf函数把ar系数转换的lsf参数
P_w=lsf(1:2:end); % 用lsf求出P和Q对应的频率,单位为弧度
Q_w=lsf(2:2:end);
P_f=P_w*fs/2/pi; % 转换成单位为Hz
Q_f=Q_w*fs/2/pi;
subplot 211; plot(s,'k'); % 画出一帧信号的波形
title('(a)语音信号C3\_6\_y.wav的一帧波形图 ');
xlabel(['样点值' 10 ]); ylabel('幅值')
freq=(0:num-1)*fs/512; % 计算频域的频率序列
m=1:num;
K=length(Q_w);
ar=lsftolpc(lsf); % 调用lsf2ar函数把lsf转换成预测系数ar
Hw1=lpcff(ar,num-1); % 调用lpcar2ff函数,从预测系数ar求出LP谱Hw1
Hw1_abs=abs(Hw1);
subplot 212; % 把Hw和Hw1画在一个图中
hline1 = plot(freq,20*log10(Hw_abs(m)/max(Hw_abs)),'k','LineWidth',2);
hline2 = line(freq+1,20*log10(Hw1_abs(m)/max(Hw1_abs)),...
'LineWidth',5,'Color',[.6 .6 .6]);
set(gca,'Children',[hline1 hline2]);
axis([0 fs/2 -35 5]);
title('(b)语音信号的LPC谱和线谱对还原LPC的频谱 ');
xlabel(['频率/Hz' 10]); ylabel('幅值')
for k=1 : K % 把P_f和Q_f也在图中用垂直线标出
line([Q_f(k) Q_f(k)],[-35 5],'color','k','Linestyle','--');
line([P_f(k) P_f(k)],[-35 5],'color','k','Linestyle','-');
end
三、运行结果
四、备注
版本:2014a
标签:lsf,LSP,Hw,线谱,abs,语音,LPC,源码,Hw1 来源: https://blog.51cto.com/u_15287606/2975926