ftp.nice.ch/pub/next/unix/audio/sms.N.bs.tar.gz#/sms/library/windows.c

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.