This is windows.c in view mode; [Download] [Up]
#include "../sms.h"
/* window to be used in the IFFT synthesis */
void IFFTwindow (int sizeWindow, float *pFWindow)
{
int i;
float a0 = .35875, a1 = .48829, a2 = .14128, a3 = .01168;
double fConst = TWO_PI / sizeWindow, fIncr = 2.0 /sizeWindow, fVal = 0;
/* compute inverse of window */
for(i = 0; i < sizeWindow; i++)
{
pFWindow[i] = 1 / (a0 - a1 * cos(fConst * i) +
a2 * cos(fConst * 2 * i) - a3 * cos(fConst * 3 * i));
}
/* scale function by a triangular */
for (i = 0; i < sizeWindow / 2; i++)
{
pFWindow[i] = fVal * pFWindow[i] / 2.787457;
fVal += fIncr;
}
for (i = sizeWindow / 2; i < sizeWindow; i++)
{
pFWindow[i] = fVal * pFWindow[i] / 2.787457;
fVal -= fIncr;
}
}
/* function to create a backmanHarris window
* int sizeWindow; window size
* float *pFWindow; window array
*/
void BlackmanHarris62 (int sizeWindow, float *pFWindow)
{
int i;
double fSum = 0;
/* for 3 term -62.05 */
float a0 = .44959, a1 = .49364, a2 = .05677;
double fConst = TWO_PI / sizeWindow;
/* compute window */
for(i = 0; i < sizeWindow; i++)
{
fSum += pFWindow[i] = a0 - a1 * cos(fConst * i) +
a2 * cos(fConst * 2 * i);
}
/* I do not know why I now need this factor of two */
fSum = fSum / 2;
/* scale function */
for (i = 0; i < sizeWindow; i++)
pFWindow[i] = pFWindow[i] / fSum;
}
/* function to create a backmanHarris window
* int sizeWindow; window size
* float *pFWindow; window array
*/
void BlackmanHarris70 (int sizeWindow, float *pFWindow)
{
int i;
double fSum = 0;
/* for 3 term -70.83 */
float a0 = .42323, a1 = .49755, a2 = .07922;
double fConst = TWO_PI / sizeWindow;
/* compute window */
for(i = 0; i < sizeWindow; i++)
{
fSum += pFWindow[i] = a0 - a1 * cos(fConst * i) +
a2 * cos(fConst * 2 * i);
}
/* I do not know why I now need this factor of two */
fSum = fSum / 2;
/* scale function */
for (i = 0; i < sizeWindow; i++)
pFWindow[i] = pFWindow[i] / fSum;
}
/* function to create a backmanHarris window
* int sizeWindow; window size
* float *pFWindow; window array
*/
void BlackmanHarris74 (int sizeWindow, float *pFWindow)
{
int i;
double fSum = 0;
/* for -74dB from the Nuttall paper */
float a0 = .40217, a1 = .49703, a2 = .09892, a3 = .00188;
double fConst = TWO_PI / sizeWindow;
/* compute window */
for(i = 0; i < sizeWindow; i++)
{
fSum += pFWindow[i] = a0 - a1 * cos(fConst * i) +
a2 * cos(fConst * 2 * i) + a3 * cos(fConst * 3 * i);
}
/* I do not know why I now need this factor of two */
fSum = fSum / 2;
/* scale function */
for (i = 0; i < sizeWindow; i++)
pFWindow[i] = pFWindow[i] / fSum;
}
/* function to create a backmanHarris window
* int sizeWindow; window size
* float *pFWindow; window array
*/
void BlackmanHarris92 (int sizeWindow, float *pFWindow)
{
int i;
double fSum = 0;
/* for -92dB */
float a0 = .35875, a1 = .48829, a2 = .14128, a3 = .01168;
double fConst = TWO_PI / sizeWindow;
/* compute window */
for(i = 0; i < sizeWindow; i++)
{
fSum += pFWindow[i] = a0 - a1 * cos(fConst * i) +
a2 * cos(fConst * 2 * i) + a3 * cos(fConst * 3 * i);
}
/* I do not know why I now need this factor of two */
fSum = fSum / 2;
/* scale function */
for (i = 0; i < sizeWindow; i++)
pFWindow[i] = pFWindow[i] / fSum;
}
void BlackmanHarris (int sizeWindow, float *pFWindow)
{
BlackmanHarris70 (sizeWindow, pFWindow);
}
/* function to design a Hamming window
* int sizeWindow; window size
* float *pFWindow; window array
*/
void Hamming (int sizeWindow, float *pFWindow)
{
int i;
float fSum = 0;
for(i = 0; i < sizeWindow; i++)
fSum += pFWindow[i] = 0.54 - 0.46*cos(2.0*PI*i/(sizeWindow-1));
fSum = fSum / 2;
for(i = 0; i < sizeWindow; i++)
pFWindow[i] /= fSum;
}
/* function to design a Hanning window
* int sizeWindow; window size
* float *pFWindow; window array
*/
void Hanning (int sizeWindow, float *pFWindow)
{
int i;
for(i = 0; i < sizeWindow; i++)
pFWindow[i] = (sin(PI*i/(sizeWindow-1)))*(sin(PI*i/(sizeWindow-1)));
}
void GetWindow (int sizeWindow, float *pFWindow, int iWindowType)
{
switch (iWindowType)
{
case BLACKMAN_HARRIS_62:
BlackmanHarris62 (sizeWindow, pFWindow);
break;
case BLACKMAN_HARRIS_70:
BlackmanHarris70 (sizeWindow, pFWindow);
break;
case BLACKMAN_HARRIS_74:
BlackmanHarris74 (sizeWindow, pFWindow);
break;
case BLACKMAN_HARRIS_92:
BlackmanHarris92 (sizeWindow, pFWindow);
break;
case HAMMING:
Hamming (sizeWindow, pFWindow);
break;
default:
BlackmanHarris (sizeWindow, pFWindow);
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.