www.pudn.com > ica_C.rar > wav_io.c
#include#include #include #include "wav_io.h" int Read_matrix(int n, int m, char *fname, matrix x) { FILE *fin; int i; fopen_r(fin,fname); for(i=0;i FS=tmplong; fread(&tmplong,4,1,fp); printf("%ld byte/sec, ",tmplong); fread(&tmpshort,2,1,fp); printf("%d block align, ",tmpshort); fread(&tmpshort,2,1,fp); printf("%d bits/samp, \n",tmpshort); fread(magic,4,1,fp); if (strncmp(magic , "data", 4) !=0){ printf("Sorry, missing data chunk\n"); exit(0); } fread(&len,4,1,fp); readwav->length=len; readwav->data=(short *)malloc((sizeof(short))*len/2); fread(readwav->data,2,len/2,fp); fclose(fp); return(len/4); } void write_wav(char *fname, wavfmt *writewav) { unsigned long ltmp; unsigned short stmp; FILE *fp; fopen_w(fp,fname); fwrite("RIFF",1,4,fp); ltmp=writewav->length+36; fwrite(<mp,4,1,fp); fwrite("WAVE",1,4,fp); fwrite("fmt ",1,4,fp); ltmp=16; fwrite(<mp,4,1,fp); stmp=1; fwrite(&stmp,2,1,fp); stmp=2; fwrite(&stmp,2,1,fp); ltmp=writewav->FS; fwrite(<mp,4,1,fp); ltmp=writewav->FS*4; fwrite(<mp,4,1,fp); stmp=4; fwrite(&stmp,2,1,fp); stmp=16; fwrite(&stmp,2,1,fp); fwrite("data",1,4,fp); ltmp=writewav->length; fwrite(<mp,4,1,fp); fwrite(writewav->data,2,ltmp/2,fp); fclose(fp); } FILE *write_wav_head(char *fname, wavfmt *writewav) { unsigned long ltmp; unsigned short stmp; FILE *fp; fopen_w(fp,fname); fwrite("RIFF",1,4,fp); ltmp=writewav->length+36; fwrite(<mp,4,1,fp); fwrite("WAVE",1,4,fp); fwrite("fmt ",1,4,fp); ltmp=16; fwrite(<mp,4,1,fp); stmp=1; fwrite(&stmp,2,1,fp); stmp=2; fwrite(&stmp,2,1,fp); ltmp=writewav->FS; fwrite(<mp,4,1,fp); ltmp=writewav->FS*4; fwrite(<mp,4,1,fp); stmp=4; fwrite(&stmp,2,1,fp); stmp=16; fwrite(&stmp,2,1,fp); fwrite("data",1,4,fp); ltmp=writewav->length; fwrite(<mp,4,1,fp); /* fwrite(writewav->data,2,ltmp/2,fp); fclose(fp); */ return(fp); } int WaveData_2_DoubleMat(wavfmt fmt, matrix x) { int i,m=fmt.length/4; new_matrix(2,m); for(i=0;i length=2*n*(sizeof(short)); fmt->data=(short *)malloc(fmt->length); for(i=0;i =1){ printf("data is too large and be clipped\n"); *(fmt->data+2*i) =MAX-1; } else if(x[0][i]<-1){ printf("data is too large and be clipped\n"); *(fmt->data+2*i) =-MAX; } else *(fmt->data+2*i) =(short)(MAX*x[0][i]); if(x[1][i]>=1){ printf("data is too large and be clipped\n"); *(fmt->data+2*i+1) =MAX-1; } else if(x[1][i]<-1){ printf("data is too large and be clipped\n"); *(fmt->data+2*i+1) =-MAX; } else *(fmt->data+2*i+1)=(short)(MAX*x[1][i]); } return(n); } int round(SCALAR x){ if((x-floor(x))>0.5)return(ceil(x)); else return floor(x); }