35 "key",
"WindowGenerator",
36 "category",
"Generators",
37 "description",
"WindowGenerator",
40 static FactoryRegistrator<ProcessingFactory, WindowGenerator>
reg =
metadata;
46 : mOutput(
"Generated window function samples", this )
63 if (!mConfig.HasUseTable())
return true;
64 if (!mConfig.GetUseTable())
return true;
69 mTable.
Resize(mConfig.GetSize());
70 mTable.
SetSize(mConfig.GetSize());
77 CreateTable(mTable,type,mConfig.GetSize());
99 const int audiosize = out.
Size();
101 bool useTable = mConfig.HasUseTable() && mConfig.GetUseTable();
104 CreateWindowFromTable(out);
109 CreateTable(out,type,winsize);
113 if (winsize < audiosize) {
115 memset(audio+winsize,0,(audiosize-winsize)*
sizeof(
TData));
118 NormalizeWindow(out);
119 if (mConfig.GetInvert())
137 "WindowGenerator::Do(): Spectral Window exists only for type MagPhase");
139 Do(out.GetMagBuffer());
147 long windowsize)
const
153 KaiserBessel(windowsize,table,1.7);
158 KaiserBessel(windowsize,table,1.8);
163 KaiserBessel(windowsize,table,1.9);
168 KaiserBessel(windowsize,table,2.0);
173 KaiserBessel(windowsize,table,2.5);
178 KaiserBessel(windowsize,table,3.0);
183 KaiserBessel(windowsize,table,3.5);
188 BlackmanHarris62(windowsize,table);
193 BlackmanHarris70(windowsize,table);
198 BlackmanHarris74(windowsize,table);
203 BlackmanHarris92(windowsize,table);
208 Hamming(windowsize,table);
213 Triangular(windowsize,table);
218 BlackmanHarris92TransMainLobe(windowsize,table);
223 Gaussian(windowsize,table);
228 BlackmanHarrisLike(windowsize,table);
233 Sine(windowsize, table);
239 Square(windowsize, table);
246 void WindowGenerator::CreateWindowFromTable(
DataArray &array)
const
248 unsigned int index = 0x00000000;
249 unsigned int increment = (
unsigned int)((
double) (0x00010000) * mConfig.GetSize()/
255 CLAM_ASSERT(size<=array.Size(),
"WindowGenerator::CreateWindowFromTable:output array does not have a valid size");
256 for (
int i=0;i<size;i++)
258 const TData & val = mTable[index>>16];
268 double WindowGenerator::BesselFunction(
double x)
const
271 double Factorial = 1.0;
272 double HalfX = x/2.0;
274 Sum += HalfX * HalfX;
275 for(
int i=2; i<50; i++)
285 void WindowGenerator::KaiserBessel(
long size,
DataArray& window,
289 long windowsize = size;
291 TData dHalfsize = windowsize/2.0f;
292 int iHalfsize = (
int)windowsize/2;
295 if (windowsize % 2 != 0)
296 window[iHalfsize]=
TData(BesselFunction(PiAlpha) / BesselFunction(PiAlpha));
297 for(
int i=0; i<iHalfsize; i++)
299 window[i] = window[windowsize-i-1] =
TData(
301 dHalfsize, 2.0))) / BesselFunction(PiAlpha) );
307 void WindowGenerator::BlackmanHarrisX(
long size,
DataArray& window,
308 double a0,
double a1,
double a2,
double a3)
const
310 double fConst =
TWO_PI / (size-1);
315 window[(
int)(size/2)] = a0 - a1 *
CLAM_cos(fConst * ((
int)(size/2))) + a2 *
316 CLAM_cos(fConst * 2 * ((
int)(size/2))) - a3 *
CLAM_cos(fConst * 3 * ((
int)(size/2)));
318 for(
int i = 0; i < (
int)(size/2); i++)
320 window[i] = window[size-i-1] = a0 - a1 *
CLAM_cos(fConst * i) +
330 void WindowGenerator::BlackmanHarris62(
long size,
DataArray& window)
const
333 double a0 = .44959, a1 = .49364, a2 = .05677;
334 BlackmanHarrisX(size,window,a0,a1,a2);
340 void WindowGenerator::BlackmanHarris70(
long size,
DataArray& window)
const
343 double a0 = .42323, a1 = .49755, a2 = .07922;
344 BlackmanHarrisX(size,window,a0,a1,a2);
348 void WindowGenerator::BlackmanHarris74(
long size,
DataArray& window)
const
352 double a0 = .40217, a1 = .49703, a2 = .09892, a3 = .00188;
354 BlackmanHarrisX(size,window,a0,a1,a2,a3);
358 void WindowGenerator::BlackmanHarris92(
long size,
DataArray& window)
const
362 double a0 = .35875, a1 = .48829, a2 = .14128, a3 = .01168;
364 BlackmanHarrisX(size,window,a0,a1,a2,a3);
367 void WindowGenerator::BlackmanHarrisLike(
long size,
DataArray& window)
const
371 for(
int i=0; i<size; i++)
378 for (
int i = 0; i < size; i++)
379 window[i] = window[i] / fSum;
385 void WindowGenerator::Hamming(
long size,
DataArray& window)
const
388 window[(
int)(size/2)]=
391 for(
int i = 0; i < (
int)(size/2); i++)
392 window[i] = window[size-i-1] =
398 void WindowGenerator::Triangular(
long size,
DataArray& window)
const
401 window[(
int)(size/2)] = (
TData)2*((
int)(size/2))/(size-1);
402 for(
int i = 0; i < (
int)(size/2); i++)
404 window[i] = window[size-i-1]= (
TData)2*i/(size-1);
409 void WindowGenerator::BlackmanHarris92TransMainLobe(
long size,
DataArray& window)
const
418 for(
int i = 0; i < size; i++)
421 for (
int m = 0; m < 4; m++)
422 window[i] += -1 * (fA[m]/2) *
425 fTheta += fThetaIncr;
429 fMax = window[(
int) size / 2];
430 for (
int i = 0; i < size; i++)
431 window[i] = window[i] / fMax;
435 void WindowGenerator::Gaussian(
long size,
DataArray& window)
const
438 double scale = 1.0 / ( 2.0 * M_PI * 0.15 * 0.15 );
441 window[size/2] = scale;
442 for(
int i = 0; i < size/2; i++)
445 window[i] = window[size-i-1]= scale * exp(-(x*x)/(2*s*s));
450 void WindowGenerator::Sine(
long size,
DataArray& window)
const
452 double tmp1 =
PI/(2.0*float(size));
453 double tmp2 = 0.5*(2.0*float(size));
455 for (
int i=0;i<size;i++)
456 window[i] = (
float)(1+tmp2*
CLAM_sin(tmp1*(i+1)));
458 void WindowGenerator::Square(
long size,
DataArray& window)
const
460 for (
int i=0;i<size;i++)
465 void WindowGenerator::InvertWindow(
const DataArray& originalWindow,
468 if(invertedWindow.AllocatedSize()!=originalWindow.AllocatedSize())
469 invertedWindow.Resize(originalWindow.AllocatedSize());
470 if(invertedWindow.Size()!=originalWindow.Size())
471 invertedWindow.SetSize(originalWindow.Size());
473 if (originalWindow.Size()%2!=0)
474 if(originalWindow[(
int)(originalWindow.Size()/2)]!=0)
475 invertedWindow[(
int)(originalWindow.Size()/2)]=
476 1/originalWindow[(
int)(originalWindow.Size()/2)];
477 for(
int i=0;i<(
int)(originalWindow.Size()/2);i++)
479 if(originalWindow[i]!=0)
480 invertedWindow[i]=invertedWindow[originalWindow.Size()-1-i]=1.0/originalWindow[i];
482 invertedWindow[originalWindow.Size()-1]=0;
485 void WindowGenerator::InvertWindow(
DataArray& window)
const
487 InvertWindow(window,window);
490 void WindowGenerator::NormalizeWindow(
DataArray& window)
const
493 double normalizationFactor=1.0;
495 const int size = window.Size();
497 switch (mConfig.GetNormalize()) {
501 for(
int i=0;i<size;i++) sum+=window[i];
502 normalizationFactor=1/(sum/2);
508 for(
int i=0;i<size;i++) sum+=window[i];
509 normalizationFactor=size/(sum/2);
515 for(
int i=0;i<size;i++)
516 if (max<window[i]) max=window[i];
517 normalizationFactor = 1.0/max;
521 CLAM_ASSERT(
false,
"Unexpected normalization type");
524 for(
int i=0;i<size;i++)
526 window[i]*=normalizationFactor;
531 double WindowGenerator::Sinc(
double x,
short N)
const
533 return (sin ((N/2) * x) / sin (x/2));