Rowan-Classes/6th-Semester-Spring-2024/DSP/Labs/FinalProject/obj_evaluation/apply_VAD.m
2024-04-25 18:38:09 -04:00

163 lines
4.0 KiB
Matlab

function [VAD, logVAD]= apply_VAD( data, Nsamples)
global Downsample MINSPEECHLGTH JOINSPEECHLGTH
Nwindows= floor( Nsamples/ Downsample);
%number of 4ms window
VAD= zeros( 1, Nwindows);
for count= 1: Nwindows
VAD( count)= sum( data( (count-1)* Downsample+ 1: ...
count* Downsample).^ 2)/ Downsample;
end
%VAD is the power of each 4ms window
LevelThresh = sum( VAD)/ Nwindows;
%LevelThresh is set to mean value of VAD
LevelMin= max( VAD);
if( LevelMin > 0 )
LevelMin= LevelMin* 1.0e-4;
else
LevelMin = 1.0;
end
%fprintf( 1, 'LevelMin is %f\n', LevelMin);
VAD( find( VAD< LevelMin))= LevelMin;
for iteration= 1: 12
LevelNoise= 0;
len= 0;
StDNoise= 0;
VAD_lessthan_LevelThresh= VAD( find( VAD<= LevelThresh));
len= length( VAD_lessthan_LevelThresh);
LevelNoise= sum( VAD_lessthan_LevelThresh);
if (len> 0)
LevelNoise= LevelNoise/ len;
StDNoise= sqrt( sum( ...
(VAD_lessthan_LevelThresh- LevelNoise).^ 2)/ len);
end
LevelThresh= 1.001* (LevelNoise+ 2* StDNoise);
end
%fprintf( 1, 'LevelThresh is %f\n', LevelThresh);
LevelNoise= 0;
LevelSig= 0;
len= 0;
VAD_greaterthan_LevelThresh= VAD( find( VAD> LevelThresh));
len= length( VAD_greaterthan_LevelThresh);
LevelSig= sum( VAD_greaterthan_LevelThresh);
VAD_lessorequal_LevelThresh= VAD( find( VAD<= LevelThresh));
LevelNoise= sum( VAD_lessorequal_LevelThresh);
if (len> 0)
LevelSig= LevelSig/ len;
else
LevelThresh= -1;
end
%fprintf( 1, 'LevelSig is %f\n', LevelSig);
if (len< Nwindows)
LevelNoise= LevelNoise/( Nwindows- len);
else
LevelNoise= 1;
end
%fprintf( 1, 'LevelNoise is %f\n', LevelNoise);
VAD( find( VAD<= LevelThresh))= -VAD( find( VAD<= LevelThresh));
VAD(1)= -LevelMin;
VAD(Nwindows)= -LevelMin;
start= 0;
finish= 0;
for count= 2: Nwindows
if( (VAD(count) > 0.0) && (VAD(count-1) <= 0.0) )
start = count;
end
if( (VAD(count) <= 0.0) && (VAD(count-1) > 0.0) )
finish = count;
if( (finish - start)<= MINSPEECHLGTH )
VAD( start: finish- 1)= -VAD( start: finish- 1);
end
end
end
%to make sure finish- start is more than 4
if( LevelSig >= (LevelNoise* 1000) )
for count= 2: Nwindows
if( (VAD(count)> 0) && (VAD(count-1)<= 0) )
start= count;
end
if( (VAD(count)<= 0) && (VAD(count-1)> 0) )
finish = count;
g = sum( VAD( start: finish- 1));
if( g< 3.0* LevelThresh* (finish - start) )
VAD( start: finish- 1)= -VAD( start: finish- 1);
end
end
end
end
start = 0;
finish = 0;
for count= 2: Nwindows
if( (VAD(count) > 0.0) && (VAD(count-1) <= 0.0) )
start = count;
if( (finish > 0) && ((start - finish) <= JOINSPEECHLGTH) )
VAD( finish: start- 1)= LevelMin;
end
end
if( (VAD(count) <= 0.0) && (VAD(count-1) > 0.0) )
finish = count;
end
end
start= 0;
for count= 2: Nwindows
if( (VAD(count)> 0) && (VAD(count-1)<= 0) )
start= count;
end
end
if( start== 0 )
VAD= abs(VAD);
VAD(1) = -LevelMin;
VAD(Nwindows) = -LevelMin;
end
count = 4;
while( count< (Nwindows-1) )
if( (VAD(count)> 0) && (VAD(count-2) <= 0) )
VAD(count-2)= VAD(count)* 0.1;
VAD(count-1)= VAD(count)* 0.3;
count= count+ 1;
end
if( (VAD(count)<= 0) && (VAD(count-1)> 0) )
VAD(count)= VAD(count-1)* 0.3;
VAD(count+ 1)= VAD(count-1)* 0.1;
count= count+ 3;
end
count= count+ 1;
end
VAD( find( VAD< 0))= 0;
% fid= fopen( 'mat_vad.txt', 'wt');
% fprintf( fid, '%f\n', VAD);
% fclose( fid);
if( LevelThresh<= 0 )
LevelThresh= LevelMin;
end
logVAD( find( VAD<= LevelThresh))= 0;
VAD_greaterthan_LevelThresh= find( VAD> LevelThresh);
logVAD( VAD_greaterthan_LevelThresh)= log( VAD( ...
VAD_greaterthan_LevelThresh)/ LevelThresh);