Sample_Time=0.05;%//取樣時間
Sample_Rate=floor(Sample_Time*fs);%//取點長度
Energy_amplitude_Judge=2e-2;%判斷大於多少能量
N=length(X);%//輸入訊號長度
musicZCR=zeros(N,2);%//音樂能量暫存陣列
musicZCR_Counter=0;
musicZCR_Value=0;
ZCR_mov_avg_Sample_N=floor(0.3*fs);
if(rem(ZCR_mov_avg_Sample_N,2)==0)
ZCR_mov_avg_Front=floor(ZCR_mov_avg_Sample_N/2);
ZCR_mov_avg_After=floor(ZCR_mov_avg_Sample_N/2)-1;
else
ZCR_mov_avg_Front=floor(ZCR_mov_avg_Sample_N/2);
ZCR_mov_avg_After=floor(ZCR_mov_avg_Sample_N/2);
end
ZCR_mov_avg_start=1;
ZCR_mov_avg_finish=1;
ZCR_mov_avg_array=zeros(N,1);
musicSTE=zeros(N,2);%//音樂能量暫存陣列
musicSTE_Counter=0;
for Index=1:N
if(Index<Sample_Rate)
for IndexZCR=0:Index-1
musicSTE(Index,1)=musicSTE(Index,1)+X(Index-IndexZCR,1)^2;
end
musicSTE(Index,1)=musicSTE(Index,1)/(IndexZCR+1);
else
for IndexZCR=0:Sample_Rate-1
musicSTE(Index,1)=musicSTE(Index,1)+X(Index-IndexZCR,1)^2;
end
musicSTE(Index,1)=musicSTE(Index,1)/Sample_Rate;
end
if(musicSTE(Index,1)>Energy_amplitude_Judge)
musicSTE_Counter=musicSTE_Counter+1;
else
musicSTE(Index,1)=0;
end
end
disp('musicSTE Complete');
for Index=2:N
musicZCR_Value=0;
musicZCR_SW=0;
if(Index<Sample_Rate)
if(musicSTE(Index,1)>Energy_amplitude_Judge)
for IndexZCR=0:Index-2
if(X(Index-IndexZCR-1,1)*X(Index-IndexZCR,1)<0)
musicZCR_Value=musicZCR_Value+1;
end
end
musicZCR_SW=1;
musicZCR_Value=musicZCR_Value/(Index-1);
end
else
if(musicSTE(Index,1)>Energy_amplitude_Judge)
for IndexZCR=0:Sample_Rate-2
if(X(Index-IndexZCR-1,1)*X(Index-IndexZCR,1)<0)
musicZCR_Value=musicZCR_Value+1;
end
end
musicZCR_SW=1;
musicZCR_Value=musicZCR_Value/(Sample_Rate-1);
end
end
if( musicZCR_Value<=1&&musicZCR_SW==1)
musicZCR(Index,1)=musicZCR_Value;
musicZCR_Counter=musicZCR_Counter+1;
end
end
disp('musicZCR Complete');
for Index=2:N
ZCR_mov_avg_start=Index- ZCR_mov_avg_Front;
ZCR_mov_avg_finish=Index+ZCR_mov_avg_After;
if(ZCR_mov_avg_start<1)
ZCR_mov_avg_start=1;
end
if(ZCR_mov_avg_finish>N)
ZCR_mov_avg_finish=N;
end
ZCR_mov_avg_array(Index,1)=sum(musicZCR(ZCR_mov_avg_start:ZCR_mov_avg_finish,1))/(ZCR_mov_avg_finish-ZCR_mov_avg_start+1);
end
disp('musicZCR avg Complete');
n=1:N;
figure(1);
subplot(211),plot((n-1)/fs,X(:,1));
subplot(212),plot((n-1)/fs,musicZCR(:,1));
hold on;
subplot(212),plot((n-1)/fs,ZCR_mov_avg_array(:,1),'r');
hold off;
figure(2);
subplot(211),plot((n-1)/fs,X(:,1));
subplot(212),plot((n-1)/fs,musicSTE(:,1));
disp('過零率平均');
disp(sum(musicZCR(:,1))/musicZCR_Counter);
disp('短時能量平均');
disp(sum(musicSTE(:,1))/musicSTE_Counter);