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

77 lines
1.8 KiB
Matlab

function time_align(ref_data, ref_Nsamples, ...
deg_data, deg_Nsamples, Utt_id)
global Utt_DelayEst Utt_Delay Utt_DelayConf UttSearch_Start UttSearch_End
global Align_Nfft Downsample Window
estdelay = Utt_DelayEst(Utt_id);
H = zeros( 1, Align_Nfft);
X1= zeros( 1, Align_Nfft);
X2= zeros( 1, Align_Nfft);
startr = (UttSearch_Start(Utt_id)- 1)* Downsample+ 1;
startd = startr + estdelay;
if ( startd < 0 )
startr = 1 -estdelay;
startd = 1;
end
while( ((startd + Align_Nfft) <= deg_Nsamples) && ...
((startr + Align_Nfft) <= ((UttSearch_End(Utt_id)- 1) * Downsample)) )
X1= ref_data( startr: startr+ Align_Nfft- 1).* Window;
X2= deg_data( startd: startd+ Align_Nfft- 1).* Window;
% find cross-correlation between X1 and X2
X1_fft= fft( X1, Align_Nfft );
X1_fft_conj= conj( X1_fft);
X2_fft= fft( X2, Align_Nfft );
X1= ifft( X1_fft_conj.* X2_fft, Align_Nfft );
X1= abs( X1);
v_max = max( X1)* 0.99;
X1_greater_vmax= find( X1 > v_max );
H( X1_greater_vmax )= H( X1_greater_vmax )+ v_max^ 0.125;
startr = startr+ Align_Nfft/ 4;
startd = startd+ Align_Nfft/ 4;
end
X1= H;
X2= 0;
Hsum = sum( H);
X2(1) = 1.0;
kernel = Align_Nfft / 64;
for count= 2: kernel
X2( count)= 1- (count- 1)/ kernel;
X2( Align_Nfft- count+ 2)= 1- (count- 1)/ kernel;
end
X1_fft= fft( X1, Align_Nfft );
X2_fft= fft( X2, Align_Nfft );
X1= ifft( X1_fft.* X2_fft, Align_Nfft );
if (Hsum> 0)
H= abs( X1)/ Hsum;
else
H= 0;
end
[v_max, I_max] = max( H);
if( I_max- 1 >= (Align_Nfft/2) )
I_max = I_max- Align_Nfft;
end
Utt_Delay(Utt_id) = estdelay + I_max- 1;
Utt_DelayConf(Utt_id) = v_max; % confidence