程序集之·二(修改一)
#include <stdio.h> #include <stdlib.h> #include "wavIo.h" #include "PreAccent.h" #include "HammingWindow.h" #include "Enframe.h" #define factor 0.97 void main() { int len=0;; char* rawfile = "MF.wav"; len=Getlength(rawfile); double *sample; sample=new double[len]; Read(rawfile,sample); /*Pre-cent*/ PreAccent(sample,len,factor );//欲加重,factor 为预加重因子 /*Enframe*/ Enframe(rawfile,sample); /*Hamming windows*/ //Hamming( frames[][512],framenum, winsize); /*FFT of each frame*/ }
#ifndef ML_WAVFILE #define ML_WAVFILE //#include <afx.h> //#include "RealVec.h" #include <stdio.h> bool Read(char *filename,double *s); int Getlength(char *filename); #endif
#include "WavIo.h" #include "stdio.h" #ifndef MAXWORD #define MAXWORD 0xFFFF #endif typedef unsigned int uint; typedef unsigned long dword; typedef unsigned short word; bool Read(char *filename,double *s) { FILE *f = fopen(filename, "rb"); if((f=fopen(filename,"rb"))==NULL) printf("open file failed!\n"); int size, format, samp_freq, num_samp_bits, NumSamples; dword dw; word w; fread(&dw, sizeof(dword), 1, f); if (dw != 0x46464952) /* RIFF*/ return false; //else //printf("the RIFF is %c;\n",dw); fread(&dw, sizeof(dword), 1, f); fread( &dw, sizeof(dword), 1, f); if (dw != 0x45564157) /* WAVE */ return false; //else //printf("the WAVE is %c;\n",dw); fread(&dw, sizeof(dword), 1, f); if (dw != 0x20746d66) /* fmt */ return false; fread( &dw, sizeof(dword), 1, f); /* format */ fread(&w, sizeof(word), 1, f); if (w != 7 && w != 1) return false; format=w; /* read the number of channels */ fread( &w, sizeof(word), 1, f); if (w != 1) return false; else printf("the channel is:%d\n",w); fread( &dw, sizeof(dword), 1, f); samp_freq=dw; printf("the samp_freq is:%d\n",dw); /* Skip a few bytes */ fread( &dw, sizeof(dword), 1, f); fread( &w, sizeof(word), 1, f); fread( &w, sizeof(word), 1, f); if (w!=16) return false; num_samp_bits=w; printf("the samp_bits is:%d\n",w); if ((num_samp_bits == 8 && (format != 7 && format != 6)) || (num_samp_bits == 16 && format != 1)) return false; fread( &dw, sizeof(dword), 1, f); if (dw != 0x61746164) /* data */ return false; fread( &dw, sizeof(dword), 1, f); size=dw; if (size == -1) NumSamples = -1; else { if (format == 6 || format == 7) NumSamples = size; else if (format == 1) NumSamples = size / 2; printf("the NumSamples is:%d\n",NumSamples); } signed short *buf; int numread; int i=0; //s.Resize(NumSamples); buf = new signed short [NumSamples]; numread = fread( buf, sizeof(signed short), NumSamples, f ); if (numread) { for (int i=0 ; i<NumSamples ; ++i) { s[i] = ( (double) buf[i] ) / MAXWORD; } } delete buf; fclose(f); return true; } int Getlength(char *filename) { FILE *f = fopen(filename, "rb"); if((f=fopen(filename,"rb"))==NULL) printf("open file failed!\n"); int size, format, samp_freq, num_samp_bits, NumSamples; dword dw; word w; fread(&dw, sizeof(dword), 1, f); if (dw != 0x46464952) /* RIFF*/ return false; fread(&dw, sizeof(dword), 1, f); fread( &dw, sizeof(dword), 1, f); if (dw != 0x45564157) /* WAVE */ return false; fread(&dw, sizeof(dword), 1, f); if (dw != 0x20746d66) /* fmt */ return false; fread( &dw, sizeof(dword), 1, f); /* format */ fread(&w, sizeof(word), 1, f); if (w != 7 && w != 1) return false; format=w; /* read the number of channels */ fread( &w, sizeof(word), 1, f); if (w != 1) return false; fread( &dw, sizeof(dword), 1, f); samp_freq=dw; /* Skip a few bytes */ fread( &dw, sizeof(dword), 1, f); fread( &w, sizeof(word), 1, f); fread( &w, sizeof(word), 1, f); if (w!=16) return false; num_samp_bits=w; if ((num_samp_bits == 8 && (format != 7 && format != 6)) || (num_samp_bits == 16 && format != 1)) return false; fread( &dw, sizeof(dword), 1, f); if (dw != 0x61746164) /* data */ return false; fread( &dw, sizeof(dword), 1, f); size=dw; if (size == -1) NumSamples = -1; else { if (format == 6 || format == 7) NumSamples = size; else if (format == 1) NumSamples = size / 2; fclose(f); return NumSamples; } }
#ifndef ML_Precent #define ML_Precent bool PreAccent(double *sample,int len,double factor); #endif
#include <stdio.h> #include "PreAccent.h" bool PreAccent(double *sample,int len,double factor) { //欲加重公式s2(n) = s(n) - a*s(n-1) for(int i=1;i<len;i++) { sample[i]=sample[i]-factor*sample[i-1]; } return true; }
#ifndef ML_Enframe #define ML_Enframe int Enframe(char *filename,double *sample); #endif
#include <stdio.h> #include "wavIo.h" int Enframe(char* filename ,double *sample) { int NumSamples=Getlength(filename); int i=0,j=0; double frames[600][512]; int winsize=512; int hopsize=128; int framenum=(int)((NumSamples-winsize)/hopsize)+1; //frames = new double [framenum][512]; for(int i=0; i<framenum; i++) { for(int j=0; j<winsize; j++) { frames[i][j] = sample[i*hopsize+j]; } } for(int i=0;i<100;i++) printf("the frames[][] is %f\n",frames[i][j]); //delete[] frames; return framenum; }