清浊音判别 matlab,matlab语音信号处理如何判别清浊音?
該樓層疑似違規(guī)已被系統(tǒng)折疊?隱藏此樓查看此樓
這是我一個(gè)學(xué)長(zhǎng)給的程序,他說(shuō)里面要算得基本上已經(jīng)實(shí)現(xiàn)了改一下就可以用了。。。但是i本人不是主攻matlab的說(shuō)白了就是不怎么會(huì),,想問(wèn)下該怎么改來(lái)實(shí)現(xiàn)判斷清濁音的功能。
%對(duì)語(yǔ)音信號(hào)采樣分幀
clear
clc
X= wavread('E:\003\luyin.wav');
%對(duì)信號(hào)進(jìn)行預(yù)加重
x=X;
x4=filter([1,-0.9375],1,x);
figure(1)
subplot(2,1,1),plot(x)
title('原始語(yǔ)音信號(hào)');
xlabel('樣本序列n');
ylabel('幅值');
subplot(2,1,2),plot(x4)
title('原始語(yǔ)音信號(hào)的預(yù)加重');
xlabel('樣本序列n');
ylabel('幅值');
% 幅度歸一化到[-1,1]
x=double(x);
x=x/max(abs(x));
% 常數(shù)設(shè)置
FrameLen=240; % 幀長(zhǎng)取30ms,8kHz的采樣率
FrameInc=80; % 幀移取10ms,1/3
amp1=3;
amp2=2;
zcr1=10;
zcr2=5;
maxsilence=3; % 3*10ms=30ms
minlen=15; % 15*10ms=150ms
status=0;
count=0;
silence=0;
% 短時(shí)過(guò)零率(矢量法)
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);
figure(2)
subplot(2,1,1)
plot(zcr);
title('短時(shí)過(guò)零率');
ylabel('zcr')
%計(jì)算短時(shí)能量
amp=sum(abs(enframe(filter([1-0.9375],1,x),FrameLen,FrameInc)),2);
inz=find(amp>1);
amm=amp(inz);
ll=min(amm);
figure(2)
subplot(2,1,2)
plot(amp);
title('短時(shí)能量');
ylabel('amp')
%調(diào)整能量門限
amp1=ll+(max(amp)-ll)/8;
amp2=ll+(max(amp)-ll)/16;
%開(kāi)始端點(diǎn)檢測(cè)
x1=0;
x2=0;
for n=1:length(zcr)
goto = 0;
switch status
case{0,1} % 0=靜音,1=可能開(kāi)始
if amp(n) > amp1 % 確信進(jìn)入語(yǔ)音段
x1=max(n-count-1,1);
status=2;
silence=0;
count=count+1;
elseif amp(n) >amp2 | zcr(n) > zcr2 % 可能處于語(yǔ)音段
status=1;
count=count+1;
else % 靜音狀態(tài)
status=0;
count=0;
end
case 2, % 2=語(yǔ)音段
if amp(n) > amp2 | zcr(n) > zcr2 % 保持在語(yǔ)音段
count=count+1;
else
silence=silence+1;
if silence < maxsilence % 靜音還不夠長(zhǎng),尚未結(jié)束
count=count+1;
elseif count < minlen % 語(yǔ)音長(zhǎng)度太短,認(rèn)為是噪聲
status=0;
silence=0;
count=0;
else % 語(yǔ)音結(jié)束
status=3;
end
end
case 3, % 3=語(yǔ)音結(jié)束
break;
end
end
count=count-silence;
x2=x1+count-1;
figure(3)
subplot(2,1,1)
plot(x)
title('語(yǔ)音信號(hào)的端點(diǎn)檢測(cè)');
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');
%n1=(x1*FrameInc-x2*FrameInc)+1;
yy=x(x1*FrameInc:x2*FrameInc);%x1*FrameInc=3760,x2=8320,
%yy的長(zhǎng)度是4560
figure(3)
subplot(2,1,2)
plot(yy)
axis([1 length(yy) -1 1]) %將此處的橫坐標(biāo)改值就可以取不同的語(yǔ)音段現(xiàn)在是整個(gè)語(yǔ)音段,
title('原始語(yǔ)音信號(hào)進(jìn)行端點(diǎn)檢測(cè)后得到的有用的語(yǔ)音信號(hào)段')
fs=11.025;%設(shè)定采樣頻率
y=fft(yy);%進(jìn)行fft變換
mag=abs(y);%求幅值
f=(0:length(y)-1)'*fs/length(y);%進(jìn)行對(duì)應(yīng)的頻率轉(zhuǎn)換
figure(4);
plot(f,mag);%做頻譜圖
xlabel('頻率(Hz)');
ylabel('幅值');
title('信號(hào)波幅頻譜圖');
grid;
z=0.1*rand(1,length(yy));
figure(5);
plot(z)
fs=11.025;%設(shè)定采樣頻率
Z=fft(z);%進(jìn)行fft變換
mag=abs(Z);%求幅值
f=(0:length(Z)-1)'*fs/length(Z);%進(jìn)行對(duì)應(yīng)的頻率轉(zhuǎn)換
figure(6);
plot(f,mag);%做頻譜圖
xlabel('頻率(Hz)');
ylabel('幅值');
title('噪聲波幅頻譜圖')
grid;
m=yy'+z;
figure(7);
subplot(2,1,1);
plot(m)
fs=11.025;%設(shè)定采樣頻率
M=fft(m);%進(jìn)行fft變換
mag=abs(M);%求幅值
f=(0:length(M)-1)'*fs/length(M);%進(jìn)行對(duì)應(yīng)的頻率轉(zhuǎn)換
figure(8);
plot(f,mag);%做頻譜圖
xlabel('頻率(Hz)');
ylabel('幅值');
title('混合信號(hào)波幅頻譜圖')
grid;
%wavwrite(m,'s01')
總結(jié)
以上是生活随笔為你收集整理的清浊音判别 matlab,matlab语音信号处理如何判别清浊音?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第五人格维修服务器时间,第五人格调整维护
- 下一篇: matlab非同秩矩阵相乘_线性代数精华