📄 pesqdsp.c
字号:
Utt_ED2[bp] = (*err_info).Utt_Delay[Utt_Test];
}
for( bp = 0; bp < N_BPs; bp++ )
Utt_DC1[bp] = -2.0f;
while( 1 )
{
bp = 0;
while( (bp < N_BPs) && (Utt_DC1[bp] > -2.0) )
bp++;
if( bp >= N_BPs )
break;
estdelay = Utt_ED1[bp];
for( count = 0L; count < Align_Nfft; count++ )
H[count] = 0.0f;
Hsum = 0.0f;
startr = Utt_Start * Downsample;
startd = startr + estdelay;
if ( startd < 0L )
{
startr = -estdelay;
startd = 0L;
}
while( ((startd + Align_Nfft) <= (*deg_info).Nsamples) &&
((startr + Align_Nfft) <= (Utt_BPs[bp] * Downsample)) )
{
for( count = 0L; count < Align_Nfft; count++ )
{
X1[count] = (*ref_info).data[count + startr] * Window[count];
X2[count] = (*deg_info).data[count + startd] * Window[count];
}
RealFFT( X1, Align_Nfft );
RealFFT( X2, Align_Nfft );
for( count = 0L; count <= Align_Nfft / 2; count++ )
{
r1 = X1[count * 2]; i1 = -X1[1 + (count * 2)];
X1[count * 2] = (r1 * X2[count * 2] - i1 * X2[1 + (count * 2)]);
X1[1 + (count * 2)] = (r1 * X2[1 + (count * 2)] + i1 * X2[count * 2]);
}
RealIFFT( X1, Align_Nfft );
v_max = 0.0f;
for( count = 0L; count < Align_Nfft; count++ )
{
r1 = (float) fabs(X1[count]);
X1[count] = r1;
if( r1 > v_max ) v_max = r1;
}
v_max *= 0.99f;
n_max = (float) pow( v_max, 0.125 ) / kernel;
for( count = 0L; count < Align_Nfft; count++ )
if( X1[count] > v_max )
{
Hsum += n_max * kernel;
for( k = 1-kernel; k < kernel; k++ )
H[(count + k + Align_Nfft) % Align_Nfft] +=
n_max * (kernel - (float) fabs(k));
}
startr += (Align_Nfft / 4);
startd += (Align_Nfft / 4);
}
v_max = 0.0f;
I_max = 0L;
for( count = 0L; count < Align_Nfft; count++ )
if( H[count] > v_max )
{
v_max = H[count];
I_max = count;
}
if( I_max >= (Align_Nfft/2) )
I_max -= Align_Nfft;
Utt_D1[bp] = estdelay + I_max;
if( Hsum > 0.0 )
Utt_DC1[bp] = v_max / Hsum;
else
Utt_DC1[bp] = 0.0f;
while( bp < N_BPs )
{
bp++;
if( (Utt_ED1[bp] == estdelay) && (Utt_DC1[bp] <= -2.0) )
{
while( ((startd + Align_Nfft) <= (*deg_info).Nsamples) &&
((startr + Align_Nfft) <= (Utt_BPs[bp] * Downsample)) )
{
for( count = 0L; count < Align_Nfft; count++ )
{
X1[count] = (*ref_info).data[count + startr] * Window[count];
X2[count] = (*deg_info).data[count + startd] * Window[count];
}
RealFFT( X1, Align_Nfft );
RealFFT( X2, Align_Nfft );
for( count = 0L; count <= Align_Nfft/2; count++ )
{
r1 = X1[count * 2]; i1 = -X1[1 + (count * 2)];
X1[count * 2] = (r1 * X2[count * 2] - i1 * X2[1 + (count * 2)]);
X1[1 + (count * 2)] = (r1 * X2[1 + (count * 2)] + i1 * X2[count * 2]);
}
RealIFFT( X1, Align_Nfft );
v_max = 0.0f;
for( count = 0L; count < Align_Nfft; count++ )
{
r1 = (float) fabs(X1[count]);
X1[count] = r1;
if( r1 > v_max ) v_max = r1;
}
v_max *= 0.99f;
n_max = (float) pow( v_max, 0.125 ) / kernel;
for( count = 0L; count < Align_Nfft; count++ )
if( X1[count] > v_max )
{
Hsum += n_max * kernel;
for( k = 1-kernel; k < kernel; k++ )
H[(count + k + Align_Nfft) % Align_Nfft] +=
n_max * (kernel - (float) fabs(k));
}
startr += (Align_Nfft / 4);
startd += (Align_Nfft / 4);
}
v_max = 0.0f;
I_max = 0L;
for( count = 0L; count < Align_Nfft; count++ )
if( H[count] > v_max )
{
v_max = H[count];
I_max = count;
}
if( I_max >= (Align_Nfft/2) )
I_max -= Align_Nfft;
Utt_D1[bp] = estdelay + I_max;
if( Hsum > 0.0 )
Utt_DC1[bp] = v_max / Hsum;
else
Utt_DC1[bp] = 0.0f;
}
}
}
for( bp = 0; bp < N_BPs; bp++ )
{
if( Utt_DC1[bp] > Utt_DelayConf )
Utt_DC2[bp] = -2.0f;
else
Utt_DC2[bp] = 0.0f;
}
while( 1 )
{
bp = N_BPs - 1;
while( (bp >= 0) && (Utt_DC2[bp] > -2.0) )
bp--;
if( bp < 0 )
break;
estdelay = Utt_ED2[bp];
for( count = 0L; count < Align_Nfft; count++ )
H[count] = 0.0f;
Hsum = 0.0f;
startr = Utt_End * Downsample - Align_Nfft;
startd = startr + estdelay;
if ( (startd + Align_Nfft) > (*deg_info).Nsamples )
{
startd = (*deg_info).Nsamples - Align_Nfft;
startr = startd - estdelay;
}
while( (startd >= 0L) &&
(startr >= (Utt_BPs[bp] * Downsample)) )
{
for( count = 0L; count < Align_Nfft; count++ )
{
X1[count] = (*ref_info).data[count + startr] * Window[count];
X2[count] = (*deg_info).data[count + startd] * Window[count];
}
RealFFT( X1, Align_Nfft );
RealFFT( X2, Align_Nfft );
for( count = 0L; count <= Align_Nfft/2; count++ )
{
r1 = X1[count * 2]; i1 = -X1[1 + (count * 2)];
X1[count * 2] = (r1 * X2[count * 2] - i1 * X2[1 + (count * 2)]);
X1[1 + (count * 2)] = (r1 * X2[1 + (count * 2)] + i1 * X2[count * 2]);
}
RealIFFT( X1, Align_Nfft );
v_max = 0.0f;
for( count = 0L; count < Align_Nfft; count++ )
{
r1 = (float) fabs(X1[count]);
X1[count] = r1;
if( r1 > v_max ) v_max = r1;
}
v_max *= 0.99f;
n_max = (float) pow( v_max, 0.125 ) / kernel;
for( count = 0L; count < Align_Nfft; count++ )
if( X1[count] > v_max )
{
Hsum += n_max * kernel;
for( k = 1-kernel; k < kernel; k++ )
H[(count + k + Align_Nfft) % Align_Nfft] +=
n_max * (kernel - (float) fabs(k));
}
startr -= (Align_Nfft / 4);
startd -= (Align_Nfft / 4);
}
v_max = 0.0f;
I_max = 0L;
for( count = 0L; count < Align_Nfft; count++ )
if( H[count] > v_max )
{
v_max = H[count];
I_max = count;
}
if( I_max >= (Align_Nfft/2) )
I_max -= Align_Nfft;
Utt_D2[bp] = estdelay + I_max;
if( Hsum > 0.0 )
Utt_DC2[bp] = v_max / Hsum;
else
Utt_DC2[bp] = 0.0f;
while( bp > 0 )
{
bp--;
if( (Utt_ED2[bp] == estdelay) && (Utt_DC2[bp] <= -2.0) )
{
while( (startd >= 0L) &&
(startr >= (Utt_BPs[bp] * Downsample)) )
{
for( count = 0L; count < Align_Nfft; count++ )
{
X1[count] = (*ref_info).data[count + startr] * Window[count];
X2[count] = (*deg_info).data[count + startd] * Window[count];
}
RealFFT( X1, Align_Nfft );
RealFFT( X2, Align_Nfft );
for( count = 0L; count <= Align_Nfft / 2; count++ )
{
r1 = X1[count * 2]; i1 = -X1[1 + (count * 2)];
X1[count * 2] = (r1 * X2[count * 2] - i1 * X2[1 + (count * 2)]);
X1[1 + (count * 2)] = (r1 * X2[1 + (count * 2)] + i1 * X2[count * 2]);
}
RealIFFT( X1, Align_Nfft );
v_max = 0.0f;
for( count = 0L; count < Align_Nfft; count++ )
{
r1 = (float) fabs(X1[count]);
X1[count] = r1;
if( r1 > v_max ) v_max = r1;
}
v_max *= 0.99f;
n_max = (float) pow( v_max, 0.125 ) / kernel;
for( count = 0L; count < Align_Nfft; count++ )
if( X1[count] > v_max )
{
Hsum += n_max * kernel;
for( k = 1-kernel; k < kernel; k++ )
H[(count + k + Align_Nfft) % Align_Nfft] +=
n_max * (kernel - (float) fabs(k));
}
startr -= (Align_Nfft / 4);
startd -= (Align_Nfft / 4);
}
v_max = 0.0f;
I_max = 0L;
for( count = 0L; count < Align_Nfft; count++ )
if( H[count] > v_max )
{
v_max = H[count];
I_max = count;
}
if( I_max >= (Align_Nfft/2) )
I_max -= Align_Nfft;
Utt_D2[bp] = estdelay + I_max;
if( Hsum > 0.0 )
Utt_DC2[bp] = v_max / Hsum;
else
Utt_DC2[bp] = 0.0f;
}
}
}
for( bp = 0; bp < N_BPs; bp++ )
{
if( (abs(Utt_D2[bp] - Utt_D1[bp]) >= Downsample) &&
((Utt_DC1[bp] + Utt_DC2[bp]) > ((*Best_DC1) + (*Best_DC2))) &&
(Utt_DC1[bp] > Utt_DelayConf) && (Utt_DC2[bp] > Utt_DelayConf) )
{
*Best_ED1 = Utt_ED1[bp]; *Best_D1 = Utt_D1[bp]; *Best_DC1 = Utt_DC1[bp];
*Best_ED2 = Utt_ED2[bp]; *Best_D2 = Utt_D2[bp]; *Best_DC2 = Utt_DC2[bp];
*Best_BP = Utt_BPs[bp];
}
}
FFTFree();
}
/* END OF FILE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -