16#ifndef R8B_CDSPSINCFILTERGEN_INCLUDED
17#define R8B_CDSPSINCFILTERGEN_INCLUDED
100 const double*
const Params = NULL,
const bool UsePower =
false )
107 setWindow( WinType, Params, UsePower,
true );
125 const double*
const Params = NULL,
const bool UsePower =
false )
132 setWindow( WinType, Params, UsePower,
true );
150 const double*
const Params = NULL,
const bool UsePower =
false )
157 setWindow( WinType, Params, UsePower,
true );
176 const double*
const Params = NULL,
const bool UsePower =
false )
183 setWindow( WinType, Params, UsePower,
false,
FracDelay );
192 return( 0.5 + 0.5 * w1.
generate() );
201 return( 0.54 + 0.46 * w1.
generate() );
219 return( 0.355768 + 0.487396 * w1.
generate() +
229 return( 0.3635819 + 0.4891775 * w1.
generate() +
272 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman )
281 *op = ( *this.*wfunc )();
285 const double v = ( *this.*wfunc )();
296 *op =
pow_a(( *this.*wfunc )(), Power );
300 const double v =
pow_a(( *this.*wfunc )(), Power );
320 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman )
327 const double pw = Power;
330 if(
Freq1 < 2.3e-13 )
338 const double v = f2.
generate() * ( *this.*wfunc )() / t;
353 pow_a(( *this.*wfunc )(), pw ) / t;
375 ( *this.*wfunc )() / t;
392 pow_a(( *this.*wfunc )(), pw ) / t;
412 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman )
414 static const double fvalues[ 2 ] = { 0.0, 2.0 /
R8B_PI };
427 const double v = fvalues[ t & 1 ] * ( *this.*wfunc )() / t;
439 const double v = fvalues[ t & 1 ] *
440 pow_a(( *this.*wfunc )(), Power ) / t;
460 CWindowFunc wfunc = &CDSPSincFilterGen :: calcWindowBlackman,
461 const int opinc = 1 )
465 const double pw = Power;
484 int IsZeroX = ( fabs( fd - 1.0 ) < 2.3e-13 );
485 int mt = 0 - IsZeroX;
486 IsZeroX = ( IsZeroX || fabs( fd ) < 2.3e-13 );
492 *op = f * ( *this.*wfunc )() / ( t + fd );
500 *op = ( *this.*wfunc )();
504 *op = f * ( *this.*wfunc )() / fd;
514 *op = f * ( *this.*wfunc )() / ( t + fd );
520 const double ut = t + fd;
521 *op = ( ut >
Len2 ? 0.0 : f * ( *this.*wfunc )() / ut );
527 *op = f *
pow_a(( *this.*wfunc )(), pw ) / ( t + fd );
535 *op =
pow_a(( *this.*wfunc )(), pw );
539 *op = f *
pow_a(( *this.*wfunc )(), pw ) / fd;
549 *op = f *
pow_a(( *this.*wfunc )(), pw ) / ( t + fd );
556 *op = ( ut >
Len2 ? 0.0 :
557 f *
pow_a(( *this.*wfunc )(), pw ) / ut );
601 void setWindowKaiser(
const double* Params,
const bool UsePower,
602 const bool IsCentered )
604 wn = ( IsCentered ? 0 : -
fl2 );
609 Power = ( UsePower ? 1.9718457932433306 : -1.0 );
614 Power = ( UsePower ? fabs( Params[ 1 ]) : -1.0 );
635 void setWindowGaussian(
const double* Params,
const bool UsePower,
636 const bool IsCentered )
638 wn = ( IsCentered ? 0 : -
fl2 );
648 Power = ( UsePower ? fabs( Params[ 1 ]) : -1.0 );
673 const double*
const Params,
const bool UsePower,
674 const bool IsCentered,
const double UseFracDelay = 0.0 )
698 Power = ( UsePower && Params != NULL ? Params[ 0 ] : -1.0 );
703 setWindowKaiser( Params, UsePower, IsCentered );
708 setWindowGaussian( Params, UsePower, IsCentered );
The "base" inclusion file with basic classes and functions.
#define R8B_PI
Definition: r8bbase.h:119
#define R8B_3PI
Definition: r8bbase.h:133
#define R8B_2PI
Definition: r8bbase.h:126
#define R8B_PId2
Definition: r8bbase.h:140
#define R8BASSERT(e)
Definition: r8bconf.h:27
The "r8brain-free-src" library namespace.
Definition: CDSPBlockConvolver.h:21
double pow_a(const double v, const double p)
Definition: r8bbase.h:1132
double clampr(const double Value, const double minv, const double maxv)
Definition: r8bbase.h:1097
double besselI0(const double x)
Definition: r8bbase.h:1164
double sqr(const double x)
Definition: r8bbase.h:1120
Sinc function-based FIR filter generator class.
Definition: CDSPSincFilterGen.h:32
double calcWindowGaussian()
Definition: CDSPSincFilterGen.h:254
double FracDelay
Fractional delay in the range [0; 1], used only in the generateFrac() function. Note that the FracDel...
Definition: CDSPSincFilterGen.h:60
EWindowFunctionType
Definition: CDSPSincFilterGen.h:74
@ wftKaiser
Kaiser window function. Requires the "Beta" parameter. The "Power" parameter is optional.
Definition: CDSPSincFilterGen.h:77
@ wftCosine
Generalized cosine window function. No parameters required. The "Power" parameter is optional.
Definition: CDSPSincFilterGen.h:75
@ wftGaussian
Gaussian window function. Requires the "Sigma" parameter. The "Power" parameter is optional.
Definition: CDSPSincFilterGen.h:79
double calcWindowHamming()
Definition: CDSPSincFilterGen.h:199
void initFrac(const EWindowFunctionType WinType=wftCosine, const double *const Params=NULL, const bool UsePower=false)
Definition: CDSPSincFilterGen.h:175
void generateFrac(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman, const int opinc=1)
Definition: CDSPSincFilterGen.h:459
void generateHilbert(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman)
Definition: CDSPSincFilterGen.h:411
int fl2
Internal "half kernel length" value. This value can be used as filter's latency in samples (taps),...
Definition: CDSPSincFilterGen.h:42
void generateBand(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman)
Definition: CDSPSincFilterGen.h:319
double GaussianSigmaFrac
Equals FracDelay / GaussianSigma.
Definition: CDSPSincFilterGen.h:582
double calcWindowBlackmanNuttall()
Definition: CDSPSincFilterGen.h:227
double KaiserBeta
Kaiser window function's "Beta" coefficient.
Definition: CDSPSincFilterGen.h:572
double Freq1
Required corner circular frequency 1 [0; pi]. Used only in the generateBand() function.
Definition: CDSPSincFilterGen.h:50
int KernelLen
Resulting length of the filter kernel, this variable is set after the call to one of the "init" funct...
Definition: CDSPSincFilterGen.h:40
double(CDSPSincFilterGen ::* CWindowFunc)()
Window calculation function pointer type.
Definition: CDSPSincFilterGen.h:83
double Len2i
= 1.0 / Len2, initialized and used by some window functions for optimization (should not be initializ...
Definition: CDSPSincFilterGen.h:37
double calcWindowKaiser()
Definition: CDSPSincFilterGen.h:237
double calcWindowBlackman()
Definition: CDSPSincFilterGen.h:208
void initWindow(const EWindowFunctionType WinType=wftCosine, const double *const Params=NULL, const bool UsePower=false)
Definition: CDSPSincFilterGen.h:99
double Freq2
Required corner circular frequency 2 [0; pi]. Used only in the generateBand() function....
Definition: CDSPSincFilterGen.h:52
double KaiserMul
Kaiser window function's divisor, inverse.
Definition: CDSPSincFilterGen.h:574
void initHilbert(const EWindowFunctionType WinType=wftCosine, const double *const Params=NULL, const bool UsePower=false)
Definition: CDSPSincFilterGen.h:149
double calcWindowNuttall()
Definition: CDSPSincFilterGen.h:217
double KaiserLen2Frac
Equals FracDelay / Len2.
Definition: CDSPSincFilterGen.h:575
void initBand(const EWindowFunctionType WinType=wftCosine, const double *const Params=NULL, const bool UsePower=false)
Definition: CDSPSincFilterGen.h:124
void generateWindow(double *op, CWindowFunc wfunc=&CDSPSincFilterGen ::calcWindowBlackman)
Definition: CDSPSincFilterGen.h:271
double Len2
Required half filter kernel's length in samples (can be a fractional value). Final physical kernel le...
Definition: CDSPSincFilterGen.h:34
double GaussianSigmaI
Gaussian window function's "Sigma" coefficient, inverse.
Definition: CDSPSincFilterGen.h:580
double calcWindowHann()
Definition: CDSPSincFilterGen.h:190
Sine signal generator class.
Definition: r8bbase.h:671
void init(const double si, const double ph)
Definition: r8bbase.h:716
double generate()
Definition: r8bbase.h:743