⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 createfilterdlg.cpp

📁 数字信号处理作业
💻 CPP
📖 第 1 页 / 共 2 页
字号:

// 生成实部
// 入口参数:数组名和长度
// Xabs:     存储模值的数组名,相当与返回值
// Xreal:    存储实部的数组名
// Ximag     存储虚部的数组名
// n:	     数组的长度
void CCreatefilterDlg::CreateReal(float *&Xreal, float *Xabs, float *Xarg, int n)
{
	if (Xreal != NULL)
	{
		delete []Xreal;
		Xreal = NULL;
	}
	Xreal = new float[n];
	memset(Xreal, 0, sizeof(float) * n);
	int i;
	for(i=0; i<n; i++)
	{
		Xreal[i] = Xabs[i] * cos(Xarg[i]);
	}
}

// 生成虚部
// 入口参数:数组名和长度
// Xabs:     存储模值的数组名,相当与返回值
// Ximag:    存储虚部的数组名
// Xarg      存储角度的数组名
// n:	     数组的长度
void CCreatefilterDlg::CreateImag(float *&Ximag, float *Xabs, float *Xarg, int n)
{
	if (Ximag != NULL)
	{
		delete []Ximag;
		Ximag = NULL;
	}
	Ximag = new float[n];
	memset(Ximag, 0, sizeof(float) * n);
	int i;
	for(i=0; i<n; i++)
	{
		Ximag[i] = Xabs[i] * sin(Xarg[i]);
	}
}


//求最大的绝对值
float CCreatefilterDlg::mymax(float *a, int n)
{
	int i;
	float *b = a;
	float num = 0;
	for (i=0; i<n; i++)
	{
		if(fabs(*b) > num)
			num = fabs(*b);
		b++;
	}
	return num;
}

// 生成DFT变换的实部和虚部,
// 入口参数:数组名和长度
// Xreal:    存储FFT结果实部的数组名,相当与返回值
// Ximag:    存储FFT结果虚部的数组名,相当于返回值
// xreal:    存储时间序列实部的数组名
// ximga:    存储时间序列虚部的数组名
// n:	     数组的长度
void CCreatefilterDlg::CreateDFT(float *&Xreal, float *&Ximag, float *xreal, float *ximag, int n, int nh)
{
	int k;
	int i;
	if (Xreal != NULL)
	{
		delete[]Xreal;
		Xreal = NULL;
	}
	if (Ximag != NULL)
	{
		delete[]Ximag;
		Ximag = NULL;
	}
	Xreal = new float [n];
	Ximag = new float [n];
	float * xrealtemp = new float [n];
	float * ximagtemp = new float [n];
	memset(Xreal, 0, sizeof(float)*n);
	memset(Ximag, 0, sizeof(float)*n);
	memset(xrealtemp, 0, sizeof(float)*n);
	memset(ximagtemp, 0, sizeof(float)*n);
	for(k=0; k<nh; k++)
	{
		xrealtemp[k] = xreal[k];
		ximagtemp[k] = ximag[k];
	}
	for (k=0; k<n; k++)
	{
		Xreal[k] = 0;
		Ximag[k] = 0;
		for (i=0; i<n; i++)
		{	
			Xreal[k] += xrealtemp[i]*cos(2*PI*k*i/n) + ximagtemp[i]*sin(2*PI*k*i/n);
			Ximag[k] += ximagtemp[i]*cos(2*PI*k*i/n) - xrealtemp[i]*sin(2*PI*k*i/n);					
		}
	}
	delete []xrealtemp;
	delete []ximagtemp;
	modify();
}

// 生成IDFT变换的实部和虚部,
// 入口参数:数组名和长度
// xreal:    存储IFFT结果实部的数组名,相当与返回值
// ximag:    存储IFFT结果虚部的数组名,相当于返回值
// Xreal:    存储序列实部的数组名
// Ximga:    存储序列虚部的数组名
// n:	     返回数组的长度,为32
// nh:       为50
void CCreatefilterDlg::CreateIDFT(float *&xreal, float *&ximag, float *Xreal, float *Ximag, int n, int nh)
{
	int k;
	int i;
	if (xreal != NULL)
	{
		delete[]xreal;
		xreal = NULL;
	}
	if (ximag != NULL)
	{
		delete[]ximag;
		ximag = NULL;
	}
	xreal = new float [n];
	ximag = new float [n];
	float * xrealtemp = new float [nh];
	float * ximagtemp = new float [nh];
	memset(xreal, 0, sizeof(float)*n);
	memset(ximag, 0, sizeof(float)*n);
	memset(xrealtemp, 0, sizeof(float)*nh);
	memset(ximagtemp, 0, sizeof(float)*nh);
	for (k=0; k<nh; k++)
	{
		xrealtemp[k] = 0;
		ximagtemp[k] = 0;
		for (i=0; i<nh; i++)
		{	
			xrealtemp[k] += Xreal[i]*cos(2*PI*k*i/nh) - Ximag[i]*sin(2*PI*k*i/nh);
			ximagtemp[k] += Xreal[i]*cos(2*PI*k*i/nh) + Ximag[i]*sin(2*PI*k*i/nh);					
		}
		xrealtemp[k] = xrealtemp[k]/nh;
		ximagtemp[k] = ximagtemp[k]/nh;
	}
	for (i = 0; i<n; i++)
	{
		xreal[i] = xrealtemp[i];
		ximag[i] = ximagtemp[i];
	}
	delete []xrealtemp;
	delete []ximagtemp;
}

