📄 createfilterdlg.cpp
字号:
// 生成实部
// 入口参数:数组名和长度
// 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 + -