清浊音判别 matlab,matlab语音信号处理如何判别清浊音?
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
這是我一個學長給的程序,他說里面要算得基本上已經實現了改一下就可以用了。。。但是i本人不是主攻matlab的說白了就是不怎么會,,想問下該怎么改來實現判斷清濁音的功能。
%對語音信號采樣分幀
clear
clc
X= wavread('E:\003\luyin.wav');
%對信號進行預加重
x=X;
x4=filter([1,-0.9375],1,x);
figure(1)
subplot(2,1,1),plot(x)
title('原始語音信號');
xlabel('樣本序列n');
ylabel('幅值');
subplot(2,1,2),plot(x4)
title('原始語音信號的預加重');
xlabel('樣本序列n');
ylabel('幅值');
% 幅度歸一化到[-1,1]
x=double(x);
x=x/max(abs(x));
% 常數設置
FrameLen=240; % 幀長取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;
% 短時過零率(矢量法)
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('短時過零率');
ylabel('zcr')
%計算短時能量
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('短時能量');
ylabel('amp')
%調整能量門限
amp1=ll+(max(amp)-ll)/8;
amp2=ll+(max(amp)-ll)/16;
%開始端點檢測
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, % 3=語音結束
break;
end
end
count=count-silence;
x2=x1+count-1;
figure(3)
subplot(2,1,1)
plot(x)
title('語音信號的端點檢測');
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的長度是4560
figure(3)
subplot(2,1,2)
plot(yy)
axis([1 length(yy) -1 1]) %將此處的橫坐標改值就可以取不同的語音段現在是整個語音段,
title('原始語音信號進行端點檢測后得到的有用的語音信號段')
fs=11.025;%設定采樣頻率
y=fft(yy);%進行fft變換
mag=abs(y);%求幅值
f=(0:length(y)-1)'*fs/length(y);%進行對應的頻率轉換
figure(4);
plot(f,mag);%做頻譜圖
xlabel('頻率(Hz)');
ylabel('幅值');
title('信號波幅頻譜圖');
grid;
z=0.1*rand(1,length(yy));
figure(5);
plot(z)
fs=11.025;%設定采樣頻率
Z=fft(z);%進行fft變換
mag=abs(Z);%求幅值
f=(0:length(Z)-1)'*fs/length(Z);%進行對應的頻率轉換
figure(6);
plot(f,mag);%做頻譜圖
xlabel('頻率(Hz)');
ylabel('幅值');
title('噪聲波幅頻譜圖')
grid;
m=yy'+z;
figure(7);
subplot(2,1,1);
plot(m)
fs=11.025;%設定采樣頻率
M=fft(m);%進行fft變換
mag=abs(M);%求幅值
f=(0:length(M)-1)'*fs/length(M);%進行對應的頻率轉換
figure(8);
plot(f,mag);%做頻譜圖
xlabel('頻率(Hz)');
ylabel('幅值');
title('混合信號波幅頻譜圖')
grid;
%wavwrite(m,'s01')
總結
以上是生活随笔為你收集整理的清浊音判别 matlab,matlab语音信号处理如何判别清浊音?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第五人格维修服务器时间,第五人格调整维护
- 下一篇: 多个python脚本同时执行_Pytho