// 生成横截的数列
void CCreatefilterDlg::CreateHengjie()
{
	CClientDC mydc(this);
	int i;
	CString str;
	// 先生成h(n);
	CreateH();	
	// 再生成x(n);
	CreateX();	
	// 生成 y(n);
	CreateY();	
	/*
	for (i=0; i<m_yCount; i++)
	{
		str.Format("%.4f", yreal[i]);
		mydc.TextOut(10,i*20,str);
	}
    */
	// 求DFT
	CreateDFT(yFFTReal, yFFTImag, yreal, yimag, m_dftCount, m_yCount);
	CreateAbs(yFFTAbs, yFFTReal, yFFTImag, m_dftCount);
	/*
	for (i=0; i<m_dftCount; i++)
	{
		str.Format("%.2f", yFFTAbs[i]);
		mydc.TextOut(10,i*20,str);
	}
	*/
	CreateArg(yFFTArg, yFFTReal, yFFTImag, m_dftCount);
	maxy = mymax(yreal, m_yCount);
	maxyArg = mymax(yFFTArg, m_dftCount);
	maxyAbs = mymax(yFFTAbs, m_dftCount);		
}

// 生成级联的数列
void CCreatefilterDlg::CreateJilian()
{
	/*
	m_dftCount = 50;
	if (yFFTAbs != NULL)
	{
		delete []yFFTAbs;
		yFFTAbs = NULL;
	}
	if (yFFTArg != NULL)
	{
		delete []yFFTArg;
		yFFTArg = NULL;
	}
	yFFTAbs = new float [m_dftCount];
	yFFTArg = new float [m_dftCount];
	memset(yFFTAbs, 0, sizeof(float)*m_dftCount);
	memset(yFFTArg, 0, sizeof(float)*m_dftCount);
	float tempAbs1, tempArg1;
	float tempAbs2, tempArg2;
	int i;
	for (i=0; i<m_dftCount; i++)
	{	
		float j = (float)i * 2 * PI / m_dftCount;
		tempAbs1 = sqrt(pow((1+cos(j)),2) + pow((sin(j)),2));
		tempAbs2 = sqrt(pow((1+49*cos(j)+cos(2.0*j)),2) + pow((49*sin(j)+sin(2.0*j)),2));
		yFFTAbs[i] = 0.01 * tempAbs1 * tempAbs2 ; 
		tempArg1 = atan2(-sin(j), 1+cos(j));
		tempArg2 = atan2(-49*sin(j)-sin(2.0*j), 1+49*cos(j)+cos(2.0*j));
		yFFTArg[i] = tempArg1 + tempArg2;
		// 注意要把结果化为 -180 ~ 180 度之间
		// 仅仅只 +-2PI 有偷懒之嫌
		if (yFFTArg[i] < -PI)
		{
			yFFTArg[i] += 2*PI;
		}
		else if (yFFTArg[i] > PI)
		{
			yFFTArg[i] -= 2*PI;
		}
	}
	CreateReal(yFFTReal, yFFTAbs, yFFTArg, m_dftCount);
	CreateImag(yFFTImag, yFFTAbs, yFFTArg, m_dftCount);
	CreateIDFT(yreal, yimag, yFFTReal, yFFTImag, 32, 50);   
	maxy = mymax(yreal, m_yCount);
	maxyArg = mymax(yFFTArg, m_dftCount);
	maxyAbs = mymax(yFFTAbs, m_dftCount);
	*/

	// 生成x[n]
	CreateX();
	int k, i, j;
	// 级联的长度和各系数
    // 用对话框来传递参数
	CLenDlg lenDlg;
	int M;
	float *b0;
	float *b1;
	float *b2;
	if (IDOK == lenDlg.DoModal())
	{
		M = lenDlg.m_len;
		b0 = new float[M];
		b1 = new float[M];
		b2 = new float[M];
		memset(b0, 0, sizeof(float)*M);
		memset(b1, 0, sizeof(float)*M);
		memset(b2, 0, sizeof(float)*M);
		i = 0;
		while(i<M)	
		{
			CParaDlg paraDlg;
			paraDlg.m_num = i+1;
			if(IDOK == paraDlg.DoModal())
			{
				b0[i] = paraDlg.m_b0;
				b1[i] = paraDlg.m_b1;
				b2[i] = paraDlg.m_b2;
				i++;
			}			
		}	
	}
	/*
		static float b0[3] = {0.01, 1, 1};
		static float b1[3] = {0, 1, 49};
		static float b2[3] = {0, 0, 1};		
	*/
	float temp1, temp2, temp3;	
	// 开辟y[n]
	if (yimag != NULL)
	{
		delete []yimag;
		yimag = NULL;
	}
	if (yreal != NULL)
	{
		delete []yreal;
		yreal = NULL;
	}
	m_yCount = 32;
	yreal = new float[m_yCount];
	yimag = new float[m_yCount];
	memset(yreal, 0, sizeof(float)*m_yCount);
	memset(yimag, 0 ,sizeof(float)*m_yCount);
	float *temp = new float [m_yCount];
	for (i=0; i<m_yCount; i++)
	{
		yreal[i] = xreal[i];
		yimag[i] = 0.0;
		temp[i] = xreal[i];
	}
	// 级联型的计算过程
	for (i=0; i<M; i++)
	{
		for (k=0; k<m_yCount; k++)
		{			
			temp1 = temp[k];
			temp2 = (k>0 ? temp[k-1] : 0.0);
			temp3 = (k>1 ? temp[k-2] : 0.0);
			yreal[k] = temp1*b0[i] + temp2*b1[i] + temp3*b2[i];			
		}
		// 注意保存上一次的临时变量
		for (k=0; k<m_yCount; k++)
		{
			temp[k] = yreal[k];
		}
	}
	delete []temp;	
	delete []b0;
	delete []b1;
	delete []b2;
	CreateDFT(yFFTReal, yFFTImag, yreal, yimag, m_dftCount, m_yCount);
	CreateAbs(yFFTAbs, yFFTReal, yFFTImag, m_dftCount);
	CreateArg(yFFTArg, yFFTReal, yFFTImag, m_dftCount);
	maxy = mymax(yreal, m_yCount);
	maxyArg = mymax(yFFTArg, m_dftCount);
	maxyAbs = mymax(yFFTAbs, m_dftCount);	
}

