📄 滤波器设计dlg.cpp
字号:
*(lppluse+N-1-i)=*(lppluse+i);
}
if(m_addnoise)
{
for(i=0;i<datalength;i++)
{
*(lpsignal+(int)i)=sa*sin((sf)*i/63662)+na*sin((nf)*i/63662);
}
}
else
{
for(i=0;i<datalength;i++)
{
*(lpsignal+(int)i)=sa*sin((sf)*i/63662);
}
}
for(j=0;j<datalength;j++)
{
*(lpfilter+j)=0.0;
if(j<N)
{
for(i=0;i<=j;i++)
{
*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
}
}
else
{
for(i=0;i<N;i++)
{
*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
}
}
}
}
void CMyDlg::LowPass(int N, double beta)
{
int i,j;
double h;
hpluse=GlobalAlloc(GMEM_FIXED,8*analeng); //GlobalAlloc The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
lppluse=(double *)hpluse;
for(i=0;i<N/2;i++)
{
j=i-N/2;
h=sin(m_fc*2.0*3.1415926*((double)j+0.5))/(3.1415926*((double)j+0.5));
*(lppluse+i)=h*kaiser(N,i,beta);
*(lppluse+N-1-i)=*(lppluse+i);
}
for(i=0;i<datalength;i++)
{
*(lppls+(int)i)=0.0;
}
*(lppls)=30000.0;
for(j=0;j<datalength;j++)
{
*(lpfilter+j)=0.0;
if(j<N)
{
for(i=0;i<=j;i++)
{
*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
}
}
else
{
for(i=0;i<N;i++)
{
*(lpfilter+j)=*(lpfilter+j)+(*(lppls+j-i))*(*(lppluse+i));
}
}
}
}
void CMyDlg::LowPassFiltering(int N, double beta,double sf, double sa, double nf, double na)
{
int i,j;
double h;
hpluse=GlobalAlloc(GMEM_FIXED,8*analeng); //GlobalAlloc The GlobalAlloc function allocates the specified number of bytes from the heap.If the function succeeds, the return value is a handle to the newly allocated memory object.
lppluse=(double *)hpluse;
for(i=0;i<N/2;i++)
{
j=i-N/2;
h=sin(m_fc*2.0*3.1415926*((double)j+0.5))/(3.1415926*((double)j+0.5));
*(lppluse+i)=h*kaiser(N,i,beta);
*(lppluse+N-1-i)=*(lppluse+i);
}
if(m_addnoise)
{
for(i=0;i<datalength;i++)
{
*(lpsignal+(int)i)=sa*sin((sf)*i/63662)+na*sin((nf)*i/63662);
}
}
else
{
for(i=0;i<datalength;i++)
{
*(lpsignal+(int)i)=sa*sin((sf)*i/63662);
}
}
for(j=0;j<datalength;j++)
{
*(lpfilter+j)=0.0;
if(j<N)
{
for(i=0;i<=j;i++)
{
*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
}
}
else
{
for(i=0;i<N;i++)
{
*(lpfilter+j)=*(lpfilter+j)+(*(lpsignal+j-i))*(*(lppluse+i));
}
}
}
}
void CMyDlg::OnBottonApply()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
switch(m_filtertype)//判断
{
case 0:
LowPassFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
break;
case 1:
HighPassFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
break;
case 2:
BandPassFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
break;
case 3:
BandRejectFiltering(analeng, m_beta,m_signalfre, m_signalamp, m_noisefre, m_noiseamp);
break;
}
GetDlgItem(IDC_STATIC_FILTERSIGNAL)->SetWindowText("滤波后信号");
Drawbackground(hdctmp2,0,0,880,215,10,870,10,200,105);
DrawScaleText(hdctmp2,10,870,10,200,105);
drawfilteredwave(hdctmp2,m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
OnPaint();
}
void CMyDlg::OnButtonPluse()
{
// TODO: Add your control notification handler code here
int i,k;
double j;
double mean,max=0.0,minmax,maxmin;
bool pass=FALSE,descend,catched;
UpdateData(TRUE);
switch(m_filtertype)//判断
{
case 0:
LowPass(analeng, m_beta);
break;
case 1:
HighPass(analeng, m_beta);
break;
case 2:
BandPass(analeng, m_beta);
break;
case 3:
BandReject(analeng, m_beta);
break;
}
GetDlgItem(IDC_STATIC_FILTERSIGNAL)->SetWindowText("滤波器单位冲击响应");
// (GetDlgItem(IDC_STATIC_FILTERSIGNAL)).Caption="滤波器脉冲相应";
// (Cobject)(IDC_STATIC_FILTER).Caption="滤波器脉冲相应";
// GetDlgItem(IDC_STATIC_FILTER).Caption="滤波器脉冲相应";
Drawbackground(hdctmp2,0,0,880,215,10,870,10,200,105);
DrawScaleFre(hdctmp2,10,870,10,200,105);
drawplusewave(hdctmp2,m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
if(m_filtertype==0)
{
/*GetDlgItem(IDC_EDIT_DOWNFRE)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_UPFRE)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_BAND)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECT)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_PASS)->EnableWindow(TRUE);*/
descend=FALSE;
for(i=0;i<datalength/2;i++)
{
double m=*(lporigdata+i);
if(max<m)
{
max=*(lporigdata+i);
}
}
for(i=1;i<(int)(datalength*m_fc);i++)
{
if(*(lporigdata+i)>*(lporigdata+i-1)) descend=TRUE;
}
if(descend==FALSE)
{
j=datalength*m_fc;
for(i=0;i<(int)(datalength*m_fc);i++)
{
if(*(lporigdata+i)<max)
{
j=i;
break;
}
}
m_downfre=(double)j/datalength;
j=datalength*m_fc;
for(i=datalength/2;i>datalength*m_fc;i--)
{
if(*(lporigdata+i)>0)
{
j=i;
break;
}
}
m_upfre=(double)j/datalength;
m_band=m_upfre-m_downfre;
m_pass=0.0;
m_reject=9999999999999;
//GetDlgItem(IDC_EDIT_REJECT)->EnableWindow(FALSE);
}
else
{
mean=*(lporigdata);
maxmin=max;
for(i=(int)(m_fc*datalength)-1;i>0;i--)
{
if(*(lporigdata+i)<*(lporigdata+i+1)) pass=TRUE;
if(pass==TRUE)
{
if((*(lporigdata+i)<*(lporigdata+i-1))&&(*(lporigdata+i)<*(lporigdata+i+1)))
{
if(maxmin>*(lporigdata+i))
{
maxmin=*(lporigdata+i);
j=i;
}
}
}
}
for(i=(int)(datalength*m_fc)-1;i>=0;i--)
{
catched=FALSE;
j=(int)(datalength*m_fc);
for(k=0;k<=i;k++)
{
if(*(lporigdata+k)<*(lporigdata+i))
{
catched=TRUE;
break;
}
}
if(catched==TRUE)
{
j=i;
break;
}
}
m_downfre=j/(double)datalength;
max=(max-mean)/mean;
maxmin=(mean-maxmin)/mean;
if(max>maxmin) m_pass=20*log10(1.0+max);
else m_pass=20*log10(1.0+maxmin);
minmax=0.0;
pass=FALSE;
for(i=(int)((double)datalength*m_fc);i<datalength*0.5;i++)
{
if(*(lporigdata+i)>*(lporigdata+i-1)) pass=TRUE;
if(pass==TRUE)
{
if((*(lporigdata+i)>*(lporigdata+i-1))&&(*(lporigdata+i)>*(lporigdata+i+1)))
{
if(minmax<*(lporigdata+i)) minmax=*(lporigdata+i);
}
}
}
m_reject=20*log10(minmax/mean);
j=(int)(datalength*m_fc);
for(i=(int)(datalength*m_fc);i<datalength*0.5;i++)
{
catched=FALSE;
j=(int)(datalength*m_fc);
for(k=int(datalength*0.5);k>=i;k--)
{
if(*(lporigdata+k)>*(lporigdata+i))
{
catched=TRUE;
break;
}
}
if(catched==TRUE)
{
j=i;
break;
}
}
m_upfre=j/(double)datalength;
m_band=m_upfre-m_downfre;
if((m_band>0)&&(m_band<0.0001)) m_band=0.0001;
}
}
else
{
// GetDlgItem(IDC_EDIT_DOWNFRE)->EnableWindow(FALSE);
// GetDlgItem(IDC_EDIT_UPFRE)->EnableWindow(FALSE);
// GetDlgItem(IDC_EDIT_BAND)->EnableWindow(FALSE);
// GetDlgItem(IDC_EDIT_REJECT)->EnableWindow(FALSE);
// GetDlgItem(IDC_EDIT_PASS)->EnableWindow(FALSE);
}
OnPaint();
UpdateData(FALSE);
}
void CMyDlg::OnCheckAddnoise()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_addnoise)
{
GetDlgItem(IDC_NOISE_FREQUENCY)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_NOISEFRE)->EnableWindow(TRUE);
GetDlgItem(IDC_NOISE_AMPLITUDE)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_NOISEAMP)->EnableWindow(TRUE);
// GetDlgItem(IDC_SPIN_NOISEFRE)->EnableWindow(TRUE);
// GetDlgItem(IDC_SPIN_NOISEAMP)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_NOISE_FREQUENCY)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_NOISEFRE)->EnableWindow(FALSE);
GetDlgItem(IDC_NOISE_AMPLITUDE)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_NOISEAMP)->EnableWindow(FALSE);
// GetDlgItem(IDC_SPIN_NOISEFRE)->EnableWindow(FALSE);
// GetDlgItem(IDC_SPIN_NOISEAMP)->EnableWindow(FALSE);
}
Drawbackground(hdctmp1,0,0,880,215,10,870,10,200,105);
DrawScaleText(hdctmp1,10,870,10,200,105);
//绘波形
draworiginalwave(hdctmp1, m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
OnPaint();
}
void CMyDlg::OnSelchangeComboFiltertype()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
switch(m_filtertype)//判断
{
case 0:
GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(TRUE);
break;
case 1:
GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(FALSE);
GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(TRUE);
break;
case 2:
GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(FALSE);
break;
case 3:
GetDlgItem(IDC_STATIC_REJECTION3)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_REJECTION2)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECTION3)->EnableWindow(TRUE);
GetDlgItem(IDC_EDIT_REJECTION2)->EnableWindow(TRUE);
GetDlgItem(IDC_STATIC_REJECTION1)->EnableWindow(FALSE);
GetDlgItem(IDC_EDIT_REJECTION1)->EnableWindow(FALSE);
break;
}
}
void CMyDlg::OnSelchangeComboSamplelen()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
switch(m_samplelen)//判断
{
case 0:
analeng=8;
break;
case 1:
analeng=16;
break;
case 2:
analeng=32;
break;
case 3:
analeng=64;
break;
case 4:
analeng=128;
break;
case 5:
analeng=256;
break;
case 6:
analeng=512;
break;
case 7:
analeng=1024;
break;
case 8:
analeng=2048;
break;
}
SelectObject(hdctmp1,hbit1);//选位图
SelectObject(hdctmp1,cb);//选底色
SelectObject(hdctmp1,penk);//选笔
Rectangle(hdctmp1,0,0,880,215);//画框
Drawbackground(hdctmp1,0,0,880,215,10,870,10,200,105);
DrawScaleText(hdctmp1,10,870,10,200,105);
draworiginalwave(hdctmp1, m_signalfre, m_signalamp, m_noisefre, m_noiseamp,10,870,105,200);
OnPaint();
}
void CMyDlg::OnStaticRejection2()
{
// TODO: Add your control notification handler code here
}
void CMyDlg::OnStaticFiltersignal()
{
// TODO: Add your control notification handler code here
}
void CMyDlg::OnStaticSignal()
{
// TODO: Add your control notification handler code here
}
void CMyDlg::OnStaticSignalwave()
{
// TODO: Add your control notification handler code here
}
void CMyDlg::OnNoiseAmplitude()
{
// TODO: Add your control notification handler code here
}
void CMyDlg::OnChangeEditSignalfre()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -