📄 f11999115dlg.cpp
字号:
str.Format("%d",i);
pDCXn->TextOut(i,173,str);
pDCYn->TextOut(i,173,str);
}
}
UpdateData();
m_a=(m_nn-1)/2;
pDC->SelectObject(penblue);
pDCYn->SelectObject(pencyan);
pDCHw->SelectObject(pengreen);
pDCWw->SelectObject(penyellow);
if(m_type!=0) { wc=(int)(m_Wc*128);
max=Hw[0];
max2=Ww[0];
min=Hd[0];
max1=min1=Xw[0];
for(i=0;i<256;i++)
{ if(Hw[i]>max) max=Hw[i];
if(Ww[i]>max2) max2=Ww[i];
if(Hd[i]<min) min=Hd[i];
if(Xw[i]>max1) max1=Xw[i];
if(Xw[i]<min1) min1=Xw[i];}
if(max1<(-1)*min1)
max1=(-1)*min1;
if(m_fir==1) {
str.Format("%.2f",max1); //写Y(n)纵坐标值
pDCYn->TextOut(-20,3,str);
str.Format("%.2f",max1/2);
pDCYn->TextOut(-20,46,str);
}
str.Format("%.1f",min); //写20lg|H(ejw)|纵坐标值
pDC->TextOut(-25,160,str);
str.Format("%.1f",min/4);
pDC->TextOut(-24,50,str);
str.Format("%.1f",min/2);
pDC->TextOut(-24,90,str);
str.Format("%.1f",min*3/4);
pDC->TextOut(-24,130,str);
str.Format("%.2f",max); //写|H(ejw)|纵坐标值
pDCHw->TextOut(-20,6,str);
str.Format("%.2f",max*3/4);
pDCHw->TextOut(-20,50,str);
str.Format("%.2f",max/2);
pDCHw->TextOut(-20,90,str);
str.Format("%.2f",max/4);
pDCHw->TextOut(-20,130,str);
str.Format("%.1f",max2);
pDCWw->TextOut(-18,6,str); //写|W(ejw)|纵坐标值
str.Format("%.1f",max2*3/4);
pDCWw->TextOut(-18,50,str);
str.Format("%.1f",max2/2);
pDCWw->TextOut(-18,90,str);
str.Format("%.1f",max2/4);
pDCWw->TextOut(-18,130,str);
for(i=0;i<256;i++)
{ pDCHw->MoveTo(i+10,170); //滤波器幅频特性|H(ejw)|的谱线
pDCHw->LineTo(i+10,170-160*Hw[i]/max);
pDC->MoveTo(i+10,10); //画滤波器衰减特性20lg(|H(ejw)|的谱线
pDC->LineTo(i+10,10+160*Hd[i]/min);
pDCWw->MoveTo(i+10,170); //画窗函数幅频特性|W(ejw)|的谱线
pDCWw->LineTo(i+10,170-160*Ww[i]/max2);
if(m_fir==1) { //画滤波后序列Y(n)的谱线
pDCYn->MoveTo(i+10,90);
pDCYn->LineTo(i+10,90-80*Xw[i]/max1);
}
}
pDC->SelectObject(pendot);
pDCHw->SelectObject(pendot);
pDC->MoveTo(wc+10,10);
pDC->LineTo(wc+10,170);
pDCHw->MoveTo(wc+10,10);
pDCHw->LineTo(wc+10,170);
str.Format("%.2f",Hd[wc]);
pDC->TextOut(wc+20,12,str);
str.Format("%.2f",Hw[wc]);
pDCHw->TextOut(wc+20,90,str);
}
pDCXn->SelectObject(pencyan);
if(m_choose==1) { //画测试序列X(n)的谱线
max=min=Xn[0];
for(i=0;i<256;i++)
{ if(Xn[i]>max) max=Xn[i];
if(Xn[i]<min) min=Xn[i];
}
if(max<(-1)*min)
max=(-1)*min;
str.Format("%.2f",max);
pDCXn->TextOut(-18,3,str);
str.Format("%.2f",max/2);
pDCXn->TextOut(-20,46,str);
for(i=0;i<256;i++)
{ pDCXn->MoveTo(i+10,90);
pDCXn->LineTo(i+10,90-80*Xn[i]/max); }
}
delete penred;
delete penblue;
delete pencyan;
delete penyellow;
delete pengreen;
delete pendot;
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CF11999115Dlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CF11999115Dlg::OnChangeNn()
{
UpdateData();
m_a=(m_nn-1)/2;
CHUANG();
UpdateData(FALSE);
}
void CF11999115Dlg::OnRect()
{
m_type=1;
CHUANG();
}
void CF11999115Dlg::FFT(double R[], double I[],double F[], int m,int mask)
{ int L,B,J,p,k,i,n;
double kr,ki,*cr,*ci;
n=1<<m;
cr=new double[n/2];
ci=new double[n/2];
for(i=0;i<n/2;i++) //设置旋转因子
{cr[i]=cos(i*PI_2/n);
if(mask==1)
ci[i]=sin(i*PI_2/n);
else
ci[i]=(-1)*sin(i*PI_2/n); //用于正变换
}
Backorder(R,I,n); //调用倒序函数
for(L=1;L<=m;L++)
{B=1<<(L-1);
for(J=0;J<=B-1;J++)
{ p=J*(1<<(m-L));
for(k=J;k<n;k+=1<<L)
{kr=R[k+B]*cr[p]-I[k+B]*ci[p];
ki=I[k+B]*cr[p]+R[k+B]*ci[p];
R[k+B]=R[k]-kr;
I[k+B]=I[k]-ki;
R[k]=R[k]+kr;
I[k]=I[k]+ki;
if(mask==1)
{F[k]=R[k]/n; //用于IFFT
F[k+B]=R[k+B]/n;}
else{
F[k]=sqrt(R[k]*R[k]+I[k]*I[k]);
F[k+B]=sqrt(R[k+B]*R[k+B]+I[k+B]*I[k+B]);}
}
}
}
return;
}
void CF11999115Dlg::Backorder(double R[], double I[], int n)
{ int i,j,k,h,n1;
double temp;
h=n/2; j=h; n1=n-2;
for(i=1;i<=n1;i++)
{if(i<j)
{temp=R[i]; R[i]=R[j]; R[j]=temp;
temp=I[i]; I[i]=I[j]; I[j]=temp;}
k=h;
while(j>=k)
{j-=k;
k=(int)(k/2+0.5);}
j+=k;
}
return;
}
void CF11999115Dlg::OnHaming()
{
m_type=2;
CHUANG();
}
void CF11999115Dlg::OnOK()
{
// TODO: Add extra validation here
if(Hd!=NULL) delete []Hd;
if(Hw!=NULL) delete []Hw;
if(Hn!=NULL) delete []Hn;
if(I!=NULL) delete []I;
if(I1!=NULL) delete []I1;
if(Wn!=NULL) delete []Wn;
if(Xn!=NULL) delete []Xn;
if(Xw!=NULL) delete []Xw;
if(Ww!=NULL) delete []Ww;
CDialog::OnOK();
}
void CF11999115Dlg::CHUANG()
{ UpdateData();
m_a=(m_nn-1)/2;
int i;
double Wc=PI*m_Wc,model;
for(i=0;i<256;i++)
{ I1[i]=0; I[i]=0; Hn[i]=0; }
for(i=0;i<m_nn;i++)
{ switch(m_type) {
case 1: Wn[i]=1.0; break;
case 2: Wn[i]=0.54-0.46*cos(PI_2*i/(m_nn-1)); break;
case 3: Wn[i]=0.5*(1-cos(PI_2*i/(m_nn-1))); break;
case 4: Wn[i]=0.42-0.5*cos(PI_2*i/(m_nn-1))+0.08*cos(4*PI*i/(m_nn-1)); break;
case 5: Wn[i]=sin(i*PI/m_nn);
break;
default: break; }
if(i!=m_a)
Hd[i]=sin(Wc*(i-m_a))/(i-m_a)/PI;
else Hd[i]=Wc/PI;
Hn[i]=Wn[i]*Hd[i]; } //加窗函数
FFT(Hn,I1,Hw,8,0);
model=Hw[0];
for(i=0;i<256;i++)
{ I[i]=0;
Hn[i]=Hn[i]/model; //将低通滤波器归一化!
I1[i]=I1[i]/model;
Hw[i]=Hw[i]/model;
}
FFT(Wn,I,Ww,8,0);
for(i=0;i<256;i++)
{ Wn[i]=0; Hd[i]=20*log10(Hw[i]); }
Invalidate(FALSE);
if(m_choose!=0)
m_Filter.EnableWindow();
return;
}
void CF11999115Dlg::OnFilter()
{
// TODO: Add your control notification handler code here
int i;
double var;
UpdateData();
for(i=0;i<256;i++)
{ I[i]=0; Wn[i]=Xn[i]; }
FFT(Wn,I,Xw,8,0); //求得待测试序列X(n)的付里叶变换X(ejw)=
//Xr(ejw)+jXi(ejw)---暂存入Wn和I
for(i=0;i<256;i++)
{var=Wn[i]; //由时域卷积定理:时域卷积==>频域乘积
Wn[i]=Wn[i]*Hn[i]-I[i]*I1[i];
I[i]=var*I1[i]+I[i]*Hn[i];
}
FFT(Wn,I,Xw,8,1); //用付里叶反变换求得结果序列Y(n)---存入Xw
m_fir=1;
Invalidate(FALSE);
for(i=0;i<256;i++)
{ Wn[i]=0; }
}
void CF11999115Dlg::OnHanning()
{
m_type=3;
CHUANG();
}
void CF11999115Dlg::OnBlackman()
{
m_type=4;
CHUANG();
}
void CF11999115Dlg::OnTri()
{
m_type=5;
CHUANG();
}
void CF11999115Dlg::OnChangeWc()
{
UpdateData();
if(m_Wc<0||m_Wc>1)
{MessageBox("对不起,您的输入超出了范围!"); return; }
m_a=(m_nn-1)/2;
CHUANG();
UpdateData(FALSE);
}
void CF11999115Dlg::OnSequence()
{
UpdateData();
double low=PI*m_low;
double high=PI*m_high;
for(int i=0;i<256;i++)
Xn[i]=cos(i*low)+cos(i*high);
m_choose=1;
Invalidate(FALSE);
if(m_type!=0)
m_Filter.EnableWindow();
}
void CF11999115Dlg::OnChangeEditLow()
{ float temp;
UpdateData();
if(m_low<0||m_low>1)
{MessageBox("对不起,您的输入超出了范围!"); return; }
if(m_low>m_high)
{ temp=m_low; m_low=m_high; m_high=temp; UpdateData(FALSE); }
OnSequence();
}
void CF11999115Dlg::OnChangeEditHigh()
{
float temp;
UpdateData();
if(m_high<0||m_high>1)
{MessageBox("对不起,您的输入超出了范围!"); return; }
if(m_low>m_high)
{ temp=m_low; m_low=m_high; m_high=temp; UpdateData(FALSE);}
OnSequence();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -