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

📄 fftview.cpp

📁 数字信号处理试验
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		m_iCount = paraSetDlg.count;
		int i;
		for (i=0; i<m_iCount; i++ )
		{
			xreal[i] = CreatAttriReal(i);
			ximg[i] = CreatAttriImg(i);
		}
		CreateDFT(Xreal, Ximg, xreal, ximg,m_iCount);
		CreateAbs(XAbs, Xreal, Ximg, m_iCount);
		CreateArg(XArg, Xreal, Ximg, m_iCount);
		//调用画图对话框和求傅立叶变换
		ShowClineDlg(4, 1);
	}		
}

//显示绘图对话框
void CFFTView::ShowClineDlg(int n, int index2)
{
	int i;
// 	CLineDlg LineDlg;            //初始化
// 	LineDlg.LineCount = m_iCount;
// 	LineDlg.index = n ;
// 	LineDlg.index2 = index2;
// 	LineDlg.xPreal = xreal;
// 	LineDlg.xPimg = ximg;
// 	LineDlg.XPreal = Xreal;
// 	LineDlg.XPimg = Ximg;
// 	LineDlg.XPabs = XAbs;
// 	LineDlg.XParg = XArg;
// 	LineDlg.para1 = m_fPara1;
// 	LineDlg.para2 = m_fPara2;
// 	LineDlg.xMaxreal = mymax(xreal, m_iCount);
// 	LineDlg.xMaximg = mymax(ximg, m_iCount);
// 	LineDlg.XMaxreal = mymax(Xreal, m_iCount);
// 	LineDlg.XMaximg = mymax(Ximg, m_iCount);
// 	LineDlg.XMaxAbs = mymax(XAbs, m_iCount);
// 	LineDlg.XMaxArg = mymax(XArg, m_iCount);
// 	UpdateData(false);
// 	LineDlg.DoModal();	

	CLineDlg *LineDlg = new CLineDlg;
	LineDlg->Create(IDD_DIALOG1, this);
	LineDlg->LineCount = m_iCount;
	LineDlg->index = n;
	LineDlg->index2 = index2;

	LineDlg->xPreal = new double [m_iCount];
	LineDlg->xPimg = new double [m_iCount];
	LineDlg->XPreal = new double [m_iCount];
	LineDlg->XPimg = new double [m_iCount];
	LineDlg->XPabs = new double [m_iCount];
	LineDlg->XParg = new double [m_iCount];
	
	for (i = 0; i<m_iCount; i++)
	{
		LineDlg->xPreal[i] = xreal[i];
	}
	
	for (i = 0; i<m_iCount; i++)
	{
		LineDlg->xPimg [i] = ximg[i];
	}
	
	for (i = 0; i<m_iCount; i++)
	{
		LineDlg->XPreal[i] = Xreal[i];
	}
	
	for (i = 0; i<m_iCount; i++)
	{
		LineDlg->XPimg[i] = Ximg[i];
	}
	
	for (i = 0; i<m_iCount; i++)
	{
		LineDlg->XPabs [i] = XAbs[i];
	}
	
	for (i = 0; i<m_iCount; i++)
	{
		LineDlg->XParg[i] = XArg[i];
	}

	LineDlg->para1 = m_fPara1;
	LineDlg->para2 = m_fPara2;
	LineDlg->xMaxreal = mymax(xreal, m_iCount);
	LineDlg->xMaximg = mymax(ximg, m_iCount);
	LineDlg->XMaxreal = mymax(Xreal, m_iCount);
	LineDlg->XMaximg = mymax(Ximg, m_iCount);
	LineDlg->XMaxAbs = mymax(XAbs, m_iCount);
	LineDlg->XMaxArg = mymax(XArg, m_iCount);
	LineDlg->AddList();
	UpdateData(false);
	LineDlg->ShowWindow(SW_SHOW);
}
//高斯序列
double CFFTView::CreatGaussReal(int num, double para1, double para2)
{
	double ans;
	ans = (double)num - para1;
	ans *= ans;
	ans /= para2;
	ans = (double)exp(-ans);
	return ans;
}

double CFFTView::CreatGaussImg(int num, double para1, double para2)
{
	return 0;
}

//衰减正弦
double CFFTView::CreatAttsinReal(int num, double para1, double para2)  //para1-a, para2-f
{
	double ans;
	ans = (double)(sin(2*PI*para2*num)*exp(-1*para1*num));
	return ans;
}

double CFFTView::CreatAttsinImg(int num, double para1, double para2)
{
	return 0;
}

//三角波序列
double CFFTView::CreatTriReal(int num)
{
	int ans;
	if(num >= 0 && num <=3)
		ans = num + 1;
	else if (num >= 4 && num <= 7)
		ans = 8 - num;
	else 
		ans = 0;
	return (double)ans;
}

double CFFTView::CreatTriImg(int num)
{
	return 0;
}
//反三角序列
double CFFTView::CreatAttriReal(int num)
{
	int ans;
	if(num >= 0 && num <=3)
		ans = 4 - num;
	else if (num >= 4 && num <= 7)
		ans = num - 3;
	else 
		ans = 0;
	return (double)ans;
}

