www.pudn.com > AudioTest.rar > WaveLoadDlg.cpp


// WaveLoadDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "AudioTest.h" 
#include "WaveLoadDlg.h" 
#include "Math.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveLoadDlg dialog 
 
void CWaveLoadDlg::test() 
{ 
} 
 
class TestTest 
{ 
public: 
	virtual void test(){}; 
 
}; 
class TestSon : public TestTest 
{ 
	 
}; 
CWaveLoadDlg::CWaveLoadDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CWaveLoadDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CWaveLoadDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	TestSon testson; 
	testson.test(); 
	wave_oper=0; 
} 
 
 
void CWaveLoadDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CWaveLoadDlg) 
	DDX_Control(pDX, IDC_IS_DB, m_cIsDB); 
	DDX_Control(pDX, IDC_WHICH_WINDOW, m_cWhichWindow); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CWaveLoadDlg, CDialog) 
	//{{AFX_MSG_MAP(CWaveLoadDlg) 
	ON_WM_PAINT() 
	ON_COMMAND(IDM_LOAD_WAVE, OnLoadWave) 
	ON_COMMAND(IDM_SAVE_WAVE, OnSaveWave) 
	ON_COMMAND(IDM_FILTER_WAVE, OnFilterWave) 
	ON_COMMAND(IDM_FFT_WAVE, OnFftWave) 
	ON_CBN_SELCHANGE(IDC_WHICH_WINDOW, OnSelchangeWhichWindow) 
	ON_CBN_SELCHANGE(IDC_IS_DB, OnSelchangeIsDb) 
	ON_COMMAND(IDM_IIR_FILTER, OnIirFilter) 
	ON_COMMAND(IDM_IIR_FREQ_RESPONSE, OnIirFreqResponse) 
	ON_BN_CLICKED(IDC_TEST, OnTest) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CWaveLoadDlg message handlers 
 
 
short mono1_stereo2 = 1; 
long samplingfreq = 11025; 
short bitlength = 8; 
long totalbytes = 11025; 
long bytesinfile = 11025; 
short chbytes_per_sample = 1; 
short bytes_per_sample = 1; 
long bytes_per_sec = 11025; 
long wavesize = 11025; 
int	dotn = 500; 
double* InWave; 
double* InWaveR; 
BOOL allocated = FALSE; 
BOOL loaded = FALSE; 
int xstep = 1; 
int yframe = 100; 
int yrng = 10000; 
 
unsigned long get_ulong(FILE *f) 
{ 
    unsigned char s[4]; 
	unsigned res; 
 
    if (fread(s, 4, 1, f) != 1) { 
		res = 0; 
    } else { 
		res = s[0] + 256LU * (s[1] + 256LU * (s[2] + 256LU * s[3])); 
	} 
    return res; 
} 
 
unsigned get_ushort(FILE *f) 
{ 
    unsigned char s[2]; 
	unsigned res; 
 
    if (fread(s, 2, 1, f) != 1) { 
		res = 0; 
    } else { 
		res = s[0] + 256U * s[1]; 
	} 
    return res; 
} 
 
unsigned get_ubyte(FILE *f) 
{ 
    unsigned char s[1]; 
	unsigned res; 
 
    if (fread(s, 1, 1, f) != 1) { 
		res = 0; 
    } else { 
		res = s[0]; 
	} 
    return res; 
} 
 
void AllocateMemory() 
{ 
	if( allocated ) { 
		free(InWave); 
		free(InWaveR); 
	} 
	InWave = (double *)calloc(wavesize, sizeof(double)); 
	InWaveR = (double *)calloc(wavesize, sizeof(double)); 
	allocated = TRUE; 
} 
 
void GetWavInfo()  
{ 
	unsigned long len; 
	unsigned char s[10]; 
	int i; 
	long fmtbytes; 
	FILE *ifp; 
	CString filenameld; 
	CFileDialog dlgF(TRUE, "NULL", "*.wav"); 
 
	if( dlgF.DoModal() == IDOK)	{ 
		filenameld = dlgF.GetPathName(); 
		ifp = fopen( filenameld, "rb" ); 
		if (ifp != NULL) { 
			fread(s, 4, 1, ifp); // "RIFF"  
			bytesinfile = get_ulong(ifp); // total bytes in the file 
			fread(s, 8, 1, ifp); // "WAVEfmt"  
			fmtbytes = get_ulong(ifp); // header size 
			len = get_ushort(ifp); // 1: pcm 
			mono1_stereo2 = get_ushort(ifp); // 1: mono, 2; stereo 
			samplingfreq = get_ulong(ifp); // sampling frequency 
			bytes_per_sec = get_ulong(ifp); // bytes per second 
			chbytes_per_sample = get_ushort(ifp); // bytes per sample 
			bitlength = get_ushort(ifp); // bit length 
			for (i = 0; i < (fmtbytes-16)/2; i++ ) { 
				len = get_ushort(ifp); // skip redundant header information 
			} 
			do{ // look for "data" chunk 
				fread(s, 4, 1, ifp); // expect "data" 
				if(((s[0] == 'd')&(s[1] == 'a')&(s[2] == 't')&(s[3] == 'a')) == 0){ // step over chunks unless it's "data" chunk 
					len = get_ulong(ifp); 
					fseek(ifp, len, SEEK_CUR); 
				}else{ 
					break ; 
				} 
			} while(1); 
			totalbytes = get_ulong(ifp); // total bytes of wav data 
			bytes_per_sample = bitlength / 8; 
			wavesize = totalbytes / (mono1_stereo2 * bytes_per_sample); 
			int i, m; 
			short x; 
			AllocateMemory(); 
			if (mono1_stereo2 == 1) { 
				for (i = 0; i < wavesize; i++) { // read mono wav data 
					if (fread(s, bytes_per_sample, 1, ifp) != 1) break; 
					if (bytes_per_sample == 2) x = (short)(s[0] + 256 * s[1]); 
					else x = (short)(s[0]) - 128; 
					InWave[i] = (double)(x); 
				} 
			} else { 
				for (i = 0; i < wavesize * 2; i++) { // read stereo wav data 
					m = i / 2; 
					if (fread(s, bytes_per_sample, 1, ifp) != 1) break; 
					if (bytes_per_sample == 2) x = (short)(s[0] + 256 * s[1]); 
					else x = (short)(s[0]) - 128; 
					if(i%2==0) InWave[m] = (double)(x); 
					else InWaveR[m] = (double)(x); 
				} 
			} 
			fclose( ifp ); 
			loaded = TRUE; 
		} 
	} 
} 
 
