语音信号线性预测分析

更新时间:2023-06-02 17:43:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《视频语音处理技术》

语音信号线性预测分析

学院名称: 计算机与信息工程学院 专业名称: 计算机科学与技术 年级班级:

姓 名:

学 号:

计算机与信息技术学院综合性、设计性实验报告

一、实验目的:

综合采用各种线性预测分析的方法,能够达到预测更为准确。要求掌握各种下列语音信号线性预测分析技术,提高学生数字语音信号处理的能力。利用MATLAB编程环境和强大的处理功能,实现语音信号线性预测。主要训练如下的项目从而获得线性预测的综合能力:

1、LPC方程的自相关解法。 2、LPC参数到LSP参数的转换。 3、LSP参数到LPC参数的转换。 4、LPC参数到ISP参数的转换。

二、实验仪器或设备:windowsXP下的Matlab编程环境 三、总体设计(设计原理、设计方案及流程等)

线性预测编码原理:利用过去的样值对新样值进行预测,然后将样值的实际值与其

预测值相减得到一个误差信号,显然误差信号的动态范围远小于原始语音信号的动态范围,对误差信号进行量化编码,可大大减少量化所需的比特数,使编码速率降低。

1.LPC方程的自相关解法

利用对称托普利兹(Toeplitz)矩阵的性质,自相关法求解可用Levinson-Durbin(莱文逊-杜宾)递推算法求解。该方法是目前广泛采用的一种方法。利用Levinson-Durbin算法递推时,从最低阶预测器开始,由低阶到高阶进行逐阶递推计算。 自相关法递推过程如下:

E 0 r 0 Ei (1 ki2)E(i 1)

ki r(i)- a

j 1

i-1

(i-1)

j

r(i j) E(i 1) , 1 i p

(i)a ki i

i 1) i 1

