语音实验

更新时间:2023-10-03 11:19:01 阅读量: 综合文库 文档下载

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

《数字语音处理及其应用》试卷

系 姓名 学号

一、简答题(每小题3分,共30分)

1. 语音信号的数学模型包括哪些子模型? 激励模型属于什么性质的滤波器? 2. 人耳听觉的掩蔽效应分为哪几种?在研究语音信号处理中有什么应用? 3. 计算语音的短时自相关函数的主要用途是什么?

4. 什么是线性预测?前向预测和后向预测的区别是什么? 5. 什么是复倒谱? 已知复倒谱如何求倒谱? 6. 矢量量化中生成初始码本的方法有哪几种? 7. 为什么语音信号可以看成是隐马尔可夫过程?

8. 什么是自适应变换编码?常用的变换是什么变换? 9. 语音合成中规则合成法的核心是什么?

10.什么是语音信号中的情感信息?如何对情感进行分类?

二、论述题(每小题4分,共24分)

1. 语音信号的功率谱及其在语音信号数字处理中的意义。

2. 基音周期估计的常用方法有哪些?简单描述SIFT方法(简化逆滤波法)。 3. 矢量量化中初始码本产生的方法与性能比较。

4. 叙述HMM中前向-后向算法的工作原理及其节约运算量的原因。 5. 画出语音编码中反馈自适应量化间隔的原理框图,并进行说明。 6. 叙述基音同步叠加技术PSOLA实现语音合成的主要步骤。

三、对语音信号参数分析前为什么要进行预处理?有哪些预处理过程?(5分)

四、描述Burg法求解线性预测系数的思路和计算步骤。(5分)

五、一个语音段s(n)的自相关函数为,

Rn(j)??sn(m)sn(m?j);m?jN?1j?1,?,p

证明Rn(j)是偶函数,即Rn(j)?Rn(?j);且当j?0时,自相关函数具有最大值

Rn(0)?Rn(j)。(6分)

六、如何设计最佳矢量量化器?描述LBG算法的具体实现步骤。(5分)

七、什么是Baum-Welch算法?怎样利用该算法的重估公式得到重估模型参数后,构成新的模型?

(5分)

八、为什么在语音识别时需要做“时间规整”?说明DTW时间规整的原理和方法。(5分)

九、编程实现一个孤立字语音识别系统,写出具体过程和结果分析。(15分)

练习1.

使用能量特征、过零率特征设计一个语音检测算法。要求能在普通的实验室噪声环境下,准确地检测出语音信号的起终点位置。 答:

function [x1,x2] = vad(x)

%幅度归一化到[-1,1] x = double(x);

x = x / max(abs(x));

%常数设置

FrameLen = 240; FrameInc = 80;

amp1 = 10; amp2 = 2; zcr1 = 10; zcr2 = 5;

maxsilence = 8; % 6*10ms = 60ms minlen = 15; % 15*10ms = 150ms status = 0; count = 0; silence = 0;

%计算过零率

tmp1 = enframe(x(1:length(x)-1), FrameLen, FrameInc); tmp2 = enframe(x(2: length(x)) , FrameLen, FrameInc); signs = (tmp1.*tmp2)<0; diffs = (tmp1 -tmp2)>0.02; zcr = sum(signs.*diffs, 2);

%计算短时能量

amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);

%调整能量门限

amp1 = min(amp1, max(amp)/4); amp2 = min(amp2, max(amp)/8);

%开始端点检测 x1 = 0; x2 = 0;

for n=1:length(zcr) goto = 0; switch status

case {0,1} % 0 = 静音, 1 = 可能开始 if amp(n) > amp1 % 确信进入语音段 x1 = max(n-count-1,1); status = 2; silence = 0;

count = count + 1;

elseif amp(n) > amp2 | ... % 可能处于语音段 zcr(n) > zcr2 status = 1;

count = count + 1; else % 静音状态 status = 0; count = 0; end

case 2, % 2 = 语音段

if amp(n) > amp2 | ... % 保持在语音段 zcr(n) > zcr2

count = count + 1; else % 语音将结束 silence = silence+1;

if silence < maxsilence % 静音还不够长,尚未结束 count = count + 1;

elseif count < minlen % 语音长度太短,认为是噪声 status = 0; silence = 0; count = 0;

else % 语音结束 status = 3; end end case 3, break; end end

count = count-silence/2; x2 = x1 + count -1;

subplot(311) plot(x)

axis([1 length(x) -1 1]) ylabel('Speech');

line([x1*FrameInc x1*FrameInc], [-1 1], 'Color', 'red'); line([x2*FrameInc x2*FrameInc], [-1 1], 'Color', 'red');

subplot(312) plot(amp);

axis([1 length(amp) 0 max(amp)]) ylabel('Energy');

line([x1 x1], [min(amp),max(amp)], 'Color', 'red'); line([x2 x2], [min(amp),max(amp)], 'Color', 'red');

subplot(313) plot(zcr);

axis([1 length(zcr) 0 max(zcr)]) ylabel('ZCR');

line([x1 x1], [min(zcr),max(zcr)], 'Color', 'red'); line([x2 x2], [min(zcr),max(zcr)], 'Color', 'red');

练习2.

编写计算LPC 预测器系数的Durbin 算法程序,在此基础上计算全极点模型的倒谱。 编写FFT 程序,由此计算语音信号的倒谱。 答: [x,fs]=wavread('11.wav');

[x,fs]=wavread('11.wav');

