信息技术综合实验-实验二-语音编码实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告实验名称语音编码实验
课程名称信息处理技术专业综合实验
实验二 语音编码
一、实验目的
熟悉语音基本压缩编码的方法,观察语音压缩效果,加深对语音线性预测编码(LPC )的理解。

二、实验内容
1、编写并调试语音LPC 参数提取程序。

2、编写并调试语音基音周期提取程序。

3、编写并调试语音LPC 合成程序。

三、实验原理
语音信号中含有大量的冗余信息,采用各种信源编码技术减除语音信号的冗余度,并充分利用人耳的听觉掩蔽效应,就可以将其编码速率压缩很多倍,而仍能提供可懂语音。

LPC 声码器是一种比较简单实用的语音压缩方法,其基本原理是:根据语音生成模型,将语音看作激励源通过一个线性时不变系统产生的输出,利用线性预测分析对声道参数进行估值,将求得的线性预测系数,结合基音周期等少量参数进行传输,就可以在接收端利用合成滤波器重构语音信号。

线性预测系数的估计方法为:
假设语音的当前样值可以用过去的M 个语音样值来进行预测
()()()()()
∑=-=-++-+-=M
i i M i n x a M n x a n x a n x a n x 1
2121~
式中{}i a 即为线性预测系数。

实际值和预测值之间的均方误差可表示为
()()()∑∑∑⎪
⎭⎫ ⎝⎛--===n M
i i n i n x a n x n E 2
12
ε 要求均方误差总和最小,将E 关于i a 的偏导数设置为零,可以得到
()()()01=⎪⎭⎫ ⎝⎛---∑∑=M
i i n i n x a n x k n x
通过采用自相关法、协方差法或格形法求解该方程,即可得到最优的{}i a 。

四、实验方法及程序
1. 调用xcorr命令计算一帧语音的自相关函数。

2. 调用toeplitz命令形成该帧语音的自相关矩阵。

3. 调用durbin命令,采用杜宾递推算法计算该帧语音的线性预测系数。

4. 编写lpcauto.m函数,求取一句语音信号的线性预测系数及预测残差。

选择设当的窗函数对语音信号进行分幀。

5. 编写lpcpitch函数,由残差信号计算该句语音的基音周期。

6.编写lpcgain函数,由预测残差能量,求出该句语音的增益。

7. 编写lpcsyn函数,由该句语音的基音周期、预测残差能量和增益进行LPC合成。

五、实验结果与分析
1.如何对全极点模型的线性预测参数进行提取?加窗等预处理对提取结果有何影响?
2.如何实现线性预测参数的各种表现方式之间的转换?
3. 使用预测残差求基音周期有何优点?
4. 如何根据线性预测系数求得LPC频谱?
5. LPC频谱与基于DFT求得的语音对数幅度谱相比有何不同?
6. LPC合成语音的质量如何?有何改进措施?
实验过程记录与结果分析
1、计算短时自相关函数
1.1分别计算正弦信号和白噪声的短时自相关函数,估计正弦信号的基音周期。

