Appendix 6

resample.c : C program used to resample 48 kHz experimental data to 44.1 kHz RAYNOISE impulse response sampling frequency for correlation analysis




#include 
#include 
#include 
#include 
#include 
#include 

void interpolatedata(char filename[], char outfilename[]);

void main()
{

/*
 	ACS597D - PROJECT
	Interpolate a 48 kHz Impluse response from the TEF down to a 44.1 kHz
	impulse
	response  from RAYNOISE
*/


char	infilename[80];			/*inputfilename*/
char	outfilename[80];

	printf("\n\nInterpolation of a 48 kHz data series to a 44.1 kHz data
	series.\n\n");
	
	printf("\n\n Input file? >>> ");
	scanf("%s",&infilename);

	printf("\n\n Output file? >>> ");
	scanf("%s",&outfilename);
	
	printf("\n\ninput filename = %s outputfilename =
	%s\n\n",infilename,outfilename);


	interpolatedata(infilename,outfilename);
	
}					/*Close Main*/




void interpolatedata(char infilename[], char outfilename[])
{

int	fd;
int	status;
int	i=0;	
int	displaycounter=0;
int	sample=1;
int	datasample=1;
int	leftsample=1;
int	rightsample=0;
int	found=0;

int	samplesTEF;
int	samplesRAY;

float	myfloat;
float	temp;
float	fsTEF=48000.0;
float	TsTEF=0.0;
float	fsRAY=41000.0;
float	TsRAY=0.0;
float	durationTEF;
float	durationRAY;
float	slope=0.0;
float	arg=0.0;			/* Temporary float */
float	time=0.0;
float	newtime=0.0;

float	sampletime=0.0;
float	datatime=0.0;

float	data[288000];
float	newdata[288000];

double	intsamplesRAY;			/* A Capture argument for the modf
function */
double	floatsamplesRAY;		/* A Capture argument fo the modf
function */

char	outfilename2[80];

FILE *input;
FILE *output;


	printf("\nEntering subroutine...");
	
	TsTEF=1/fsTEF;
	
	TsRAY=1/fsRAY;
	

	/* INITIALIZE DATA ARRAYS */

	i=0;
	while(i<288000){
		data[i]=0.0;
		newdata[i]=0.0;
		i++;
	}


	
	/* OPEN THE INPUT FILE */
	
	printf("\nOpening data file...");

	input = fopen(infilename, "r");
		if (input == NULL) {
			printf("\nERROR - cannot open %s\n",infilename);
		}	
		
	printf("\n\nData file open. Proceeding with calculations...");
	

	/*READ DATA INTO ARRAY*/
	
	i=0;
	sample=0;
	while(!feof(input)){
		fscanf(input,"\n%e",&data[i]);
		/*printf("\nsample = %i data = %e ",sample,data[i]);*/
		i++;
		sample++;
	}
	
	fclose(input);
	
	printf("\nData read into array - proceeding with interpolation\n");
	
	/*DETERMINE SAMPLES IN 44100 Hz ARRAY*/
	
	samplesTEF=sample-1;			/* KLUDGE! Somehow the program
	come out with one more than wc -l  */
	durationTEF=samplesTEF*TsTEF;
	arg=durationTEF/TsRAY;
	floatsamplesRAY=modf(arg,&intsamplesRAY);
	samplesRAY=(int)intsamplesRAY;
	durationRAY=samplesRAY*TsRAY;
	
	if (durationTEF-durationRAY>TsTEF){
		printf("\n\nWARNING: The duration of the new data is of by more
		than one Ts of the data...\n");
	}
	
	printf("\ndata samples = %i new data samples =
	%i",samplesTEF,samplesRAY);
	printf("\nfirst data point value = %e last data point value =
	%e",data[0],data[samplesTEF]);
	
	
	
	/*PROCESS DATA*/
	
	displaycounter=0;
	sample=1;
	datasample=1;
	leftsample=1;
	rightsample=0;
	found=0;
	
	newdata[0]=data[0];
	
	printf("\n\nsamplesTEF = %i samplesRAY = %i",samplesTEF,samplesRAY);
	printf("\ndurationTEF = %f durationRAY = %f",durationTEF,durationRAY);
	printf("\nTsTEF = %f TsRAY = %f",TsTEF,TsRAY); 
	printf("\nsample = %i datasample = %i leftsample = %i rightsample =
	%i\n",sample,datasample,leftsample,rightsample);

	printf("\nInterpolating sampled data...");

	while (sample=sampletime){
				found=1;
				/*[found sample sampletime datasample
				datatime];*/
				/*printf("\nfound interpolation point");*/
				leftsample=datasample-1;
				rightsample=datasample;
				slope=(data[rightsample]-data[leftsample])*fsTEF;
				newdata[sample]=(-1)*((sampletime-(leftsample*TsTEF))*slope-data[leftsample]);
				/*printf("\n sample = %i new data =
				%e",sample,newdata[sample]);*/
			}
			if (found==1){
				datasample=samplesTEF+1; /*Moves new sample
				index up by one by jumping out of while loop*/
			}
			datasample=datasample+1; 	/*Insurance*/
		}	
		sample++;
		displaycounter++;
		arg=((float) displaycounter/10000.0);
		arg=modf((double) arg,&intsamplesRAY);
		if (arg==0.0){
			/*printf("\nCalculation proceeding sample =
			%i",sample);*/
		}
	}

	
	/*OUTPUTDATA - File contains times and amplitudes of the origonal data
	and new data*/

	output = fopen(outfilename, "w");
		if (output == NULL) {
			printf("\nERROR - cannot open %s\n",outfilename);
		}
		
	printf("\n\nData file open. Proceeding with output...\n");
	
	
	i=0;
	while (i