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