其Matlab代码如下:
x=sin(2*pi*0.01*(0:499)');
[r,eta]=xcorr(x,100,'unbiased');
stem(eta,r);
w=randn(500,1);
[r,eta]=xcorr(w,100,'unbiased');
stem(eta,r);
-100-80-60-40-20020406080100
1.2计算正弦信号叠加白噪声的短时自相关函数,试估计正弦信号的基音周期。

其Matlab代码如下:
x=sin(2*pi*0.01*(0:499)');
w=randn(500,1);
x1=x+w;
[r,eta]=xcorr(x1,100,'unbiased');
stem(eta,r);
-100-80-60-40-20020406080100
1.3 分别画出一帧浊音和一帧清音的语音自相关波形(采样频率为10kHz,帧长为25.6ms,每帧有256个样点),估计浊音的基音周期。

load digits; x=digits.three1;
m=2756; N=256; n=m-N+1:m;
[r,eta]=xcorr(x(n),250,'unbiased');
plot(eta,r);
m=500; N=256; n=m-N+1:m;
[r,eta]=xcorr(x(n),250,'unbiased');
plot(eta,r);
-250
-200-150-100-50050100150200250
-3-2
-1012345
4
-250
-200
-150
-100
-50
50
100
150
200
250
-30-20-1001020304050
6070
2、求取LPC 系数
2.1加载“digits.three1”语音数据。

基于自相关法,求出其中一帧数据(采样频率为10kHz ,帧长为25.6ms ,每帧有256个样点)的14阶LPC 系数。

画出相应的LPC 谱。

load digits; x=digits.three1;
m=2756; N=256; n=m-N+1:m; M=14; [r,eta]=xcorr(x(n),250,'unbiased'); Rx=toeplitz(r(M+1:2*M)); rx=r(M+2:2*M+1); a=Rx\rx;
NFFT=1024; k=1:NFFT/2; X=fft(x(n).*hann(N),NFFT); Theta=1./fft([1:-a],NFFT);
plot(k,20*log10(abs([353*Theta(k)’ X(k)]))) axis([0 NFFT/2 -inf inf])
050100150200250300350400450500
10
203040506070
80
2.2编写一个用以实现杜宾递推算法的函数“durbin.m ”,其Matlab 代码如下: function [a,xi,kappa]=durbin(r,M) kappa = zeros (M,1);
a = zeros (M, 1);
xi=[r(1); zeros(M,1)];
for (j=1:M)
kappa(j)=(r(j+1)-a(1:j-1)'*r(j:-1:2))/xi(j);
a(j)=kappa(j);
a(1:j-1)=a(1:j-1)-kappa(j)*a(j-1:-1:1);
xi(j+1)=xi(j)*(1-kappa(j)^2);
end
2.3利用函数“durbin.m”,计算2.1中语音数据帧的14阶LPC系数,并与2.1中的结果进行比较:
x=digits.three1;
m=2756; N=256; n=m-N+1:m; M=14;
[r,eta]=xcorr(x(n),250,'unbiased');
[aLD,xi,kappa]=durbin(r(M+1:2*M+1),M);
a, aLD, norm(a-aLD)
2.4编写一个用以实现反射系数转换为LPC系数的函数“rf2lpc.m”,其Matlab代码如下:
function a = rf2lpc(kappa)
M = length(kappa);
a = zeros(M,1);
for (j=1:M)
a(j) = kappa(j);
a(1:j-1) = a(1:j-1) - kappa(j)*a(j-1:-1:1);
end
2.5 编写一个用以实现LPC系数转换为反射系数的函数“lpc2rf.m”,其Matlab 代码如下:
function kappa = lpc2rf(a)
M = length(a);
kappa = zeros(M,1);
for (j=M:-1:1)
kappa(j) = a(j);
a(1:j-1) = (a(1:j-1) + a(j)*a(j-1:-1:1))/(1 - kappa(j)^2);
end
2.6使用函数“rf2lpc.m ”和“lpc2rf.m ”,检验反射系数和LPC 系数相互转换结果。

norm(kappa-lpc2rf(aLD)) norm(aLD-rf2lpc(kappa))
3、语音信号的逆滤波
3.1 利用2.3中求出的一帧语音数据的LPC 系数,构造逆滤波器,并画出该帧语音信号的残差波形。

ehat=filter([1;-1],1,x(n)); plot([x(n) ehat])
050100150200250300
-600
-400
-200
200
400
600
3.2编写一个用以实现语音信号LPC 分析的函数“lpcauto ”,其Matlab 代码如
下:
function [ar,xi,e,m] = lpcauto(x,M,win,Olap)
Nx = length(x);
N = length(win);
if (N == 1)
N = win;
win = ones(N,1);
end
F = fix((Nx-Olap)/(N-Olap));
ar = zeros(M+1,F);
xi = zeros(M+1,F);
e = zeros(Nx,1);
m = zeros(F,1);
n = 1:N;
n1 = 1:Olap;
n2 = N-Olap+1:N;
n3 = Olap+1:N;
win1 = win(n1)./(win(n1)+win(n2)+eps);
win2 = win(n2)./(win(n1)+win(n2)+eps);
for (f=1:F)
[r,eta] = xcorr(x(n).*win,M,'biased');
[a,xi(:,f),kappa] = durbin(r(M+1:2*M+1),M);
ar(:,f) = [1; -a];
ehat = filter(ar(:,f),1,x(n));
e(n) = [e(n(n1)).*win2 + ehat(n1).*win1; ehat(n3)]; % Overlap-add.
m(f) = n(N);
n = n + (N-Olap);
end
3.3加载“timit1”语音数据,利用“lpcauto”函数对该句语音进行LPC分析。

画出语音信号及其残差波形。

load timit1; x=timit1;
M=14; N=256;
[ar,xi,e,m]=lpcauto(x,M,hann(N),N/2); plot([x,e]) soundsc(x) soundsc(e) soundsc(x-e)
1
2
3
4
5
6
x 10
4
-1-0.8-0.6-0.4-0.200.20.40.60.8
1
4、LPC 谱估计
4.1编写一个用以计算和显示LPC 谱的函数“lpcplot ”,其Matlab 代码如下: function lpcplot(A,Nfft,Fs,m) [M,N] = size(A); if (N==1)
[Theta,F] = freqz(1,A,Nfft,Fs); plot(F,20*log10(abs(Theta)));
xlabel('Frequency, {\it F} [Hz]');
ylabel('Magnitude, |\theta(\omega)| [dB]'); else
if (length(m) ~= N)
error('The column dimension of A must be equal to the length of m.') end
Theta = zeros(Nfft,N); for (n=1:N)
[Theta(:,n),F] = freqz(1,A(:,n),Nfft,Fs); end
MeshHndl = meshz(m,F,20*log10(abs(Theta)));
axis ij; view(-45,45); set(MeshHndl,'MeshStyle','Column'); axis tight; axis 'auto y'; axis 'auto z';
xlabel('Sample Number, {\it n}'); ylabel('Frequency, {\it F} [Hz]');
zlabel('Magnitude, |\theta(\omega)| [dB]'); end
4.2利用“lpcplot ”函数,画出3.3中语音数据的几帧(采样频率为16kHz ,帧长为32ms ,每帧有512个样点)LPC 谱。

plot(x(m(71):m(147)))
1000
2000
3000
4000
5000
6000
7000
8000
900010000
-1-0.8-0.6-0.4-0.200.20.40.60.8
1
lpcplot(ar(:,71:147),512,16000,m(71:147))
4
-500
50
Sample Number, n
Frequency, F [Hz]
M a g n i t u d e , |θ(ω)| [d B ]
lpcplot(ar(:,82),512,16000,0)
010002000
300040005000600070008000
-30
-20
-10
10
20
30
40
Frequency, F [Hz]
M a g n i t u d e , |θ(ω)| [d B ]
lpcplot(ar(:,110),512,16000,0)
010002000
300040005000600070008000
-30
-20
-10
10
20
30
40
Frequency, F [Hz]
M a g n i t u d e , |θ(ω)| [d B ]
lpcplot(ar(:,134),512,16000,0)
010002000
300040005000600070008000
-15
-10
-5
5
10
15
20
Frequency, F [Hz]
M a g n i t u d e , |θ(ω)| [d B ]
实验结果与分析
1.如何对全极点模型的线性预测参数进行提取?加窗等预处理对提取结果有
何影响?
自相关法、协方差法求解线性预测方程组、格型法。

协方差法是先把计算均方误差的间隔N固定下来,再研究它对计算n(i,l)的其中N是基音周期值。

添加海明窗和汉宁窗可以得到效果不错的波形,很明显两个波形相似,矩形窗的波形相对不是很平稳。

通过改变帧长、帧移后波形更加的清晰,特征更加的明显,更方便观察。

2.如何实现线性预测参数的各种表现方式之间的转换?
对于语音信号,确定了各线性预测系数后,根据H(z)可得其频率响应的估值即LPC谱。

3.使用预测残差求基音周期有何优点?
该方法能进一步去除声道共振峰的影响,简化清浊音判决过程,提高判决精度,有效降低发生基音倍频和半频的错误。

4.如何根据线性预测系数求得LPC频谱?
对于语音信号,确定了各线性预测系数后,根据H(z)可得其频率响应的估值即LPC谱。

5.LPC频谱与基于DFT求得的语音对数幅度谱相比有何不同?
LPC谱优点在于可以很好地表示共振峰结构而不出现额外的峰起和起伏,基本不含有噪声,其频率灵敏度与人耳不相匹配;DFT得到的对数幅度谱受基频谐波的影响,最大值只出现在谐波频率上,共振峰测定误差较大。

6.LPC合成语音的质量如何?有何改进措施?
LPC合成技术的优点是简单直观。

其合成过程实质上只是一种简单的解码和拼接过程。

另外,由于波形拼接技术的合成基元是语音的波形数据,保存了语音的全部信息,因而对于单个合成基元来说能够获得很高的自然度。

但是,由于自然语流中的语音和孤立状况下的语音有着极大的区别,如果只是简单地把各个孤立的语音生硬地拼接在一起,其整个语流的质量势必是不太理想的。

而LPC技术从本质上来说只是一种录音+重放,对于合成整个连续语流LPC合成技术的效果是不理想的。

因此,LPC合成技术必须和其他技术相结合,才能明显改善LPC合成的质量。

实验小结:
此次实验在前一次实验的基础上进行语音编码,熟悉了语音基本压缩编码的方法,尤其重点了解了LPC线性预测编码的原理、实现及效果。

实验过程环环相扣,几个函数间存在相互调用,一个函数的错误可能导致其后的结果出现问题甚至无法得出,因而要在弄懂实现原理的基础上对于MATLAB编码编写更加严谨细致。

相关文档
最新文档