//显示绘图对话框
// n为1表示横截型
void CCreatefilterDlg::ShowClineDlg(int n)
{
	int i;
	CPaintDlg *LineDlg = new CPaintDlg;
	LineDlg->Create(IDD_PAINTDLG, this);
	LineDlg->LineCount1 = m_yCount;     // 时间序列的长度
	LineDlg->LineCount2 = m_dftCount;   // 幅频的长度
	LineDlg->index = n;                 // 何种类型
	LineDlg->yreal = new float [m_yCount];
	LineDlg->yAbs = new float [m_dftCount];
	LineDlg->yArg = new float [m_dftCount];
	for (i=0; i<m_yCount; i++)
	{
		LineDlg->yreal[i] = yreal[i];
	}
	for (i=0; i<m_dftCount; i++)
	{
		LineDlg->yAbs[i] = yFFTAbs[i];
	}
	for (i=0; i<m_dftCount; i++)
	{
		LineDlg->yArg[i] = yFFTArg[i];
	}	
	LineDlg->ymax = maxy;
	LineDlg->ymaxAbs = maxyAbs;
	LineDlg->ymaxArg = maxyArg;
//	UpdateData(false);
	LineDlg->ShowWindow(SW_SHOW);
}

BOOL CCreatefilterDlg::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	cs.style &= ~FWS_ADDTOTITLE;
	cs.lpszName = "  DSP实验三   3062005025";
	return CDialog::PreCreateWindow(cs);
}



void CCreatefilterDlg::modify()
{
	int i;
	for (i=0; i<m_dftCount; i++)
	{
		if (fabs(yFFTReal[i]) < 1e-6)
		{
			yFFTReal[i] = 0.0;
		}
		if (fabs(yFFTImag[i]) < 1e-6)
		{
			yFFTImag[i] = 0.0;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -