資源簡介
matlab實現音頻端點檢測,需要有enframe.m文件
代碼片段和文件信息
%?語音信號的端點檢測matlab實現:
[xfsnbits]=wavread(‘E:\a\sun00.wav‘);%首先打開經錄好的信號,一段口哨聲。
x?=?x?/?max(abs(x));%幅度歸一化到[-11]
%參數設置
frameLen?=?256;?????%幀長,即每幀采樣點
inc?=?90;???????????%未重疊部分,、幀移對于的點數
amp1?=?10;??????????%短時能量閾值
amp2?=?2;???????????%即設定能量的兩個閾值。
zcr1?=?10;??????????%過零率閾值
zcr2?=?5;???????????%過零率的兩個閾值,感覺第一個沒有用到。
?
%minsilence?=?5;???%用無聲的長度來判斷語音是否結束
minlen??=?10;????%判斷是語音的最小長度
status??=?0;??????%記錄語音段的狀態
count???=?0;?????%語音序列的長度
%silence?=?0;??????%無聲的長度
?
%計算過零率
tmp1??=?enframe(x(1:end-1)?frameLeninc);%數組x經過處理后得到二維數組y
tmp2??=?enframe(x(2:end)???frameLeninc);
signs?=?(tmp1.*tmp2)<0;
diffs?=?(tmp1?-?tmp2)>0.02;
zcr???=?sum(signs.*diffs2);%表示矩陣signs.*diffs的橫向相加,求每行的和,結果是列向量。
????????????????????????????%sum(x)為豎向相加,求每列的和,結果為橫向量。
????????????????????????????%信號各幀的過零率值,放到zcr矩陣中。
?
%計算短時能量
%amp?=?sum((abs(enframe(filter([1?-0.9375]?1?x)?frameLen?inc))).^2?2);%不知道這里的filter是干啥的?但的出來的是各貞的能量了。
amp?=?sum((abs(enframe(?x?frameLen?inc))).^2?2);%通過把filter給去掉,發現結果差不多,所以個人感覺沒必要加一個濾波器,上邊出現的enframe函數放到后邊分析。這里知道是求出x各幀的能量值就行。
?
%調整能量門限
amp1?=?min(amp1?max(amp)/4);
amp2?=?min(amp2?max(amp)/8);%min函數是求最小值的,沒必要說了。
for?n=1:length(zcr)%Length(zcr)得到的是整個信號的幀數。?
???goto?=?0;
???switch?status
???????case?{01}
???????if?amp(n)?>?amp1??????????%?確信進入語音段?
?????????x1?=?max(n-count1);?%?記錄語音段的起始點?%count為在這之前的>amp2?or?>zcr2,的幀的個數
?????????%x1=n;
????
- 上一篇:matlab電機仿真同步發電機
- 下一篇:matlb 慢特征分析
評論
共有 條評論