1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-23 17:30:17 +01:00

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
This commit is contained in:
Leland Lucius
2015-05-03 15:23:33 -05:00
parent 879b9c9931
commit 9212629945
6 changed files with 1231 additions and 941 deletions

View File

@@ -484,32 +484,32 @@ void PowerSpectrum(int NumSamples, float *In, float *Out)
int NumWindowFuncs()
{
return 10;
return eWinFuncCount;
}
const wxChar *WindowFuncName(int whichFunction)
{
switch (whichFunction) {
default:
case 0:
case eWinFuncRectangular:
return _("Rectangular");
case 1:
case eWinFuncBartlett:
return wxT("Bartlett");
case 2:
case eWinFuncHamming:
return wxT("Hamming");
case 3:
case eWinFuncHanning:
return wxT("Hanning");
case 4:
case eWinFuncBlackman:
return wxT("Blackman");
case 5:
case eWinFuncBlackmanHarris:
return wxT("Blackman-Harris");
case 6:
case eWinFuncWelch:
return wxT("Welch");
case 7:
case eWinFuncGaussian25:
return wxT("Gaussian(a=2.5)");
case 8:
case eWinFuncGaussian35:
return wxT("Gaussian(a=3.5)");
case 9:
case eWinFuncGaussian45:
return wxT("Gaussian(a=4.5)");
}
}
@@ -521,7 +521,12 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
switch( whichFunction )
{
case 1:
default:
fprintf(stderr,"FFT::WindowFunc - Invalid window function: %d\n",whichFunction);
break;
case eWinFuncRectangular:
break;
case eWinFuncBartlett:
// Bartlett (triangular) window
for (i = 0; i < NumSamples / 2; i++) {
in[i] *= (i / (float) (NumSamples / 2));
@@ -529,35 +534,35 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
(1.0 - (i / (float) (NumSamples / 2)));
}
break;
case 2:
case eWinFuncHamming:
// Hamming
for (i = 0; i < NumSamples; i++)
in[i] *= 0.54 - 0.46 * cos(2 * M_PI * i / (NumSamples - 1));
break;
case 3:
case eWinFuncHanning:
// Hanning
for (i = 0; i < NumSamples; i++)
in[i] *= 0.50 - 0.50 * cos(2 * M_PI * i / (NumSamples - 1));
break;
case 4:
case eWinFuncBlackman:
// Blackman
for (i = 0; i < NumSamples; i++) {
in[i] *= 0.42 - 0.5 * cos (2 * M_PI * i / (NumSamples - 1)) + 0.08 * cos (4 * M_PI * i / (NumSamples - 1));
}
break;
case 5:
case eWinFuncBlackmanHarris:
// Blackman-Harris
for (i = 0; i < NumSamples; i++) {
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));
}
break;
case 6:
case eWinFuncWelch:
// Welch
for (i = 0; i < NumSamples; i++) {
in[i] *= 4*i/(float)NumSamples*(1-(i/(float)NumSamples));
}
break;
case 7:
case eWinFuncGaussian25:
// Gaussian (a=2.5)
// Precalculate some values, and simplify the fmla to try and reduce overhead
A=-2*2.5*2.5;
@@ -569,7 +574,7 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
in[i] *= exp(A*(0.25 + ((i/(float)NumSamples)*(i/(float)NumSamples)) - (i/(float)NumSamples)));
}
break;
case 8:
case eWinFuncGaussian35:
// Gaussian (a=3.5)
A=-2*3.5*3.5;
for (i = 0; i < NumSamples; i++) {
@@ -577,7 +582,7 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
in[i] *= exp(A*(0.25 + ((i/(float)NumSamples)*(i/(float)NumSamples)) - (i/(float)NumSamples)));
}
break;
case 9:
case eWinFuncGaussian45:
// Gaussian (a=4.5)
A=-2*4.5*4.5;
@@ -586,7 +591,5 @@ void WindowFunc(int whichFunction, int NumSamples, float *in)
in[i] *= exp(A*(0.25 + ((i/(float)NumSamples)*(i/(float)NumSamples)) - (i/(float)NumSamples)));
}
break;
default:
fprintf(stderr,"FFT::WindowFunc - Invalid window function: %d\n",whichFunction);
}
}