void InfoDraw(CPaintDC& dc, int x1, int y1) 
{ 
	char tmpchar[12]; 
 
	if( mono1_stereo2 == 1 ) dc.TextOut( x1 + 10, y1 + 10, "Mono"); 
	else dc.TextOut( x1 + 10, y1 + 10, "Stereo"); 
 
	dc.TextOut( x1 + 80, y1 + 10, "Sampling Freq"); 
	sprintf(tmpchar,"%6d", samplingfreq); 
	dc.TextOut( x1 + 80, y1 + 30, tmpchar); 
 
	dc.TextOut( x1 + 200, y1 + 10, "Bit Length"); 
	sprintf(tmpchar,"%3d", bitlength); 
	dc.TextOut( x1 + 200, y1 + 30, tmpchar); 
 
	dc.TextOut( x1 + 300, y1 + 10, "Total Bytes"); 
	sprintf(tmpchar,"%8d", totalbytes); 
	dc.TextOut( x1 + 300, y1 + 30, tmpchar); 
 
	dc.TextOut( x1 + 400, y1 + 10, "Time Length"); 
	sprintf(tmpchar,"%7.4f", (double)wavesize/(double)samplingfreq); 
	dc.TextOut( x1 + 400, y1 + 30, tmpchar); 
} 
 
void WaveDraw(CPaintDC& dc, int x1, int y1, double* InW) 
{ 
	CPen	myPen; 
	CPen*	pOldPen; 
 
	int i; 
	int ytmp; 
	char tmpchar[12]; 
 
	sprintf(tmpchar,"%7d", yrng); 
	dc.TextOut( x1 - 55, y1 - yframe - 8, tmpchar); 
	sprintf(tmpchar,"%6d", -yrng); 
	dc.TextOut( x1 - 55, y1 + yframe - 8, tmpchar); 
	dc.TextOut( x1 - 20, y1 - 8, "0"); 
 
	sprintf(tmpchar,"%7.4f", (double)(dotn/2)/(double)samplingfreq); 
	dc.TextOut( x1 + xstep * dotn/2 - 30, y1 + yframe + 8, tmpchar); 
	sprintf(tmpchar,"%7.4f", (double)dotn/(double)samplingfreq); 
	dc.TextOut( x1 + xstep * dotn - 30, y1 + yframe + 8, tmpchar); 
 
	myPen.CreatePen(PS_DOT, 1, RGB(0,255,0)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	dc.MoveTo(x1, y1); 
	dc.LineTo(x1 + dotn * xstep, y1); 
 
	dc.MoveTo(x1, y1 - yframe); 
	dc.LineTo(x1 + dotn * xstep, y1 - yframe); 
 
	dc.MoveTo(x1, y1 + yframe); 
	dc.LineTo(x1 + dotn * xstep, y1 + yframe); 
 
	dc.MoveTo(x1, y1 - yframe); 
	dc.LineTo(x1, y1 + yframe); 
	dc.MoveTo(x1 + (int)(dotn * xstep / 2), y1 - yframe); 
	dc.LineTo(x1 + (int)(dotn * xstep / 2), y1 + yframe); 
	dc.MoveTo(x1 + dotn * xstep, y1 - yframe); 
	dc.LineTo(x1 + dotn * xstep, y1 + yframe); 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
 
	myPen.CreatePen(PS_SOLID, 1, RGB(0,0,255)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i < dotn-2; i++) { 
		ytmp = (int)(-yframe * InW[i+0] / yrng); 
		if( ytmp > yframe ) ytmp = yframe; 
		if( ytmp < -yframe ) ytmp = -yframe; 
		dc.MoveTo(x1 + (i+0) * xstep, y1 + ytmp); 
		ytmp = (int)(-yframe * InW[i+1] / yrng); 
		if( ytmp > yframe ) ytmp = yframe; 
		if( ytmp < -yframe ) ytmp = -yframe; 
		dc.LineTo(x1 + (i+1) * xstep, y1 + ytmp); 
	} 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
} 
 
//filter the wave form and save it 
double* OutWave; 
double* OutWaveR; 
int TapN_FIR = 50; 
double h[50]; 
BOOL allocated2 = FALSE; 
 
void AllocateMemory2() 
{ 
	if( allocated2 ) { 
		free(OutWave); 
		free(OutWaveR); 
	} 
	OutWave = (double *)calloc(wavesize + 1000, sizeof(double)); 
	OutWaveR = (double *)calloc(wavesize + 1000, sizeof(double)); 
	allocated2 = TRUE; 
} 
 
void InitCoeffs() { 
h[  0] =  0.002293189; 
h[  1] =  0.002620682; 
h[  2] =  0.002656129; 
h[  3] =  0.001217070; 
h[  4] = -0.001808776; 
h[  5] = -0.005739759; 
h[  6] = -0.009125375; 
h[  7] = -0.010175622; 
h[  8] = -0.007534091; 
h[  9] = -0.001098900; 
h[ 10] =  0.007490469; 
h[ 11] =  0.015053046; 
h[ 12] =  0.017839775; 
h[ 13] =  0.013067353; 
h[ 14] =  0.000460646; 
h[ 15] = -0.016855007; 
h[ 16] = -0.032656648; 
h[ 17] = -0.039204497; 
h[ 18] = -0.029771075; 
h[ 19] = -0.001257165; 
h[ 20] =  0.044066612; 
h[ 21] =  0.098432994; 
h[ 22] =  0.150329037; 
h[ 23] =  0.187637950; 
h[ 24] =  0.201208089; 
h[ 25] =  0.187637950; 
h[ 26] =  0.150329037; 
h[ 27] =  0.098432994; 
h[ 28] =  0.044066612; 
h[ 29] = -0.001257165; 
h[ 30] = -0.029771075; 
h[ 31] = -0.039204497; 
h[ 32] = -0.032656648; 
h[ 33] = -0.016855007; 
h[ 34] =  0.000460646; 
h[ 35] =  0.013067353; 
h[ 36] =  0.017839775; 
h[ 37] =  0.015053046; 
h[ 38] =  0.007490469; 
h[ 39] = -0.001098900; 
h[ 40] = -0.007534091; 
h[ 41] = -0.010175622; 
h[ 42] = -0.009125375; 
h[ 43] = -0.005739759; 
h[ 44] = -0.001808776; 
h[ 45] =  0.001217070; 
h[ 46] =  0.002656129; 
h[ 47] =  0.002620682; 
h[ 48] =  0.002293189; 
h[ 49] =  0.000000000; 
} 
 
void OutWaveCalFir() 
{ 
	int i, m; 
	double acc, accr; 
	double tmpL, tmpR; 
 
	AllocateMemory2(); 
	for( i = 0; i < wavesize; i++ ) { 
		OutWave[i] = 0.0; 
		OutWaveR[i] = 0.0; 
	} 
 
	double k2 = 1.0; 
	for ( i = 0; i < bitlength - 1; i++ ) {  
		k2 = k2 * 2.0; 
	} 
	k2 = k2 - 1.0;  // k2 = 128 at 8 bits, 32768 for 16 bits 
	for(i = 0; i < wavesize; i++) { 
		acc = 0.0;  
		accr = 0.0; 
		for(m =	0; m < TapN_FIR; m++) { 
			if(i-m < 0) { 
				tmpL = 0.0; 
				tmpR = 0.0; 
			} else { 
				tmpL = InWave[i-m]; 
				tmpR = InWaveR[i-m]; 
			} 
			acc = acc + h[m] * tmpL; 
			accr = accr + h[m] * tmpR; 
		} 
		if(acc > k2) acc = k2; // to be prepared for overflowing 
		if(accr > k2) accr = k2; 
		if(acc < -k2) acc = -k2;  
		if(accr < -k2) accr = -k2; 
		OutWave[i] = acc; 
		OutWaveR[i] = accr; 
	} 
} 
//filter and save wave form ----------end 
 
//sace waveform ------begin 
void put_ulong(long x, FILE *f) 
{ 
    unsigned char s[4]; 
	long divident; 
	int numwritten; 
 
	s[3] = (unsigned char)(x / 256LU / 256LU / 256LU); 
	divident = x - s[3] * 256LU * 256LU * 256LU; 
	s[2] = (unsigned char)(divident / 256LU / 256LU); 
	divident = x - s[3] * 256LU * 256LU * 256LU - s[2] * 256LU * 256LU; 
	s[1] = (unsigned char)(divident / 256LU); 
	s[0] = (unsigned char)(x - s[3] * 256LU * 256LU * 256LU  
			- s[2] * 256LU * 256LU - s[1] * 256LU); 
 
	numwritten = fwrite( s, 4, 1, f ); 
} 
 
void put_ushort(short x, FILE *f) 
{ 
    unsigned char s[2]; 
	int numwritten; 
 
	s[1] = (unsigned char)(x / 256LU); 
	s[0] = (unsigned char)(x - s[1] * 256LU); 
 
	numwritten = fwrite( s, 2, 1, f ); 
} 
 
void put_ubyte(short x, FILE *f) 
{ 
    unsigned char s[1]; 
	int numwritten; 
 
	s[0] = (unsigned char)(x + 128); 
 
	numwritten = fwrite( s, 1, 1, f ); 
} 
 
void PutWavInfo()  
{ 
	char s[10]; 
	int numwritten; 
	int i, m; 
	FILE *ifp; 
	CString filenamesv; 
	CFileDialog dlgF(FALSE, "NULL", "test1.wav"); 
 
	if( dlgF.DoModal() == IDOK)	{ 
		filenamesv = dlgF.GetPathName(); 
		ifp = fopen( filenamesv, "wb" ); 
		if (ifp != NULL) { //  
			sprintf(s, "RIFF");  
			numwritten = fwrite( s, 4, 1, ifp ); 
			put_ulong(bytesinfile, ifp); // total bytes in the file 
			sprintf(s, "WAVEfmt ");  
			numwritten = fwrite( s, 8, 1, ifp ); 
			put_ulong(16, ifp); // 16 bytes -- always 
			put_ushort(1, ifp); // 1: pcm 
			put_ushort(mono1_stereo2, ifp); // 1: mono, 2; stereo 
			put_ulong(samplingfreq, ifp); // sampling frequency	 
			put_ulong(bytes_per_sec, ifp); // bytes per second 
			put_ushort(chbytes_per_sample, ifp); // bytes per sample 
			put_ushort(bitlength, ifp); // bit length 
			sprintf(s, "datafmt ");  
			numwritten = fwrite( s, 4, 1, ifp ); 
			put_ulong(totalbytes, ifp); // total bytes of wav data 
			if (mono1_stereo2 == 1) { 
				for (i = 0; i < wavesize; i++) { // write mono wav data 
					if (bytes_per_sample == 2)  
						put_ushort((short)OutWave[i], ifp); 
					else  
						put_ubyte((short)OutWave[i], ifp); 
				} 
			} else { 
				for (i = 0; i < wavesize * 2; i++) { // write stereo wav data  
					m = i / 2; 
					if (bytes_per_sample == 2)  
						if(i%2==0) put_ushort((short)OutWave[m], ifp); 
						else put_ushort((short)OutWaveR[m], ifp); 
					else 
						if(i%2==0) put_ubyte((short)OutWave[m], ifp); 
						else put_ubyte((short)OutWaveR[m], ifp); 
				} 
			} 
			fclose( ifp ); 
		} 
	} 
} 
 
 
//save waveform -----------end 
 
//fft waveform----begin 
double power[256]; 
 
///////////////////////////////////////////// 
// FFT calculation 
#define HANNING_WIDOW			1 
#define HAMMING_WINDOW			2 
#define BLACKMAN_WINDOW			3 
#define BLACKMAN_HARRIS_WINDOW	4 
#define BARTLETT_WINDOW			5 
 
int which_window=0; 
int is_db = 0; 
 
void FftCal(double* InW) 
{ 
	int N = 256;  
	int P;  
	double M_PI = 3.1415928; 
	int N_2 = N/2; 
	int i,j,k,kp,m,h; 
	double m_double; 
	double w1, w2; 
	double t1,t2,s1,s2; 
	int x0 = 80; 
	int y0 = 200; 
	double fReal[256], fImag[256], tri[256]; 
 
	i = N; P = 0; 
	while (i != 1) { 
		i = i / 2; 
		P++; 
	} 
 
	double win[256]; 
	 
 
	if(which_window == HANNING_WIDOW) 
	{ 
		// Hanning Window 
		for( i = 0; i < N; i++ ) { 
			win[i] = 0.5 * (1.0 - cos(M_PI * 2 * i / (N-1)));  
		} 
		 
	} 
	else if(which_window == HAMMING_WINDOW) 
	{ 
		// Hamming Window 
		for( i = 0; i < N; i++ )  
		{ 
			win[i] = 0.54 - 0.46 * cos(M_PI * 2 * i / (N-1));  
		} 
	} 
	else if(which_window == BLACKMAN_WINDOW) 
	{ 
		// Blackman Window 
		for( i = 0; i < N; i++ ) { 
			win[i] = 0.42 - 0.5 * cos(M_PI * 2 * i / (N-1)) + 
				0.08 * cos(2.0 * M_PI * 2 * i / (N-1));  
		} 
	} 
	else if(which_window == BLACKMAN_HARRIS_WINDOW) 
	{ 
		// Blackman-Harris Window 
		double a0 = 0.35875; 
		double a1 = 0.48829; 
		double a2 = 0.14128; 
		double a3 = 0.01168; 
		for( i = 0; i < N; i++ ) { 
			win[i] = a0 - a1 * cos(M_PI * 2 * (i+0.5) / N) + 
				a2 * cos(M_PI * 2 * 2.0 * (i+0.5) / N) -  
				a3 * cos(M_PI * 2 * 3.0 * (i+0.5) / N); 
		} 
	} 
	else if(which_window == BARTLETT_WINDOW) 
	{ 
		// Bartlett Window 
		for( i = 0; i <= (N-1)/2; i++ ) { 
			win[i] = 2.0 * i / (N-1); 
		} 
		for( i = (N-1)/2; i < N; i++ ) { 
			win[i] = 2.0 - 2.0 * i / (N-1); 
		} 
	} 
 
	if(which_window == 0) 
	{ 
		for (i = 0; i < N; i++) { 
			fReal[i] = InW[i]; fImag[i] = 0.0; 
		} 
	} 
	else 
	{ 
		for (i = 0; i < N; i++) { 
			fReal[i] = InW[i]*win[i]; fImag[i] = 0.0; 
		} 
	} 
 
	for ( j = 0; j < N_2; j++ ) { 
		tri[j] = cos( 2 * j * M_PI / N ); 
		tri[j + N_2] = (-1.0) * sin( 2 * j * M_PI / N ); 
	} 
 
	j = 0; 
	for ( i = 0; i <= N-2; i++ ) { 
		if (i < j) { 
			t1 = fReal[j]; fReal[j] = fReal[i]; fReal[i] = t1; 
			t2 = fImag[j]; fImag[j] = fImag[i]; fImag[i] = t2; 
		} 
		k = N_2; 
		while (k <= j) { 
			j = j - k; k = k/2; 
		} 
		j = j + k; 
	} 
 
	for ( i = 1; i <= P; i++ ) { 
		m_double = pow(2.0, double(i)); 
		m = int(m_double); 
		h = m/2; 
		for ( j = 0; j < h; j ++ ) { 
			w1 = tri[j*(N/m)]; 
			w2 = tri[j*(N/m) + N_2]; 
			for( k = j; k < N; k+=m ) { 
				kp = k + h; 
				s1 = fReal[kp] * w1 - fImag[kp] * w2; 
				s2 = fReal[kp] * w2 + fImag[kp] * w1; 
				t1 = fReal[k] + s1; fReal[kp] = fReal[k] - s1; fReal[k] = t1; 
				t2 = fImag[k] + s2; fImag[kp] = fImag[k] - s2; fImag[k] = t2; 
			} 
		} 
	} 
 
	for ( i = 0; i < N; i++ ) { 
		power[i] = sqrt(fReal[i] * fReal[i] + fImag[i] * fImag[i]) / N; 
	} 
} 
 
///////////////////////////////////////////// 
// FFT Drawing 
void FftDraw(CPaintDC &dc, int x0, int y0, double* Xfr) 
{ 
	double start_fr, end_fr, mid_fr; 
	double tmp_xfr[400]; 
	int	i; 
	char freq_char[15]; 
	char mag_char[15]; 
	double mag_scale = 4000; 
	int yscale = 100; 
	int xscale = 510; 
 
 
	if(is_db ==1) 
	{ 
		mag_scale = (int)(20*log10(mag_scale)); 
		yscale = (int)(20*log10(yscale)); 
	} 
 
	CPen	myPen; 
	CPen*	pOldPen; 
	 
	start_fr = 0.0; 
	end_fr = samplingfreq; 
	mid_fr = samplingfreq / 2.0; 
 
	sprintf(freq_char,"%9.1f", start_fr); 
	dc.TextOut(x0 - 50, y0 + 130, freq_char); 
	sprintf(freq_char,"%9.1f", mid_fr); 
	dc.TextOut(x0 + 220, y0 + 130, freq_char); 
	sprintf(freq_char,"%9.1f", end_fr); 
	dc.TextOut(x0 + 460, y0 + 130, freq_char); 
	dc.TextOut(x0 + 540, y0 + 130,"[Hz]"); 
 
	dc.TextOut(x0 - 30, y0 + 100 - 8,"0.0"); 
	sprintf(mag_char,"%9.1f", mag_scale ); 
	dc.TextOut(x0 - 70, y0 - 10, mag_char); 
	 
	myPen.CreatePen(PS_DOT, 1, RGB(100,100,100)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i <= 5; i++) { 
		dc.MoveTo(x0, y0 + i * yscale/4); 
		dc.LineTo(x0 + xscale, y0 + i * yscale/4); 
	} 
 
	for(i = 0; i <= 10; i++) { 
		dc.MoveTo(x0 + i * (xscale / 10), y0); 
		dc.LineTo(x0 + i * (xscale / 10), y0 + yscale*5/4); 
	} 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
 
	dc.MoveTo(x0, y0); 
	dc.LineTo(x0 + xscale, y0); 
	dc.MoveTo(x0, y0 + yscale*5/4); 
	dc.LineTo(x0 + xscale, y0 + yscale*5/4); 
	dc.MoveTo(x0, y0); 
	dc.LineTo(x0, y0 + yscale*5/4); 
	dc.MoveTo(x0 + xscale, y0); 
	dc.LineTo(x0 + xscale, y0 + yscale*5/4); 
	 
	myPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i < 256; i++) { 
		tmp_xfr[i] = Xfr[i] / (mag_scale / yscale); 
	} 
 
	if( is_db==0) 
	{ 
		for(i = 0; i < 256-1; i++) { 
			dc.MoveTo(x0 + i*2, y0 + 100 - (int)(tmp_xfr[i])); 
			dc.LineTo(x0 + (i + 1)*2,	y0 + 100 - (int)(tmp_xfr[i + 1])); 
		} 
	} 
	else if( is_db==0) 
	{ 
		for(i = 0; i < 256-1; i++) { 
			dc.MoveTo(x0 + i*2, 20*log10(y0 + 100 - (int)(tmp_xfr[i]))); 
			dc.LineTo(x0 + (i + 1)*2,	20*log10(y0 + 100 - (int)(tmp_xfr[i + 1]))); 
		} 
	} 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
} 
 
