資源簡介
用matlab編寫的語音信號處理程序。
我也是初學者,剛編的,拿過來和大家一起分享一下!大家共同進步!
代碼片段和文件信息
%對語音信號采樣分幀
clear
clc
X=?wavread(‘s1‘);
%對信號進行預加重
x=X;
x4=filter([1-0.9375]1x);
figure(1)
subplot(211)plot(x)
title(‘原始語音信號‘);
xlabel(‘樣本序列n‘);
ylabel(‘幅值‘);
subplot(212)plot(x4)
title(‘原始語音信號的預加重‘);
xlabel(‘樣本序列n‘);
ylabel(‘幅值‘);
???
%?幅度歸一化到[-1,1]
x=double(x);
x=x/max(abs(x));
%?常數設置
frameLen=240;???????%?幀長取30ms8kHz的采樣率
frameInc=80;????????%?幀移取10ms1/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)frameLenframeInc);
tmp2=enframe(x(2:length(x))frameLenframeInc);
signs=(tmp1.*tmp2)0;
diffs=(tmp1-tmp2)>?0.02;
zcr=sum(signs.*diffs2);
figure(2)
subplot(211)
plot(zcr);
title(‘短時過零率‘);
ylabel(‘zcr‘)
%計算短時能量
amp=sum(abs(enframe(filter([1-0.9375]1x)frameLenframeInc))2);
inz=find(amp>1);
amm=amp(inz);
ll=min(amm);
figure(2)
subplot(212)
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{01}????????????????????%?0=靜音,1=可能開始
????????????if?amp(n)?>?amp1?????????%?確信進入語音段
????????????????x1=max(n-count-11);
????????????????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?|?zc
- 上一篇:指紋識別的matlab代碼
- 下一篇:項目進度管理project模板
評論
共有 條評論