ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【语音分析】基于matlab语音线谱对转换【含Matlab源码 560期】

2021-07-05 09:57:34  阅读:230  来源: 互联网

标签:lsf LSP Hw 线谱 abs 语音 LPC 源码 Hw1


一、简介

线谱对分析是一种频域参数分析方法,这种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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有