//fft waveform ----end 
 
//iir filter---begin 
double	p_InWave[400]; 
double	p_OutWave[400]; 
double	p_Fsamp = 100.0; 
double	p_INA = 50.0; 
double	p_Fsig = 5.0; 
int		p_sqw = 1; 
double	a0 = 0.067; 
double	a1 = 0.135; 
double	a2 = 0.067; 
double	b1 =-1.143; 
double	b2 = 0.413; 
 
BOOL	UserWave = FALSE; 
BOOL	SaveOutWave = FALSE; 
 
// Calculate Input Wave  
void InWaveCal() 
{		dotn = 200; 
	int i; 
	double sinthita; 
	double sinvalue; 
	double pai = 3.1415926; 
 
	if( UserWave == FALSE ) { 
		for(i = 0; i < 400; i++) { 
			sinthita = 2 * pai * p_Fsig * (1.0 / p_Fsamp) * i; 
			sinvalue = sin(sinthita); 
			p_InWave[i] = p_INA * sinvalue; 
		} 
		if(p_sqw == 1) { 
			for(i = 0; i < 400; i++) { 
				if(	p_InWave[i] >= 0 ) { 
					p_InWave[i] = 1.0 * p_INA; 
				} else { 
					p_InWave[i] = (-1.0) * p_INA; 
				} 
			} 
		} 
	} 
} 
 
