语音识别-过零率和短时能量-端点检测
生活随笔
收集整理的這篇文章主要介紹了
语音识别-过零率和短时能量-端点检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
端點檢測
個人理解
能量與過零數的端點檢測算法步驟
我直接根據幅度來設置門限
a. 語音信號分幀處理
filedir=[];%設置路徑 filename='D:\matlab\music\zj3.wav'; file=[filedir filename]; [x,Fs]=audioread(file);%得到語音信號的數據wlen=200;%幀長 inc=100;%幀移 win=hamming(wlen);%海明窗 N=length(x);%信號長度 time=(0:N-1)/Fs;%計算出信號的時間刻度X=enframe(x,win,inc)'; %分幀,一列是一幀 fn=size(X,2);%幀數 frameTime=frame2time(fn,wlen,inc,Fs); %求出每幀對應的時間 %這個公式得再看一下b.
%短時能量for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:200 %這是根據幀長定的b=b+y(m).^2; endE(i)=b;end%%參考-更簡單點-尚未理解fn=size(X,2); % 求出幀數 time=(0:N-1)/Fs; % 計算出信號的時間刻度 for i=1 : fnu=X(:,i); % 取出一幀u2=u.*u; % 求出能量En(i)=sum(u2); % 對一幀累加求和 endc. 短時幀過零數
%短時過零率Z=zeros(1,fn); % 初始化for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:199 %根據幀長來定的if y(m)*y(m+1)<0;b=b+1;endZ(i)=b;endend%%更簡單點-尚未理解fn=size(X,2); % 獲取幀數 zcr1=zeros(1,fn); % 初始化 for i=1:fnz=X(:,i); % 取得一幀數據for j=1: (wlen- 1) ; % 在一幀內尋找過零點if z(j)* z(j+1)< 0 % 判斷是否為過零點zcr1(i)=zcr1(i)+1; % 是過零點,記錄1次endend endd.根據平均能量來設置門限
平均能量的結果:
[外鏈圖片轉存失敗(img-Ciy7MbEu-1563959907473)(D:\matlab\語音信號處理實驗教程-自己\assets\短時能量.jpg)]
E共有818個數據
T1設置為0.01,即當找到大于0.1標記。語音的開始
T2設置為0.001,即當找到小于0.001標記。語音的結束
找到了點,但是編程有點問題。就是要只顯示端點而不是全部顯示
[外鏈圖片轉存失敗(img-2wWpu6Tz-1563959907475)(assets/找到了點-1但是沒找到端點.jpg)]
經修改
[外鏈圖片轉存失敗(img-SRvXb1fn-1563959907476)(assets/找到點-有點問題.jpg)]
過零率端點找得有點問題
%能量與過零數的端點檢測算法1 clear all; clc; filedir=[];%設置路徑 filename='D:\matlab\music\zs.wav'; file=[filedir filename]; [x,Fs]=audioread(file); xmax=max(abs(x)); x=x/xmax';%歸一化x=filter([1 -0.98],[1],x);%預加重wlen=200;%幀長 inc=100;%幀移 win=hamming(wlen);%海明窗 N=length(x);%信號長度 time=(0:N-1)/Fs;%計算出信號的時間刻度X=enframe(x,win,inc)'; %分幀,一列是一幀 % Xmax=max(abs(X));%矩陣歸一化,這個還不行 % X=X/Xmax; fn=size(X,2)';%幀數 frameTime=frame2time(fn,wlen,inc,Fs); %求出每幀對應的時間 %這個公式得再看一下%短時能量 for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:200%一幀中的數據b=b+y(m).^2;endE(i)=b; end%短時過零率 Z=zeros(1,fn); % 初始化,fn之前用過 for i=1:fny=X(:,i);%每一幀數據b=0;for m=1:1:199if y(m)*y(m+1)<0;b=b+1;endZ(i)=b;end end%找短時能量的門限來確定語音的開始和結束 zeros(i); q=[];%存儲開始語音界限的位置 i1=1; while (i1<length(E))for i1=i1:1:length(E)e=E(i1);if e>0.1q=[q i1-1];i1=i1+1;for i2=i1:length(E)e=E(i2);if e<0.1q=[q i2+1];i1=i2+1;breakend endbreakendend end%過零率 i1=1; w=[];%存儲結束語音界限位置 while (i1<length(Z))for i1=i1:1:length(Z)e=Z(i1);if e>120w=[w i1];i1=i1+1;for i2=i1:length(Z)e=Z(i2);if e<50w=[w i2+1];i1=i2+1;breakend endbreakendend end%畫圖subplot(311)plot(time,x);title('原始信號')xlabel('時間');ylabel('幅度');subplot(312)plot(frameTime(q),E(q),'or');hold onplot(frameTime,E);title('短時能量')xlabel('時間');ylabel('幅度');subplot(313)plot(frameTime(w),Z(w),'or');hold onplot(frameTime,Z);title('過零率')xlabel('時間');ylabel('次數');最終結果
問題:因為判斷方式不同,書上的判斷更準確。
根據幅度來判斷變化比較大,且還得根據音頻來切換幅度。
總結
以上是生活随笔為你收集整理的语音识别-过零率和短时能量-端点检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编译器无法运行input_为
- 下一篇: python调用高德地图api 可视化_