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

This is calcCorr.c in view mode; [Download] [Up]

/*
 *
 *    main program for calcCorr
 *
 *    calculate the correlation of a sound
 *     when the type is set to 0 it prints the average correlation of
 *       the correlation function and when it is set to 1 it print the 
 *        correlation function 
 *
 */
#import <sound/sound.h>
#import <sms/sms.h>

#define USAGE "Usage: calcCorr [-t time] [-l length] [-n number] [-o type] <inputSnd2File>"

main (int argc, char *argv[])
{
	char *pChSndFile = NULL;
	SNDSoundStruct *pSndHeader;
	short *pSData;
	int iError, i, j, sizeData, iLength = 1024, iFirstSample = 0, iType = 0, 
		iNumber= 1;
	float fTime = 0, *pFData, *pFOut;
	double *pFOutput;
  	void correl ();

	if (argc > 2) 
	{
		for (i=1; i<argc-1; i++) 
			if (*(argv[i]++) == '-') 
				switch (*(argv[i]++)) 
				{
					case 't':  if (sscanf(argv[i],"%f",&fTime) < 0)
						quit("Invalid time");
						break;
					case 'l':  if (sscanf(argv[i],"%d",&iLength) < 0)
						quit("Invalid length");
						break;
					case 'o':  if (sscanf(argv[i],"%d",&iType) < 0)
						quit("Invalid type");
						break;
					case 'n':  if (sscanf(argv[i],"%d",&iNumber) < 1)
						quit("Invalid number");
						break;
					default:   quit(USAGE);
				}
	}
	else if (argc < 2)
		quit (USAGE);

	pChSndFile = argv[argc-1];

    if (iError = SNDReadSoundfile(pChSndFile, &pSndHeader))
    {
      printf("Sound error %s on %s\n",
	     SNDSoundError(iError), pChSndFile);
      exit(1);
    }
  

  
	pSData = (short *) ((char *) pSndHeader + 
			        pSndHeader->dataLocation);
  
	pFData = (float *) calloc (iLength+1, sizeof (float));
	pFOut = (float *) calloc ((iLength+1)*2, sizeof (float));
	pFOutput = (double *) calloc ((iLength+1)/2, sizeof (double));

	sizeData = pSndHeader->dataSize / sizeof(short);
	iFirstSample = pSndHeader->samplingRate * fTime;
	if ((iLength * iNumber) + iFirstSample >= sizeData)
		quit ("Data out of bounds");

	for (j = 0; j <= iNumber; j++)
	{
		for(i = 1; i <= iLength; i++)
			pFData[i] = pSData[i + iFirstSample];
  
		correl (pFData, pFData, iLength, pFOut);
  
		for(i = 1; i <= iLength/2; i++)
			pFOutput[i] += pFOut[i];

		iFirstSample += iLength;
	}	

	for(i = 2; i <= iLength/2; i++)
		pFOutput[i] = pFOutput[i] / pFOutput[1];

	pFOutput[1] = 1;

	if (iType > 0)
	{
		double fTotal = 0, fAverage = 0, fDev = 0;
		int N = (iLength / 2) - 1;

		for (i = 2; i <= iLength/2; i++)
			fTotal += pFOutput[i];
		fAverage = fTotal / (iLength/2 - 2);
		for (i = 2; i <= iLength/2; i++)
			fDev +=  ((pFOutput[i] - fAverage) * (pFOutput[i] - fAverage)) / 
					(iLength/2 - 2);

		fprintf (stdout, "%f\n", fDev);
	}
	else
		for (i = 1; i <= iLength/2; i++)
			fprintf (stdout, "%d %f\n", i, pFOutput[i]);

  	free (pFData);
	free (pFOut);
	SNDFree(pSndHeader);
	exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.