a( -ka, 1 j i 1jii j

p) a( , 1 j p j

a(i)

j

联立左面5式可对i=1、2…、p进行递推求解,其最终解为 aj

对于p阶预测器,在上述求解预测器系数的过程中,阶数低于p的各阶预测器系数也同时得到。

2、LPC参数到LSP参数的转换。

将P(z)和Q(z)中与LSP系数无关的两个实根取得到如下两个新的多项式

p2pP(z) 1j i 1 j i

P (z) (1 ze)(1 ze) (1 2cos iz 1 z 2) 1 1 zi 1i 1

p2p2

Q(z) 1j i 1 j i

Q (z) (1 ze)(1 ze) (1 2cos iz 1 z 2) 1

i 1i 1

1 z

从LPC系数到LSP系数的转换过程,其实就是求解使以上两式等于零时的 cos 、cos

i

i

的值。可采用以下几种方式求解。 第一种方法:利用代数方程式求解。 由 令 根据

1 2cos iz 1 z 2 2z 1(0.5z cos i 0.5z 1)

2z 1[0.5(z z 1) cos i]

z ej

ej cos jsin

z z 1 2cos 2x

第二种方法:离散傅立叶变换(DFT)方法

P (z)和 Q (z)系数求离散傅立叶变换,得到 对

jk zk exp( , k 0、1、 、N 1 N

各点的值,搜索最小值的位置,即是零点所在。由于除了0和 之外,总共有p个零点,

P (z)和 Q (z)的根是相互交替出现的,而且 因此只要很少的计算量即可解得,其中N

的取值取64~128就可以

第三种方法:利用切比雪夫(Chebyshev)多项式求解

z

ej

p

j

p

则 P (z)Q (z)可以写作 P (z) 2e

C(x)

j

Q (z) 2eC(x)

其中

pp

C(x) Tp(x) f(1)Tp(x) f(2)Tp(x) f( 1)T1(x) f() 1 222222

Tm(x) cosmx

(zQ)P ( z)是m阶的Chebyshev多项式 。f(i)是由递推关系计算得到的和 的每个系

数。

用下面的递推关系

f1(i 1) ai 1 ap i f1(i)

f2(i 1) ai 1 ap i f2(i)f1(0) f2(0) 1.0其中 。

多项式C(x)在x=cos 时的递推关系是:

i 0, 1, , p2

fork

p

12

to1p2

k 2x k 1 k 2 f( k)

end

p

C(x) x 1 2 f()2

p 1 p 0其中初始值第四种方法:

1

将0~ 之间均分为60个点,以这60个点的频率值代入(6-41)、(6-42)式,检查它们的符号变化,在符号变化的两点之间均分为4份,再将这三个点频率值代入方程(6-41)、(6-42),符号变化的点即为所求的解。这种方法误差略大,计算量较大,但程序实现容易。

3、LSP参数到LPC参数的转换

p (i)( z)( z) 已知量化和内插的LSP系数 ,可用下式计算 P 和 Q 的系数

和 :

p2p2

P(z) 1j i 1 j i 1 2

P (z) (1 ze)(1 ze) (1 2cos z z)i

1 z 1i 1i 1pp2Q(z) 1j i 1 j i 1 2

Q (z) (1 ze)(1 ze) (1 2cos z z)i

1 z 1i 1i 1

以下的递推关系可利用qi,i=0、1…、p-1,来计算 p (i)

for i 1 to p2

p (i) 2q2i 1p (i 1) 2p (i 2) for j i 1 to 1

p (j) p (j) 2q2i 1p (j 1) p (j 2) endend

2i 1

2i 1

p (0) 1其中 ,初始值 q cos

根据 p (i),

q (i) p1(i)

p ( 1) 0

把上面递推关系中的q2i-1替换为q2i,就可以得到

q (i)

P(z)和 Q(z)

P (z)和

Q (z)

p (i) p (i 1), i 1 , 2 ,, p2

i 1 , 2 ,, p2 q1(i) q (i) q (i 1),

1

A(z) [P(z) Q(z)]得到LPC系数为 利用2

i 1 , 2 ,, p 0.5p1(i) 0.5q1(i) ,

ai

i p2 1 ,p2 2 , ,p 0.5p1(p 1 i) 0.5q1(p 1 i) ,

4、LPC参数到ISP参数的转换。

语音编码时,可将LPC系数转换为ISP系数以进行量化和内插。 LPC系数与ISP系数之间的转换与LSP类似。从LPC转换为ISP系数时,首先应用求解LSP参数的方法求解出前p-1个ISP系数,再给第p个参数赋上合适的值,即可得到ISP系数。解码时,首先根据量化ISP系数得到p-1个LPC系数,再根据第p个ISP系数得到最后一个LPC系数。

2

四、实验步骤(包括主要步骤、代码分析等)

1.下面给出从LPC参数到LSP参数转换的MATLAB程序:

a_lsf_main.m

% 已知语音文件求出其LPC系数后,调用a_lsfLconversation.m函数求其对应的LSF

% a_lsf_main.m

clear;close all% 将所有变量置为0 clc% 清除命令窗口

fid=fopen('sx86.txt','r'); p1=fscanf(fid,'% f'); fclose(fid);

p=filter([1 -0.68],1,p); % 预加重滤波 x=fra(320,160,p); % 分帧,帧移为160个样点 x=x(60,:); % 取第60帧作为分析帧 N=16% 给线性预测分析的阶次赋值

a1=lpc(x,N);% 调用MATLAB库函数中的lpc函数求解出LPC系数a1 % 此处也可以调用本章赋的函数lpc_coeffi-

% cients(s,p),调用语句为a1=lpc_coefficients(x,N) a=a1(:);% 将线性预测系数a1赋给矩阵a

lsf=a_lsf_conversion(a);% 调用函数a_lsf_conversion实现从LPC系数到LSF参数 % 转换

% lsf=poly21lsf(a);% 也可调用MATLAB库函数中的poly21lsf(a)函数求解出LSF系数,调用

% 结果为归一化角频率

lsf_abnormalized=lsf.*(6400/3.14);% 将求得的lsf参数反归一化到 % 0~6400Hz

% 使用时可根据实际需要进行更改,如窄带语言编码语音信号频带范围为300~3400Hz,此时

% 就需要将6400Hz改为3400Hz

% 将求得的归一化、反归一化lsf参数输出到文本文件:从lpc系数解得的lsf参数.txt fid= fopen('从lpc系数解得的lsf参数.txt','w'); fprintf(fid,'归一化的lsf:\n'); fprintf(fid,'%6.2f,',lsf); fprintf(fid,'\n');

fprintf(fid,'反归一化的lsf:\n'); fprintf(fid,'% 8.4f,',lsf_abnormalized); fclose(fid); % EOF a_lsf_main.m

函数 a_lsf_conversion 的MATLAB程序见 a_lsf_conversion.m. % 程序 a_lsf_conversion.m. function lsf=a_lsf_conversion(a)

%如果a不是实数,输出错误信息:LSF不适用于复多项式的求解 if~isreal(a),

error('Line spectral frequencies are not defined for complex

polynomials.');

end

% 如果a(1)不等于1,将其归一化为1 if a(1)~=1.0,

a=a./a(1);% 将矩阵a的每个元素除以a(1)在赋给矩阵a end

% 判断线性预测多项式的跟是否都在单位园内,如果不在,则输出错误信息 if (max(abs(roots(a)))>=1.0),

error('The polynomil must have all roots inside of the unit circle.'); end

% 求对称和反对称多项式的系数

p=length(a)-1; % 求对称和反对称多项式的阶次 a1=[a;0]; % 给行矩阵a再增加一个元素为0的行

a2=a1(end:-1:1); % a2的第一行为a1的最后一行,最后一行为a1的第一行 p1=a1+a2; % 求对称多项式的系数 Q1=a1-a2; % 求反对称多项式的系数

% 如果阶次p为偶数次,从p1取掉实数根z=-1,从Q1去取掉实数根z=1 % 如果阶次p为奇数次,从Q1去取掉实数根z=1及z=-1

if rem(p,2),% 求解p除以2的余数,如果p为奇数次,余数为1,否则为0 Q=deconv(Q1,[1 0 -1]);% 奇数阶次,从Q1取掉实数根z=1 p=p1;

else % p为偶数阶次执行下面操作 Q=deconv(Q1,[1 -1]);% 从Q1取掉实数根z=1 p=deconv(P1,[1 1]);% 从P1取掉实数根z=-1 end

rp=roots(P);% 求去掉实根后的多项式P的根 rQ=roots(Q);% 求去掉实根后的多项式Q的根

aP=angle(rp(1:2:end));% 将多项式P的根转换为角度(为归一化角频率)赋给ap aQ=angle(rQ(1:2:end));% 将多项式Q的根转换为角度(为归一化角频率)赋给aQ lsf=sort([aP;aQ]);% 将P、Q的根(归一化角频率)按从小到大顺序排序后即为lsf % EOF a_lsf_conversion.m

其中a_lsf_conversion.m为求解LSF的函数,a_lsf_main.m为主程序。由于MATLAB

P (z)和 Q (z)零点时直接调用即可,这程序本身有求多项式根的函数,因此在求解

极大简化了求解过程。

2.LPC转换为ISP系数的MATLAB程序和ISP系数转换为LPC的MATLAB程序

a_isf_lpc_conversion.m

%已知语音文件求出其LPC系数后,求其对应的ISF,再将ISF转换为a。其中isf为转换

后的ISF值,a为isf转换后的lpc系数

clear;close all clc

fid=fopen('sx86.txt','r'); p1=fscanf(fid,'% f') fclose(fid);

p=filter([1-0.68],1,p1);%预加重滤波 x=fra(320,160,p); x=x(60,:); a3=lpc(x,15);

a4=a3(:);%将线性预测系数赋给矩阵a

lsf=a_lsf_conversion(a4);%调用函数a_lsf_conversion实现从LPC系数到lsf参数的转换

%函数a_lsf_conversion()的MATLAB程序见本章6.6.2节所赋程序,此处也可调用MATLAB自带的

%库函数lsf=poly21sf(a4); isf=lsf;

isf(16,1)=0.5*acos(a4(16,1));

%isp的最后一个参数取为a的最后一个参数,isf的最后一个参数取为0.5*acos(a4(16,1))

%下面是从isf求a的程序,其中前p-1个a参数根据前p-1个isf参数得到,最后一个a参数根据isf的第p个参数得到

isf1=isf(1:(size(isf)-1),:);%将isf前p-1个参数赋给isf1

a2=lsf_lpc_conversion(isf1)%调用函数lsf_lpc_conversion实现从lsf参数到LPC系数的转换

a2(1,16)=cos(2*isf(16,1));%最后一个a参数根据isf的第p个参数得到 a=a2;%将转换得到的lpc系数赋给a %EOFa_isf_lpc_conversion.m

a_isf_lpc_conversion_20frame.m

clear;close all clc

fid=fopen('sx86.txt','r'); p1=fscanf(fid,'%f') fclose(fid);

p=filter([1-0.68],1,p1);%预加重滤波 x1=fra(320,160,p); for i=60:79 x=x1(i,:) a3=lpc(x,15);

a4=a3(:);%将线性预测系数付给矩阵a4

lsf=a_lsf_conversion(a4)%调用函数a_lsf_conversion实现从LPC系数到lsf参数的转换

isf=lsf;

isf(16)=0.5*acos(a4(16,1));%isp的最后一个参数取为a的最后一个参数,isf的最后一个参数取为0.5*acos(a4(16,1))

isp=cos(isf);

hold on%让连续20帧isp及isf绘制在一个图形中 figure(1); for j=1:16

isf2(i-59,j)=isf(j); end figure(2); plot(isp) end

%EOF a_isf_lpc_conversion_20frame.m 运行结果:

连续20帧语音信号的ISP轨迹图

连续20帧语音信号的ISF轨迹图

五、结果分析与总结

1.线性预测分析的基本思想是:一个语音取样的现在值可以用若干个语音取样过去值的加权线性组合来逼近。线性预测基本原理是建立在语音的数字模型基础上,为估计数字模型中的参数,线性预测法提供了一种可靠精确而有效的方法。

2.在上机实验的过程中,应注意避免一些小细节处的失误,提高效率。

教师签名:

年 月

本文来源:https://www.bwwdw.com/article/rj01.html

Top