double CFFTView::CreatAttriImg(int num)
{
	return 0;
}

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

// 倒位排序函数
// j为正常序列的下标
// nu为长度的log2(长度),长度为16,则为4
// nu在以后要改为长度 count
int CFFTView::ibitr(int j, int count)
{
	int b,j1,i,j2,nu;
	int nu1;
	nu = 0;
	nu1 = count;
	while (nu1 / 2)
	{
		nu1 /= 2;
		nu ++;
	}	
	j1 = j;
	b = 0;
	for (i=1; i<=nu; i++)
	{
		j2 = j1/2;
		b = b*2 + (j1-2*j2);
		j1 = j2;
	}
	return b;
}

// 生成FFT变换的实部和虚部,
// 入口参数:数组名和长度
// Xreal:    存储FFT结果实部的数组名,相当与返回值
// Ximag:    存储FFT结果虚部的数组名,相当于返回值
// xreal:    存储时间序列实部的数组名
// ximga:    存储时间序列虚部的数组名
// n:	     数组的长度
void CFFTView::CreateFFT(double *Xreal, double *Ximag, double *xreal, double *ximag, int n)
{	
	int i,j,k,l,m,deta,p,a;	
	double treal,timag,temp;
	//赋值函数
	for (i = 0; i<n; i++)
	{
		Xreal[i] = xreal[i];
		Ximag[i] = ximag[i];
	}
	//倒位函数,交换数组内容
	for (i = 0; i<n; i++)
	{
		j = ibitr(i, n);
		if (j > i)
		{
			temp = Xreal[i];
			Xreal[i] = Xreal[j];
			Xreal[j] = temp;
			temp = Ximag[i];
			Ximag[i] = Ximag[j];
			Ximag[j] = temp;
		}
	}
	//FFT蝶形运算
	a = 0;
	k = n;
	while (k = k/2)
	{
		deta = (int)pow(2,a);		
		l = 0; 
		m = 0;
		for(i = 0; i < k; i++)
		{			
			for(j = 0; j < deta; j++)   // l 和 l+deta 的蝶形运算
			{
				p = j * k;
				treal = Xreal[l+deta] * cos(2*PI/n*p)
					+ Ximag[l+deta] * sin(2*PI/n*p);
				timag = Ximag[l+deta] * cos(2*PI/n*p)
					- Xreal[l+deta] * sin(2*PI/n*p);
				Xreal[l+deta] = Xreal[l] - treal;
				Ximag[l+deta] = Ximag[l] - timag;
				Xreal[l] = Xreal[l] + treal;
				Ximag[l] = Ximag[l] + timag;
				l++;
			}
			m += deta * 2;
			l = m;
		}
		a++;
	}
	modify();
}

// 生成DFT变换的实部和虚部,
// 入口参数:数组名和长度
// Xreal:    存储FFT结果实部的数组名,相当与返回值
// Ximag:    存储FFT结果虚部的数组名,相当于返回值
// xreal:    存储时间序列实部的数组名
// ximga:    存储时间序列虚部的数组名
// n:	     数组的长度
void CFFTView::CreateDFT(double *Xreal, double *Ximag, double *xreal, double *ximag, int n)
{
	int k;
	int i;
	for (k=0; k<n; k++)
	{
		Xreal[k] = 0;
		Ximag[k] = 0;
		for (i=0; i<n; i++)
		{
			Xreal[k] += xreal[i]*cos(2*PI*k*i/n) + ximag[i]*sin(2*PI*k*i/n);
			Ximag[k] += ximag[i]*cos(2*PI*k*i/n) - xreal[i]*sin(2*PI*k*i/n);
		}
	}
	modify();
}
// 生成模值
// 入口参数:数组名和长度
// Xabs:     存储模值的数组名,相当与返回值
// Xreal:    存储实部的数组名
// Ximag:    存储虚部的数组名
// n:	     数组的长度
void CFFTView::CreateAbs(double *Xabs, double *Xreal, double *Ximag, int n)
{
	int i;
	for(i=0; i<n; i++)
	{
		Xabs[i] = sqrt(Xreal[i]*Xreal[i] + Ximag[i]*Ximag[i]);
	}
}

// 入口参数:数组名和长度
// Xarg:     存储角度的数组名,相当与返回值
// Xreal:    存储实部的数组名
// Ximag:    存储虚部的数组名
// n:	     数组的长度
void CFFTView::CreateArg(double *Xarg, double *Xreal, double *Ximag, int n)
{
	int i;
	for(i=0; i<n; i++)
	{
		Xarg[i] = atan2(Ximag[i],Xreal[i]);
	}
}


void CFFTView::modify()
{
	int i;
	for (i=0; i<m_iCount; i++)
	{
		if (fabs(Xreal[i]) < 1e-6)
		{
			Xreal[i] = 0.0;
		}
		if (fabs(Ximg[i]) < 1e-6)
		{
			Ximg[i] = 0.0;
		}
	}
}

⌨️ 快捷键说明

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