当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 几个数字信号处理算法程序

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 几个数字信号处理算法程序


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 54 ::
收藏到网摘: n/a

几个数字信号处理算法程序

作者:liu_sir

下载源代码
 

摘要

在学习数字信号处理算法程序中用VC编写的几个通用算法程序。

关键词 离散卷积 FIR

在学习信号处理的过程中,看到书上的大部分算法都是用Fortan或者Basic实现,于是自己试验着用VC实现了一下。

1、卷积计算

 

离散卷积公式的算法实现

图1 卷积计算界面

1.1 主程序代码(省略了部分不关键代码)

	void CInterVolveDlg::CalTheNumByArray() {	this->UpdateData(TRUE);	FFuncs	funcs[2] = {funch1,funch2}; int	n = this->m_ValueN; double*	x = new double[2*(n+1)];//x(n) double*	y = new double[2*(n+1)];//y(n) double*	h = new double[2*(n+1)];//h(n) //1.init	x(n),h(n),y(n) CButton*	pbtn = (CButton*) this->GetDlgItem(IDC_RADIO1); int	nChoseItem = 0;//函数选择 if(pbtn->GetCheck())	{	nChoseItem	= 0; }	else	{	nChoseItem	= 1; }	for(int	i= 0;i<2*(n+1);i++)	{	if(i< n+1)	{	x[i] = 1;	h[i] = funcs[nChoseItem](i);	}	else	{	x[i] = 0;	h[i] = 0;	}	}	//2.y(i)=SUM(x(m)*h(i-m)) m=0..i	for(i=0;i<2*(n+1);i++)	{	y[i] = Calcy(x,h,i);	}	//显示结果	delete[] x;	delete[] y;	delete[] h;}	
1.2 各个子函数实现
typedef double (* FFuncs)(int); //h1(x) doublefunch1(intn) { doublefbase	= (double)4/(double)5; double fr	= std::pow(fbase, n); return fr;	} //h2(x)doublefunch2(intn) { doublefpi	= 3.1415927; return 0.5*sin((double)0.5*n);	} //y(n)//y(n)=sum(x(m)*y(n-m))m=0..n doubleCalcy(double x[],double h[],int n) {double	yvalue = 0; for(int	m= 0;m<=n;m++)	{	yvalue += x[m]*h[n-m];	}	return yvalue;}
2、DFT与FFT实现

程序界面,具体实现见注释及代码:


图2 DFT与FFT实现界面

2.1 主程序代码
void CFFTConversionDlg::OnBnClickedBtncal() {	this->UpdateData(TRUE);	int	nN = this->m_NumN; float	fF = this->m_NumF; float	fT = this->m_NumT; bool	bIsTimesof2 = false;	for(int i= 0;i<100;i++)	{ if(nN==(2 < < i))	{	bIsTimesof2 = true;	break;	}	}	if(!bIsTimesof2)	{	AfxMessageBox("N请输入一个以2为底的幂级数!");	this->GetDlgItem(IDC_EDTN)->SetFocus();	return;	}	COMP* x = new COMP[nN];//x(n)	COMP* X = new COMP[nN];//X(k)	initX(nN,x,fF,fT);	CButton* pRadio = (CButton*)this->GetDlgItem(IDC_RADIODFT);	if(pRadio->GetCheck())	{	DFT(nN,x,X);	}	else	{	FFT(nN,x,X);	}	char buffer[256];	COMP source = X[nN-1];	sprintf(buffer,"%f+%fi",source.real(),source.imag());	CWnd* pwnd = this->GetDlgItem(IDC_EDTRET);	pwnd->SetWindowText(buffer);	CListCtrl* pList=(CListCtrl*) this->GetDlgItem(IDC_LIST1);	CListOper oper;	oper.FillList(*pList,nN,x,X);	delete[] x;	delete[] X;}
2.2 子函数代码

说明:其中COMP为复数类型
/******************************************* Name :DFT* Function :Disperse Fuliye Transformation* Params :N -- Total count of sampling points* X -- Input sequence* Return :XN(k)=sum[x(n)*Pow(e,j2*Pi/N)] * k,n:0..N-1*******************************************/void DFT(int N,COMP x[],COMP XK[]){	double C = (2*pi)/N;	COMP t(0,0),ret(0,0);	for(int k=0;k < N;k++)	{	ret = COMP(0,0);	for(int i=0;i< N;i++)	{	t = COMP(cos(C*k*i),-sin(C*k*i));	ret += x[i]*t;	}	XK[k] = ret;	}	}/******************************************* Name :FFT* Function :Fast Fuliye Transformation* Params :N -- Total count of sampling points* X -- Input sequence* Return :XN(k)=sum[x(n)*Pow(e,j2*Pi/N)] * k,n:0..N-1*******************************************/void FFT(int N,COMP X[],COMP XK[]){	int j=0;	COMP U=0,W=0;	COMP* A = XK;	//Adjust sequence	f