y=resample(x,4,11); y=double(y); N=512; y1=y(1:N); y1=y1;

w1=hanning(N); s=y1.*w1;

subplot(3,1,1),plot(s); title('?-ê?ó?ò?2¨D?')

p=20;

n=length(s); for i=1:p Rp(i)=sum(s(i+1:n).*s(1:n-i)); end

Rp_0=s'*s;

Ep=zeros(p,1); k=zeros(p,1); a=zeros(p,p);

Ep_0=Rp_0;

k(1)=Rp(1)/Rp_0; a(1,1)=k(1);

Ep(1)=(1-k(1)^2)*Ep_0;

if p>1 for i=2:p

k(i)=(Rp(i)-sum( a(1:i-1,i-1).*Rp(i-1:-1:1)'))/Ep(i-1); a(i,i)=k(i);

Ep(i)=(1-k(i)^2)*Ep(i-1); for j=1:i-1

a(j,i)=a(j,i-1)-k(i)*a(i-j,i-1); end end end

ai=a(:,p);

LP = filter([1 -ai(2:end)'],1,s); FFTlp = fft(LP); E = s - LP; % ?¤2a?ó2?

subplot(3,1,2),plot(1:N,s,1:N,LP,'-r');grid; title(' 原始语音和预测语音波形') subplot(3,1,3),plot(E);grid; title('预测误差');

练习3.

编写语音识别的DTW 模板匹配算法程序。 答:

disp('正在计算参考模板的参数...') for i=1:10

fname = sprintf('ú.wav',i-1); x = wavread(fname); [x1 x2] = vad(x); m = mfcc(x);

m = m(x1-2:x2-2,:); size(m);

ref(i).mfcc = m; end

disp('正在计算测试模板的参数...') for i=1:10

fname = sprintf('?.wav',i-1); x = wavread(fname); [x1 x2] = vad(x); m = mfcc(x);

m = m(x1-2:x2-2,:); size(m);

test(i).mfcc = m; end

disp('正在进行模板匹配...') dist = zeros(10,10); for i=1:10

for j=1:10

dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc); end end

disp('正在计算匹配结果...') for i=1:10

[d,j] = min(dist(i,:));

fprintf('测试模板 %d 的识别结果为:参考模板%d\\n', i, j); end

function ccc = mfcc(x)

% 归一化mel滤波器组系数

bank=melbankm(24,256,8000,0,0.5,'m'); bank=full(bank);

bank=bank/max(bank(:));

% DCT系数,12*24 for k=1:12 n=0:23;

dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24)); end

% 归一化倒谱提升窗口

w = 1 + 6 * sin(pi * [1:12] ./ 12); w = w/max(w);

% 预加重滤波器 xx=double(x);

xx=filter([1 -0.9375],1,xx);

% 语音信号分帧

xx=enframe(xx,256,80);

% 计算每帧的MFCC参数 for i=1:size(xx,1) y = xx(i,:);

s = y' .* hamming(256); t = abs(fft(s)); t = t.^2;

c1=dctcoef * log(bank * t(1:129)); c2 = c1.*w'; m(i,:)=c2'; end

%差分系数

dtm = zeros(size(m)); for i=3:size(m,1)-2

dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:); end

dtm = dtm / 3;

%合并mfcc参数和一阶差分mfcc参数 ccc = [m dtm];

ccc = ccc(3:size(m,1)-2,:);

练习4

用DTW 算法和语音的倒谱特征实现一个能够识别10 个不同数字发音的孤立字语音识别系统。 答:function dist = dtw(t,r)

n = size(t,1); m = size(r,1);

% 帧匹配距离矩阵 d = zeros(n,m);

for i = function ccc = mfcc(x) % 归一化mel滤波器组系数

bank=melbankm(24,256,8000,0,0.5,'m'); bank=full(bank);

bank=bank/max(bank(:));

% DCT系数,12*24 for k=1:12 n=0:23;

dctcoef(k,:)=cos((2*n+1)*k*pi/(2*24)); end

% 归一化倒谱提升窗口

w = 1 + 6 * sin(pi * [1:12] ./ 12); w = w/max(w);

% 预加重滤波器 xx=double(x);

xx=filter([1 -0.9375],1,xx);

% 语音信号分帧

xx=enframe(xx,256,80);

% 计算每帧的MFCC参数 for i=1:size(xx,1) y = xx(i,:);

s = y' .* hamming(256); t = abs(fft(s)); t = t.^2;

c1=dctcoef * log(bank * t(1:129)); c2 = c1.*w'; m(i,:)=c2'; end

%差分系数

dtm = zeros(size(m)); for i=3:size(m,1)-2

dtm(i,:) = -2*m(i-2,:) - m(i-1,:) + m(i+1,:) + 2*m(i+2,:); end

dtm = dtm / 3;

%合并mfcc参数和一阶差分mfcc参数 ccc = [m dtm];

%去除首尾两帧,因为这两帧的一阶差分参数为0 ccc = ccc(3:size(m,1)-2,:); 1:n for j = 1:m d(i,j) = sum((t(i,:)-r(j,:)).^2); end end

% 累积距离矩阵

D = ones(n,m) * realmax; D(1,1) = d(1,1);

% 动态规划 for i = 2:n for j = 1:m D1 = D(i-1,j); if j>1 D2 = D(i-1,j-1); else

D2 = realmax; end if j>2 D3 = D(i-1,j-2); else

D3 = realmax; end D(i,j) = d(i,j) + min([D1,D2,D3]); end end

dist = D(n,m);

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

Top