#include <WINDOWS.H>
#include <STDIO.H>
#include <MATH.H>
/*------------------------------------------*/
double Func ( double Time )
{
return sin ( 20000.0 * Time * double ( 2 ) * 3.14159265358979323846E0 );
}
/*------------------------------------------*/
double SinC ( double X )
{
X *= 3.14159265358979323846E0;
if ( ( -0.0001E0 < X ) && ( X < +0.0001E0 ) )
return ( double ( 1 ) - X * X / double ( 6 ) *
( double ( 1 ) - X * X / double ( 20 ) ) );
else
return ( sin ( X ) / X );
}
/*------------------------------------------*/
double Weight ( double t, int LanczosParam )
{
if ( t < -LanczosParam ) return double ( 0 );
if ( t > +LanczosParam ) return double ( 0 );
return SinC ( t ) * SinC ( t / double ( LanczosParam ) ) ;
}
/*------------------------------------------*/
double Resampler ( int iIndex48kHz )
{
double RealTime = double ( iIndex48kHz ) / double ( 48000 );
double rIndex44kHz = RealTime * double ( 44100 );
int iIndex44kHz = int ( rIndex44kHz );
int LanczosParam = 2048;
int index = iIndex44kHz - LanczosParam;
double Sum = double ( 0 );
for (;;)
{
double t = rIndex44kHz - double ( index );
if ( t < -LanczosParam ) break;
double time = double ( index ) / double ( 44100 );
Sum += Weight ( t, LanczosParam ) * Func ( time );
index ++;
}
return Sum;
}
/*------------------------------------------*/
void main ()
{
double DeltaMax = double( 0 );
for ( int i = 0; i < 48000; i++ )
{
double Delta = fabs( Resampler(i) - Func(double(i)/double(48000)) );
if ( DeltaMax < Delta ) DeltaMax = Delta;
}
printf ( "DeltaMax = %20.14e\n", DeltaMax );
}
[свернуть]
Социальные закладки