Skip to content

Commit 9212629

Browse files
committed
Added zoom and pan plus fix for bug #884
It started out as just the fix for #884, but it went a bit further. Steve had the idea for the zoom and pan addition, so I added it while I was working on
1 parent 879b9c9 commit 9212629

File tree

6 files changed

+1085
-795
lines changed

6 files changed

+1085
-795
lines changed

src/FFT.cpp

+25-22
Original file line numberDiff line numberDiff line change
@@ -484,32 +484,32 @@ void PowerSpectrum(int NumSamples, float *In, float *Out)
484484

485485
int NumWindowFuncs()
486486
{
487-
return 10;
487+
return eWinFuncCount;
488488
}
489489

490490
const wxChar *WindowFuncName(int whichFunction)
491491
{
492492
switch (whichFunction) {
493493
default:
494-
case 0:
494+
case eWinFuncRectangular:
495495
return _("Rectangular");
496-
case 1:
496+
case eWinFuncBartlett:
497497
return wxT("Bartlett");
498-
case 2:
498+
case eWinFuncHamming:
499499
return wxT("Hamming");
500-
case 3:
500+
case eWinFuncHanning:
501501
return wxT("Hanning");
502-
case 4:
502+
case eWinFuncBlackman:
503503
return wxT("Blackman");
504-
case 5:
504+
case eWinFuncBlackmanHarris:
505505
return wxT("Blackman-Harris");
506-
case 6:
506+
case eWinFuncWelch:
507507
return wxT("Welch");
508-
case 7:
508+
case eWinFuncGaussian25:
509509
return wxT("Gaussian(a=2.5)");
510-
case 8:
510+
case eWinFuncGaussian35:
511511
return wxT("Gaussian(a=3.5)");
512-
case 9:
512+
case eWinFuncGaussian45:
513513
return wxT("Gaussian(a=4.5)");
514514
}
515515
}
@@ -521,43 +521,48 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
521521

522522
switch( whichFunction )
523523
{
524-
case 1:
524+
default:
525+
fprintf(stderr,"FFT::WindowFunc - Invalid window function: %d\n",whichFunction);
526+
break;
527+
case eWinFuncRectangular:
528+
break;
529+
case eWinFuncBartlett:
525530
// Bartlett (triangular) window
526531
for (i = 0; i < NumSamples / 2; i++) {
527532
in[i] *= (i / (float) (NumSamples / 2));
528533
in[i + (NumSamples / 2)] *=
529534
(1.0 - (i / (float) (NumSamples / 2)));
530535
}
531536
break;
532-
case 2:
537+
case eWinFuncHamming:
533538
// Hamming
534539
for (i = 0; i < NumSamples; i++)
535540
in[i] *= 0.54 - 0.46 * cos(2 * M_PI * i / (NumSamples - 1));
536541
break;
537-
case 3:
542+
case eWinFuncHanning:
538543
// Hanning
539544
for (i = 0; i < NumSamples; i++)
540545
in[i] *= 0.50 - 0.50 * cos(2 * M_PI * i / (NumSamples - 1));
541546
break;
542-
case 4:
547+
case eWinFuncBlackman:
543548
// Blackman
544549
for (i = 0; i < NumSamples; i++) {
545550
in[i] *= 0.42 - 0.5 * cos (2 * M_PI * i / (NumSamples - 1)) + 0.08 * cos (4 * M_PI * i / (NumSamples - 1));
546551
}
547552
break;
548-
case 5:
553+
case eWinFuncBlackmanHarris:
549554
// Blackman-Harris
550555
for (i = 0; i < NumSamples; i++) {
551556
in[i] *= 0.35875 - 0.48829 * cos(2 * M_PI * i /(NumSamples-1)) + 0.14128 * cos(4 * M_PI * i/(NumSamples-1)) - 0.01168 * cos(6 * M_PI * i/(NumSamples-1));
552557
}
553558
break;
554-
case 6:
559+
case eWinFuncWelch:
555560
// Welch
556561
for (i = 0; i < NumSamples; i++) {
557562
in[i] *= 4*i/(float)NumSamples*(1-(i/(float)NumSamples));
558563
}
559564
break;
560-
case 7:
565+
case eWinFuncGaussian25:
561566
// Gaussian (a=2.5)
562567
// Precalculate some values, and simplify the fmla to try and reduce overhead
563568
A=-2*2.5*2.5;
@@ -569,15 +574,15 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
569574
in[i] *= exp(A*(0.25 + ((i/(float)NumSamples)*(i/(float)NumSamples)) - (i/(float)NumSamples)));
570575
}
571576
break;
572-
case 8:
577+
case eWinFuncGaussian35:
573578
// Gaussian (a=3.5)
574579
A=-2*3.5*3.5;
575580
for (i = 0; i < NumSamples; i++) {
576581
// reduced
577582
in[i] *= exp(A*(0.25 + ((i/(float)NumSamples)*(i/(float)NumSamples)) - (i/(float)NumSamples)));
578583
}
579584
break;
580-
case 9:
585+
case eWinFuncGaussian45:
581586
// Gaussian (a=4.5)
582587
A=-2*4.5*4.5;
583588

@@ -586,7 +591,5 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
586591
in[i] *= exp(A*(0.25 + ((i/(float)NumSamples)*(i/(float)NumSamples)) - (i/(float)NumSamples)));
587592
}
588593
break;
589-
default:
590-
fprintf(stderr,"FFT::WindowFunc - Invalid window function: %d\n",whichFunction);
591594
}
592595
}

src/FFT.h

+20
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
you need to use doubles.
3030
3131
**********************************************************************/
32+
#ifndef __AUDACITY_FFT_H__
33+
#define __AUDACITY_FFT_H__
34+
3235
/*
3336
Salvo Ventura - November 2006
3437
Added more window functions:
@@ -102,6 +105,21 @@ void FFT(int NumSamples,
102105
* 9: Gaussian(a=4.5)
103106
*/
104107

108+
enum eWindowFunctions
109+
{
110+
eWinFuncRectangular,
111+
eWinFuncBartlett,
112+
eWinFuncHamming,
113+
eWinFuncHanning,
114+
eWinFuncBlackman,
115+
eWinFuncBlackmanHarris,
116+
eWinFuncWelch,
117+
eWinFuncGaussian25,
118+
eWinFuncGaussian35,
119+
eWinFuncGaussian45,
120+
eWinFuncCount
121+
};
122+
105123
void WindowFunc(int whichFunction, int NumSamples, float *data);
106124

107125
/*
@@ -117,3 +135,5 @@ const wxChar *WindowFuncName(int whichFunction);
117135
int NumWindowFuncs();
118136

119137
void DeinitFFT();
138+
139+
#endif

0 commit comments

Comments
 (0)