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);
}