void WaveDraw2(CPaintDC& dc, int x1, int y1, double* InWave) 
{ 
	CPen	myPen; 
	CPen*	pOldPen; 
 
	int i; 
 
	myPen.CreatePen(PS_DOT, 1, RGB(0,255,0)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	dc.MoveTo(x1, y1); 
	dc.LineTo(x1 + dotn * 3, y1); 
 
	dc.MoveTo(x1, y1 - 50); 
	dc.LineTo(x1 + dotn * 3, y1 - 50); 
 
	dc.MoveTo(x1, y1 + 50); 
	dc.LineTo(x1 + dotn * 3, y1 + 50); 
 
	dc.MoveTo(x1, y1 - 50); 
	dc.LineTo(x1, y1 + 50); 
	dc.MoveTo(x1 + (int)(dotn * 3 / 2), y1 - 50); 
	dc.LineTo(x1 + (int)(dotn * 3 / 2), y1 + 50); 
	dc.MoveTo(x1 + dotn * 3, y1 - 50); 
	dc.LineTo(x1 + dotn * 3, y1 + 50); 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
 
	myPen.CreatePen(PS_SOLID, 1, RGB(0,0,255)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i < dotn-2; i++) { 
		dc.MoveTo(x1 + (i  ) * 3, y1 + (int)((-1) * InWave[i+0])); 
		dc.LineTo(x1 + (i+1) * 3, y1 + (int)((-1) * InWave[i+1])); 
	} 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
} 
 
void CommentDraw(CPaintDC& dc, int x0, int y0) 
{ 
	CString	tmp_str = ""; 
	CString	hz_str = " [Hz]"; 
	CString	s_str = " [s]"; 
	char	tmp_char[15]; 
 
	tmp_str = "Sampling Freqency = "; 
	sprintf(tmp_char,"%12.2f", p_Fsamp); 
	tmp_str = tmp_str + tmp_char + hz_str; 
	dc.TextOut(x0 + 0, y0 + 0,tmp_str); 
 
	tmp_str = "Signal Freqency = "; 
	sprintf(tmp_char,"%12.2f", p_Fsig); 
	tmp_str = tmp_str + tmp_char + hz_str; 
	dc.TextOut(x0 + 0, y0 + 20,tmp_str); 
 
	tmp_str = ""; 
	sprintf(tmp_char,"%12.6f", dotn / p_Fsamp); 
	tmp_str = tmp_str + tmp_char + s_str; 
	dc.TextOut(x0 + dotn * 3 - 40, y0 + 310, tmp_str); 
 
	tmp_str = ""; 
	sprintf(tmp_char,"%12.6f", (dotn/2) / p_Fsamp); 
	tmp_str = tmp_str + tmp_char + s_str; 
	dc.TextOut(x0 + (dotn/2) * 3 - 40, y0 + 310, tmp_str); 
 
	tmp_str = ""; 
	sprintf(tmp_char,"%12.6f", 0 / p_Fsamp); 
	tmp_str = tmp_str + tmp_char + s_str; 
	dc.TextOut(x0 - 40, y0 + 310, tmp_str); 
 
	dc.TextOut(x0 - 45, y0 + 100, "Input"); 
	dc.TextOut(x0 - 45, y0 + 230, "Output"); 
} 
 
void OutWaveCal() 
{ 
	int i; 
 
	for(i = 0; i < 400; i++) p_OutWave[i] = 0.0; 
 
	for(i = 2; i < 400; i++) { 
		p_OutWave[i] = a0 * p_InWave[i-0] + a1 * p_InWave[i-1] + a2 * p_InWave[i-2] 
			- b1 * p_OutWave[i-1] - b2 * p_OutWave[i-2]; 
	} 
} 
 
 
//iir filter ----end 
 
//iir freq response  ----begin 
 
 
double	pai = 3.14159; 
 
double	FGain[400]; 
double	FTh[400];    
 
double	Fsamp = 100.0; 
 
////////////////////////////////////////////// 
// Frequency Response Calculate 
void FresCal() 
{ 
a0 = 0.2; 
a1 = 0.2; 
a2 = 0.2; 
b1 = 0.2; 
b2 = 0.2; 
	int i; 
	double	omega; 
	double	AReal; 
	double	AImag; 
	double	AAbs_2; 
	double	BReal; 
	double	BImag; 
	double	BAbs_2; 
	double	HAbs_2; 
	double	HzdB; 
	double	HThita; 
 
	for(i = 0; i < 360; i++) { 
		omega = i * pai / 180.0 + 0.001; 
 
		AReal = 0.0; AImag = 0.0; 
 
		AReal =  a0 + a1 * cos(1.0 * omega) + a2 * cos(2.0 * omega); 
		AImag = 0.0 - a1 * sin(1.0 * omega) - a2 * sin(2.0 * omega); 
		AAbs_2 = AReal * AReal + AImag * AImag; 
 
		BReal = 0.0; BImag = 0.0; 
 
		BReal = 1.0 + b1 * cos(1.0 * omega) + b2 * cos(2.0 * omega); 
		BImag = 0.0 - b1 * sin(1.0 * omega) - b2 * sin(2.0 * omega); 
		BAbs_2 = BReal * BReal + BImag * BImag; 
 
		HAbs_2 = AAbs_2 / BAbs_2; 
		HzdB = 10 * log10(HAbs_2); 
		if(HzdB < -60.0) { 
			HzdB = -60.0; 
		} 
		if(HzdB > 40.0) { 
			HzdB = 40.0; 
		} 
 
		HThita = atan((AImag*BReal - AReal*BImag) / (AReal*BReal + AImag*BImag)); // fixed Mar/02 
 
		FGain[i] = HzdB; 
		FTh[i] = HThita; 
	} 
} 
 
///////////////////////////////////////////// 
///////////////////////////////////////////// 
// Frequency Response Drawing 
void FresDraw(CPaintDC &dc, double* Xfr, double* Xth, int x0=80, int y0=50) 
{ 
	int	i; 
	char freq_char[15]; 
 
	CPen	myPen; 
	CPen*	pOldPen; 
 
	dc.TextOut(x0 - 40, y0 -  28,"Gain"); 
	dc.TextOut(x0 - 40, y0 -   8," 40"); 
	dc.TextOut(x0 - 40, y0 +  12," 30"); 
	dc.TextOut(x0 - 40, y0 +  32," 20"); 
	dc.TextOut(x0 - 40, y0 +  52," 10"); 
	dc.TextOut(x0 - 40, y0 +  72,"  0"); 
	dc.TextOut(x0 - 40, y0 +  92,"-10"); 
	dc.TextOut(x0 - 40, y0 + 112,"-20"); 
	dc.TextOut(x0 - 40, y0 + 132,"-30"); 
	dc.TextOut(x0 - 40, y0 + 152,"-40"); 
	dc.TextOut(x0 - 40, y0 + 172,"-50"); 
	dc.TextOut(x0 - 40, y0 + 192,"-60"); 
	dc.TextOut(x0 - 40, y0 + 212,"[dB]"); 
	 
	dc.TextOut(x0 + 360 + 10, y0 -  28,"Phase"); 
	dc.TextOut(x0 + 360 + 10, y0 -   8,"  pai "); 
	dc.TextOut(x0 + 360 + 10, y0 +  32," pai/2"); 
	dc.TextOut(x0 + 360 + 10, y0 +  72,"   0 "); 
	dc.TextOut(x0 + 360 + 10, y0 + 112,"-pai/2"); 
	dc.TextOut(x0 + 360 + 10, y0 + 152," -pai "); 
	dc.TextOut(x0 + 360 + 10, y0 + 175,"[rad]"); 
 
	dc.TextOut(x0 - 10,         y0 + 200," 0"); 
	sprintf(freq_char,"%12.2f", Fsamp / 2.0); 
	dc.TextOut(x0 - 10 + 140, y0 + 200,freq_char); 
	sprintf(freq_char,"%12.2f", Fsamp); 
	dc.TextOut(x0 - 10 + 320, y0 + 200,freq_char); 
	dc.TextOut(x0 - 10 + 410, y0 + 200,"[Hz]"); 
 
	myPen.CreatePen(PS_DOT, 1, RGB(100,100,100)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i <= 10; i++) { 
		dc.MoveTo(x0      , y0 + i * 20); 
		dc.LineTo(x0 + 360, y0 + i * 20); 
	} 
 
	for(i = 0; i <= 10; i++) { 
		dc.MoveTo(x0 + i * (360 / 10), y0); 
		dc.LineTo(x0 + i * (360 / 10), y0 + 200); 
	} 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
 
	myPen.CreatePen(PS_DOT, 1, RGB(50,50,50)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	dc.MoveTo(x0      , y0 + 4 * 20); 
	dc.LineTo(x0 + 360, y0 + 4 * 20); 
 
	dc.MoveTo(x0 + 5 * (360 / 10), y0); 
	dc.LineTo(x0 + 5 * (360 / 10), y0 + 200); 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
 
	for(i = 0; i <= 10; i = i + 10) { 
		dc.MoveTo(x0      , y0 + i * 20); 
		dc.LineTo(x0 + 360, y0 + i * 20); 
	} 
	for(i = 0; i <= 10; i = i + 10) { 
		dc.MoveTo(x0 + i * (360 / 10), y0); 
		dc.LineTo(x0 + i * (360 / 10), y0 + 200); 
	} 
 
	myPen.CreatePen(PS_SOLID, 1, RGB(0,255,0)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i < 359; i++) { 
    	dc.MoveTo(x0 + i    , y0 + 80 - (int)(25.5 * Xth[i])); 
		dc.LineTo(x0 + i + 1,	y0 + 80 - (int)(25.5 * Xth[i+1])); 
	} 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
 
	myPen.CreatePen(PS_SOLID, 1, RGB(255,0,0)); 
	pOldPen = dc.SelectObject(&myPen); 
 
	for(i = 0; i < 359; i++) { 
    	dc.MoveTo(x0 + i    , y0 + 80 - (int)(2.0 * Xfr[i])); 
		dc.LineTo(x0 + i + 1,	y0 + 80 - (int)(2.0 * Xfr[i+1])); 
	} 
 
	dc.SelectObject(pOldPen); 
	myPen.DeleteObject(); 
} 
 
 
 
 
//iir freq response   -----end 
BOOL CWaveLoadDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	GetWavInfo(); 
	m_cWhichWindow.InsertString(0,"NO_WINDOW"); 
	m_cWhichWindow.InsertString(1,"HANNING_WIDOW		"); 
	m_cWhichWindow.InsertString(2,"HAMMING_WINDOW		"); 
	m_cWhichWindow.InsertString(3,"BLACKMAN_WINDOW		"); 
	m_cWhichWindow.InsertString(4,"BLACKMAN_HARRIS_WIN  "); 
	m_cWhichWindow.InsertString(5,"BARTLETT_WINDOW		"); 
	m_cWhichWindow.SetCurSel(0); 
 
	m_cIsDB.InsertString(0, "NORMAL"); 
	m_cIsDB.InsertString(1,"DB"); 
	m_cIsDB.SetCurSel(0); 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
 
void CWaveLoadDlg::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	if(loaded == TRUE)  
	{ 
		InfoDraw(dc, 80, 20); 
		WaveDraw(dc, 80, 200, InWave); 
 
		if(wave_oper == 1) 
		{ 
			InitCoeffs(); 
			OutWaveCalFir(); 
			WaveDraw(dc, 80, 450, OutWave); 
		} 
		else if(wave_oper == 2) 
		{ 
			FftCal (InWave); 
			FftDraw (dc, 80, 450, power); 
		} 
		else if(wave_oper == 3) 
		{ 
			InWaveCal();  
			WaveDraw2(dc,80,450,p_InWave);  
			OutWaveCal();  
			WaveDraw(dc,80,450,p_OutWave);  
			CommentDraw(dc,80,580); 
		} 
		else if(wave_oper == 4) 
		{ 
			FresCal();  
			FresDraw(dc,FGain,FTh, 80, 450);  
		} 
	 
 
 
	} 
	 
	// Do not call CDialog::OnPaint() for painting messages 
} 
 
void CWaveLoadDlg::OnLoadWave()  
{ 
	GetWavInfo(); 
	InvalidateRect(NULL,TRUE); 
} 
 
void CWaveLoadDlg::OnSaveWave()  
{ 
	if(loaded == TRUE) PutWavInfo(); 
		InvalidateRect(NULL, TRUE); 
	 
} 
 
void CWaveLoadDlg::OnFilterWave()  
{ 
	wave_oper=1; 
	InvalidateRect(NULL,TRUE); 
} 
 
void CWaveLoadDlg::OnFftWave()  
{ 
	wave_oper=2; 
	InvalidateRect(NULL,TRUE); 
} 
 
void CWaveLoadDlg::OnSelchangeWhichWindow()  
{ 
	which_window = m_cWhichWindow.GetCurSel();	 
	OnFftWave(); 
} 
 
 
void CWaveLoadDlg::OnSelchangeIsDb()  
{ 
	is_db = m_cIsDB.GetCurSel();	 
	OnFftWave();	 
} 
 
void CWaveLoadDlg::OnIirFilter()  
{ 
	wave_oper=3; 
	InvalidateRect(NULL,TRUE);	 
} 
 
void CWaveLoadDlg::OnIirFreqResponse()  
{ 
	wave_oper=4; 
	InvalidateRect(NULL,TRUE); 
} 
 
//DEL void CWaveLoadDlg::OnGenSineWaveAnalysis()  
//DEL { 
//DEL 	CWaveAnalysis wave_a; 
//DEL 	BYTE sin_wave[1024]; 
//DEL 	for(int i=0;i<1024;i++) 
//DEL 	{ 
//DEL 		sine_wave[i]=10sin(2*PI*10*i/1024); 
//DEL 	} 
//DEL 	 
//DEL } 
 
void CWaveLoadDlg::OnTest()  
{ 
	FILE *pfile; 
	pfile=fopen("c:\\test.gsm.wav", "ab+"); 
	fseek(pfile, 4, 0); 
	int x=1000; 
	fwrite(&x, 4, 1, pfile); 
	fclose(pfile); 
}