数字信号处理的几个算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

摘要

在学习数字信号处理算法程序中用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) double

funch1(int

n) { double

fbase

= (double)4/(double)5; double fr

= std::pow(fbase, n); return fr;

} //h2(x)

double

funch2(int

n) { double

fpi

= 3.1415927; return 0.5*sin((double)0.5*n);

} //y(n)

//y(n)=

sum(x(m)*y(n-m))

m=0..n double

Calcy(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;

}

相关文档
最新文档