17#ifndef R8B_CDSPSINCFILTERGEN_INCLUDED
18#define R8B_CDSPSINCFILTERGEN_INCLUDED
89 const double*
const Params =
R8B_NULL,
const bool UsePower =
false )
96 setWindow( WinType, Params, UsePower,
true );
115 const double*
const Params =
R8B_NULL,
const bool UsePower =
false )
122 setWindow( WinType, Params, UsePower,
true );
142 const double*
const Params =
R8B_NULL,
const bool UsePower =
false )
149 setWindow( WinType, Params, UsePower,
true );
169 const double*
const Params =
R8B_NULL,
const bool UsePower =
false )
176 setWindow( WinType, Params, UsePower,
false,
FracDelay );
185 return( 0.5 + 0.5 * w1.generate() );
194 return( 0.54 + 0.46 * w1.generate() );
203 return( 0.42 + 0.5 * w1.generate() + 0.08 * w2.generate() );
212 return( 0.355768 + 0.487396 * w1.generate() +
213 0.144232 * w2.generate() + 0.012604 * w3.generate() );
222 return( 0.3635819 + 0.4891775 * w1.generate() +
223 0.1365995 * w2.generate() + 0.0106411 * w3.generate() );
232 const double n = 1.0 -
sqr( wn *
Len2i + KaiserLen2Frac );
240 return(
besselI0( KaiserBeta * sqrt( n )) * KaiserMul );
249 const double f = exp( -0.5 *
sqr( wn * GaussianSigmaI +
250 GaussianSigmaFrac ));
265 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman )
274 *op = ( *this.*wfunc )();
278 const double v = ( *this.*wfunc )();
289 *op =
pow_a(( *this.*wfunc )(), Power );
293 const double v =
pow_a(( *this.*wfunc )(), Power );
313 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman )
320 const double pw = Power;
323 if(
Freq1 < 2.3e-13 )
331 const double v = f2.
generate() * ( *this.*wfunc )() / t;
346 pow_a(( *this.*wfunc )(), pw ) / t;
368 ( *this.*wfunc )() / t;
385 pow_a(( *this.*wfunc )(), pw ) / t;
405 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman )
407 static const double fvalues[ 2 ] = { 0.0, 2.0 /
R8B_PI };
420 const double v = fvalues[ t & 1 ] * ( *this.*wfunc )() / t;
432 const double v = fvalues[ t & 1 ] *
433 pow_a(( *this.*wfunc )(), Power ) / t;
453 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman,
454 const int opinc = 1 )
458 const double pw = Power;
477 int IsZeroX = ( fabs( fd - 1.0 ) < 2.3e-13 );
478 int mt = 0 - IsZeroX;
479 IsZeroX = ( IsZeroX || fabs( fd ) < 2.3e-13 );
485 *op = f * ( *this.*wfunc )() / ( t + fd );
493 *op = ( *this.*wfunc )();
497 *op = f * ( *this.*wfunc )() / fd;
507 *op = f * ( *this.*wfunc )() / ( t + fd );
513 const double ut = t + fd;
514 *op = ( ut >
Len2 ? 0.0 : f * ( *this.*wfunc )() / ut );
520 *op = f *
pow_a(( *this.*wfunc )(), pw ) / ( t + fd );
528 *op =
pow_a(( *this.*wfunc )(), pw );
532 *op = f *
pow_a(( *this.*wfunc )(), pw ) / fd;
542 *op = f *
pow_a(( *this.*wfunc )(), pw ) / ( t + fd );
549 *op = ( ut >
Len2 ? 0.0 :
550 f *
pow_a(( *this.*wfunc )(), pw ) / ut );
563 double KaiserLen2Frac;
564 double GaussianSigmaI;
566 double GaussianSigmaFrac;
586 void setWindowKaiser(
const double* Params,
const bool UsePower,
587 const bool IsCentered )
589 wn = ( IsCentered ? 0 : -
fl2 );
593 KaiserBeta = 9.5945013206755156;
594 Power = ( UsePower ? 1.9718457932433306 : -1.0 );
598 KaiserBeta =
clampr( Params[ 0 ], 1.0, 350.0 );
599 Power = ( UsePower ? fabs( Params[ 1 ]) : -1.0 );
602 KaiserMul = 1.0 /
besselI0( KaiserBeta );
622 void setWindowGaussian(
const double* Params,
const bool UsePower,
623 const bool IsCentered )
625 wn = ( IsCentered ? 0 : -
fl2 );
629 GaussianSigmaI = 1.0;
634 GaussianSigmaI =
clampr( fabs( Params[ 0 ]), 1e-1, 100.0 );
635 Power = ( UsePower ? fabs( Params[ 1 ]) : -1.0 );
638 GaussianSigmaI *=
Len2;
639 GaussianSigmaI = 1.0 / GaussianSigmaI;
640 GaussianSigmaFrac =
FracDelay * GaussianSigmaI;
660 const double*
const Params,
const bool UsePower,
661 const bool IsCentered,
const double UseFracDelay = 0.0 )
685 Power = ( UsePower && Params !=
R8B_NULL ? Params[ 0 ] : -1.0 );
690 setWindowKaiser( Params, UsePower, IsCentered );
695 setWindowGaussian( Params, UsePower, IsCentered );
The "base" header file with basic classes and functions.
#define R8B_NULL
The "null pointer" value, portable between C++11 and earlier C++ versions.
Definition r8bbase.h:101
#define R8BASSERT(e)
Assertion macro used to check for certain run-time conditions. By default, no action is taken if asse...
Definition r8bconf.h:28
The "r8brain-free-src" library namespace.
Definition CDSPBlockConvolver.h:22
double pow_a(const double v, const double p)
Power of an absolute value.
Definition r8bbase.h:1154
R8B_CONST double R8B_PI
Equals pi.
Definition r8bbase.h:179
R8B_CONST double R8B_3PI
Equals 3*pi.
Definition r8bbase.h:181
R8B_CONST double R8B_2PI
Equals 2*pi.
Definition r8bbase.h:180
R8B_CONST double R8B_PId2
Equals 0.5*pi.
Definition r8bbase.h:182
double clampr(const double Value, const double minv, const double maxv)
Clamps a value to be within the specified min-max range.
Definition r8bbase.h:1117
double besselI0(const double x)
1st kind, 0th order modified Bessel function of a value.
Definition r8bbase.h:1192
double sqr(const double x)
Returns square ot a value.
Definition r8bbase.h:1140
Sinc function-based FIR filter generator class.
Definition CDSPSincFilterGen.h:33
double calcWindowGaussian()
Returns the next "Gaussian" window function coefficient.
Definition CDSPSincFilterGen.h:247
void initHilbert(const EWindowFunctionType WinType=wftCosine, const double *const Params=R8B_NULL, const bool UsePower=false)
Initializes this structure for Hilbert transformation filter calculation.
Definition CDSPSincFilterGen.h:141
double FracDelay
Fractional delay in the range [0; 1], used only in the generateFrac() function. Note that the FracDel...
Definition CDSPSincFilterGen.h:52
EWindowFunctionType
Window function type.
Definition CDSPSincFilterGen.h:63
@ wftKaiser
Kaiser window function. Requires the "Beta" parameter. The "Power" parameter is optional.
Definition CDSPSincFilterGen.h:66
@ wftCosine
Generalized cosine window function. No parameters required. The "Power" parameter is optional.
Definition CDSPSincFilterGen.h:64
@ wftGaussian
Gaussian window function. Requires the "Sigma" parameter. The "Power" parameter is optional.
Definition CDSPSincFilterGen.h:68
double calcWindowHamming()
Returns the next "Hamming" window function coefficient.
Definition CDSPSincFilterGen.h:192
void generateFrac(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman, const int opinc=1)
Calculates windowed fractional delay filter kernel.
Definition CDSPSincFilterGen.h:452
void generateHilbert(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman)
Calculates windowed Hilbert transformer filter kernel.
Definition CDSPSincFilterGen.h:404
int fl2
Internal "half kernel length" value. This value can be used as filter's latency in samples (taps),...
Definition CDSPSincFilterGen.h:43
void generateBand(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman)
Calculates band-limited windowed sinc function-based filter kernel.
Definition CDSPSincFilterGen.h:312
void initBand(const EWindowFunctionType WinType=wftCosine, const double *const Params=R8B_NULL, const bool UsePower=false)
Initializes this structure for generation of band-limited sinc filter kernel.
Definition CDSPSincFilterGen.h:114
double calcWindowBlackmanNuttall()
Returns the next "Blackman-Nuttall" window function coefficient.
Definition CDSPSincFilterGen.h:220
double Freq1
Required corner circular frequency 1 [0; pi]. Used only in the generateBand() function.
Definition CDSPSincFilterGen.h:47
int KernelLen
Resulting length of the filter kernel, this variable is set after the call to one of the "init" funct...
Definition CDSPSincFilterGen.h:41
void initWindow(const EWindowFunctionType WinType=wftCosine, const double *const Params=R8B_NULL, const bool UsePower=false)
Initializes this structure for generation of a window function, odd-sized.
Definition CDSPSincFilterGen.h:88
double(CDSPSincFilterGen ::* CWindowFunc)()
Window calculation function pointer type.
Definition CDSPSincFilterGen.h:72
double Len2i
Equals 1.0 / Len2, initialized and used by some window functions for optimization (should not be init...
Definition CDSPSincFilterGen.h:38
double calcWindowKaiser()
Returns the next "Kaiser" window function coefficient.
Definition CDSPSincFilterGen.h:230
void initFrac(const EWindowFunctionType WinType=wftCosine, const double *const Params=R8B_NULL, const bool UsePower=false)
Initializes this structure for generation of full-bandwidth fractional delay sinc filter kernel.
Definition CDSPSincFilterGen.h:168
double calcWindowBlackman()
Returns the next "Blackman" window function coefficient.
Definition CDSPSincFilterGen.h:201
double Freq2
Required corner circular frequency 2 [0; pi]. Used only in the generateBand() function....
Definition CDSPSincFilterGen.h:49
double calcWindowNuttall()
Returns the next "Nuttall" window function coefficient.
Definition CDSPSincFilterGen.h:210
void generateWindow(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman)
Calculates the window function only.
Definition CDSPSincFilterGen.h:264
double Len2
Required half filter kernel's length in samples (can be a fractional value). Final physical kernel le...
Definition CDSPSincFilterGen.h:35
double calcWindowHann()
Returns the next "Hann" window function coefficient.
Definition CDSPSincFilterGen.h:183
Sine signal generator class.
Definition r8bbase.h:667
double generate()
Generates the next sample.
Definition r8bbase.h:741