⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vad_fq_snr.m

📁 vad(语音活动检测)的matlab代码
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 功能:实现语音活动检测
% 算法实现:可参见文献
% 输入参数说明:语音信号,一帧信号的长度
% 返回参数说明:语音是否活动的标志
% 作者:姜莎              
% 日期:2006.08.24
% 修改日期:2006.10.09
% 参考文献:sohn, "A voice activity detector employing soft decision based noise spectrum adaptation"
% 特殊说明:初始值采用第一帧信号的fft的值的模的平方做初始能量,并加上小的初始定值  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear;
signal= wavread('speech02.wav');

L=128;                                           %一帧信号的长度
N=floor(length(signal)./L);                      %信号总的帧长
input_signal=signal(1:L.*N);                     

%采用第一帧信号的fft的值模的平方做lambda的初始值
firstframe = input_signal(1:L);
fftfirstframe = fft(firstframe);
lambda = ones(L,1).*(abs(fftfirstframe).^2);
lambda0 = ones(L,1).*((100./(2.^15)).^2);      %避免在静音的时候出现snr无穷大的情况
beta = lambda+lambda0;                         %计算信噪比所采用的背景噪声的能量

%=================================
% snrbuffer = zeros(10,1);
snrthr=5;
% snrtempcnt=0;
%=================================

snr = zeros(N,1);
snrtemp=zeros(N,1);
proratio = 10;                                 %语音和噪声的概率比probabilityratio,给定为10

for i = 1 : N
    signalframe = input_signal((i-1).*L+1 : i.*L);
    framesigfft = fft(signalframe);
    snr = (1./L).*sum(abs(framesigfft).^2./beta);
    snrtemp(i) = snr;

    if i <= 20
        speechactive(i) = 1;
    else
        if speechactive(i-1)==1
            if snrtemp(i) > snrthr
                speechactive(i) = 1;
            else
                logi = (snrtemp(i-19 : i-1) > snrthr);
                if sum(logi) >= 3
                    speechactive(i) =1;
                else
                    speechactive(i) = 0;
                end
            end
        else
            if (snrtemp(i) > snrthr && snrtemp(i-1) > snrthr)
                speechactive(i) = 1;
            else
                speechactive(i) = 0;
            end
        end
    end
    
    if speechactive(i) == 0
        lambda =(1./(1+snr.*proratio)).*abs(framesigfft).^2+(snr.*proratio/(1+snr.*proratio)).*lambda;
        beta = lambda + lambda0;
        
        %=================================
%         if snrtemp(i) <=10
%             snrtempthr=snrtemp(i);
%         end
%         for j=1:19
%             snrbuffer(j+1) = snrbuffer(j);
%             snrbuffer(j)=snrtempthr;
%         end
%         snrmax=max(snrbuffer(1:20));
%         snrtempcnt=snrtempcnt+1;
%         if mod(snrtempcnt,20)==0
%             if snrmax>=5
%                 snrthr=snrmax;
%             end
%         end 
        %=================================
    end
   
end

%==========================
figure;
plot([1:1:L.*N],input_signal);
hold on
plot([1:L:L.*N],speechactive.*0.2,'r');
%==========================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -