📄 滤波器设计dlg.cpp
字号:
sprintf(tmpText,"%2.1f",0.4);
TextOut(hdc,xto1-92,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.3);
TextOut(hdc,xto1-176,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.2);
TextOut(hdc,xto1-260,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.1);
TextOut(hdc,xto1-344,yto1-20,tmpText,3);
sprintf(tmpText,"%d",10);
TextOut(hdc,(xfrom1+xto1)/2-10,yfrom1,tmpText,2);
}
void CMyDlg::Drawbackground(HDC hdc, int left, int up, int right, int down, int xfrom1, int xto1, int yfrom1, int yto1, int ycenter1)
{
//obtain the HDC of This Diolog
int i;
//The first left and up lines of background rectangle
SelectObject(hdc,penu1);
MoveToEx(hdc,left,up,NULL);
LineTo(hdc,right,up);
MoveToEx(hdc,left,up,NULL);
LineTo(hdc,left,down);
//The second left and up lines of background rectangle
MoveToEx(hdc,left+1,up+1,NULL);
LineTo(hdc,right-1,up+1);
MoveToEx(hdc,left+1,up+1,NULL);
LineTo(hdc,left+1,down-1);
//The second right and down lines of background rectangle
MoveToEx(hdc,left,down,NULL);
LineTo(hdc,right,down);
MoveToEx(hdc,right,down,NULL);
LineTo(hdc,right,up);
//The first right and down lines of background rectangle
MoveToEx(hdc,left+1,down-1,NULL);
LineTo(hdc,right-1,down-1);
MoveToEx(hdc,right-1,down-1,NULL);
LineTo(hdc,right-1,up+1);
SelectObject(hdc,pend2);
for(i=2;i<down-up-1;i++)
{
MoveToEx(hdc,left+2,down-i,NULL);
LineTo(hdc,right-2,down-i);
}
SetBkColor(hdc,RGB(128,128,128));
SelectObject(hdc,penk);
MoveToEx(hdc,xfrom1,yfrom1,NULL);
LineTo(hdc,xfrom1,yto1);
MoveToEx(hdc,(xto1+xfrom1)/2-15,yfrom1,NULL);
LineTo(hdc,(xto1+xfrom1)/2-15,yto1);
MoveToEx(hdc,xfrom1,yto1,NULL);
LineTo(hdc,(xto1+xfrom1)/2-15,yto1);
MoveToEx(hdc,xfrom1,yfrom1,NULL);
LineTo(hdc,(xto1+xfrom1)/2-15,yfrom1);
MoveToEx(hdc,(xto1+xfrom1)/2+15,yfrom1,NULL);
LineTo(hdc,(xto1+xfrom1)/2+15,yto1);
MoveToEx(hdc,xto1,yfrom1,NULL);
LineTo(hdc,xto1,yto1);
MoveToEx(hdc,(xto1+xfrom1)/2+15,yto1,NULL);
LineTo(hdc,xto1,yto1);
MoveToEx(hdc,(xto1+xfrom1)/2+15,yfrom1,NULL);
LineTo(hdc,xto1,yfrom1);
for(i=0;i<=40;i++)
{
if(i%4==0)
MoveToEx(hdc,xfrom1-6,yfrom1+i*(yto1-yfrom1)/40,NULL);
else
MoveToEx(hdc,xfrom1-3,yfrom1+i*(yto1-yfrom1)/40,NULL);
LineTo(hdc,xfrom1,yfrom1+i*(yto1-yfrom1)/40);
}
for(i=0;i<=40;i++)
{
if(i%4==0)
MoveToEx(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+6,NULL);
else
MoveToEx(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+3,NULL);
LineTo(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1);
}
for(i=0;i<=40;i++)
{
if(i%4==0)
MoveToEx(hdc,(xto1+xfrom1)/2+9,yfrom1+i*(yto1-yfrom1)/40,NULL);
else
MoveToEx(hdc,(xto1+xfrom1)/2+12,yfrom1+i*(yto1-yfrom1)/40,NULL);
LineTo(hdc,(xto1+xfrom1)/2+15,yfrom1+i*(yto1-yfrom1)/40);
}
for(i=0;i<=40;i++)
{
if(i%4==0)
MoveToEx(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+6,NULL);
else
MoveToEx(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1+3,NULL);
LineTo(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/40,yto1);
}
for(i=1;i<10;i++)
{
MoveToEx(hdc,xfrom1,yfrom1+i*(yto1-yfrom1)/10,NULL);
LineTo(hdc,(xto1+xfrom1)/2-15,yfrom1+i*(yto1-yfrom1)/10);
MoveToEx(hdc,(xto1+xfrom1)/2+15,yfrom1+i*(yto1-yfrom1)/10,NULL);
LineTo(hdc,xto1,yfrom1+i*(yto1-yfrom1)/10);
}
for(i=1;i<10;i++)
{
MoveToEx(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/10,yfrom1,NULL);
LineTo(hdc,xfrom1+i*((xto1+xfrom1)/2-15-xfrom1)/10,yto1);
MoveToEx(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/10,yfrom1,NULL);
LineTo(hdc,(xto1+xfrom1)/2+15+i*((xto1+xfrom1)/2-15-xfrom1)/10,yto1);
}
}
void CMyDlg::BandPass(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=2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*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+1)=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));
}
}
}
}
double CMyDlg::kaiser(int n,int i, double beta)
{
double a,w,a2,b1,b2,beta1;
b1=bessel(beta);
a=2.0*i/(double)(n-1)-1.0;
a2=a*a;
beta1=beta*sqrt(1.0-a2);
b2=bessel(beta1);
w=b2/b1;
return(w);
}
double CMyDlg::bessel(double a)
{
short int i,j;
double t,y,z;
t=0.0;
y=1.0;
z=1.0;
for(i=1;i<10000;i++)
{
for(j=1;j<=i;j++)
z=1.0/(double)j*z;
y=y+z*z*pow(a/2.0,2.0*(double)i);
if(t==y) break;
t=y;
}
return t;
}
void CMyDlg::BandPassFiltering(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=2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*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::BandReject(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(3.1415926*((double)j+0.5))-2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*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<(N-1)/2;i++)
{
j=i-(N-1)/2;
// h=(sin(3.1415926*((double)j+0.5))-sin(m_fc*2.0*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
h=(sin(3.1415926*((double)j))-2*cos((m_fl+m_fh)*3.1415926*((double)j))*sin((-m_fl+m_fh)*3.1415926*((double)j)))/(3.1415926*((double)j));
*(lppluse+i)=h*kaiser(N,i,beta);
*(lppluse+N-1-i)=*(lppluse+i);
}
*(lppluse+(N-1)/2)=1.0-2.0*m_fh+2.0*m_fl;*/
for(i=0;i<datalength;i++)
{
*(lppls+(int)i)=0.0;
}
*(lppls+1)=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::BandRejectFiltering(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(3.1415926*((double)j+0.5))-2*cos((m_fl+m_fh)*3.1415926*((double)j+0.5))*sin((-m_fl+m_fh)*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::drawfilteredwave(HDC hdc, double sf, double sa, double nf, double na,int xfrom1, int xto1, int ycenter, int yto1)
{
double i;
double k1,k2;
int j1,j2,m1,m2;
SelectObject(hdc,penu2);
for(i=0;i<(xto1-xfrom1)/2-15;i++)
{
k1=9.5*(*(lpfilter+(int)i+analeng));
k2=9.5*(*(lpfilter+(int)(i+1)+analeng));
MoveToEx(hdc,xfrom1+(int)i,ycenter-(int)k1,NULL);
LineTo(hdc,xfrom1+(int)i+1,ycenter-(int)k2);
}
for(i=0;i<datalength;i++)
{
(*(lpfftdata+(int)i)).x=*(lpfilter+(int)i);
(*(lpfftdata+(int)i)).y=0.00;
}
fft(datalength,lpfftdata);
for(i=0;i<datalength;i++)
{
k1=(*(lpfftdata+(int)i)).x;
k2=(*(lpfftdata+(int)i)).y;
*(lporigdata+(int)i)=sqrt(k1*k1+k2*k2);
}
SelectObject(hdc,penu2);
for(i=0;i<datalength/2;i++)
{
j1=(int)(2*i*(double)((xto1-xfrom1)/2-15)/datalength);
j2=(int)(2*(i+1)*(double)((xto1-xfrom1)/2-15)/datalength);
m1=yto1-(int)(*(lporigdata+(int)i)*38.5/datalength);
m2=yto1-(int)(*(lporigdata+(int)i+1)*38.5/datalength);
MoveToEx(hdc,(xto1+xfrom1)/2+15+j1,m1,NULL);
LineTo(hdc,(xto1+xfrom1)/2+15+j2,m2);
}
}
void CMyDlg::drawplusewave(HDC hdc, double sf, double sa, double nf, double na, int xfrom1, int xto1, int ycenter, int yto1)
{
double i;
double k1,k2;
int j1,j2,m1,m2;
SelectObject(hdc,penu2);
for(i=0;i<analeng-1;i++)
{
j1=(int)(i*(double)((xto1-xfrom1)/2-15)/(analeng));
j2=(int)((i+1)*(double)((xto1-xfrom1)/2-15)/(analeng));
m1=ycenter-(int)(*(lppluse+(int)i)*120);
m2=ycenter-(int)(*(lppluse+(int)i+1)*120);
MoveToEx(hdc,xfrom1+j1,m1,NULL);
LineTo(hdc,xfrom1+j2,m2);
}
for(i=0;i<datalength;i++)
{
(*(lpfftdata+(int)i)).x=*(lpfilter+(int)i);
(*(lpfftdata+(int)i)).y=0.00;
}
fft(datalength,lpfftdata);
for(i=0;i<datalength;i++)
{
k1=(*(lpfftdata+(int)i)).x;
k2=(*(lpfftdata+(int)i)).y;
*(lporigdata+(int)i)=sqrt(k1*k1+k2*k2);
}
// SelectObject(hdc,penred);
for(i=0;i<datalength/2;i++)
{
j1=(int)(2*i*(double)((xto1-xfrom1)/2-15)/datalength);
j2=(int)(2*(i+1)*(double)((xto1-xfrom1)/2-15)/datalength);
m1=yto1-(int)(*(lporigdata+(int)i)*41.5/datalength);
m2=yto1-(int)(*(lporigdata+(int)i+1)*41.5/datalength);
MoveToEx(hdc,(xto1+xfrom1)/2+15+j1,m1,NULL);
LineTo(hdc,(xto1+xfrom1)/2+15+j2,m2);
}
}
void CMyDlg::DrawScaleFre(HDC hdc, int xfrom1, int xto1, int yfrom1, int yto1, int ycenter1)
{
char tmpText[10];
SetBkColor(hdc,RGB(255,255,255));
SetTextColor(hdc,RGB(0,0,0));
//显示标注
sprintf(tmpText,"%d",0);
TextOut(hdc,(xfrom1+xto1)/2-4,yto1-20,tmpText,1);
sprintf(tmpText,"%2.1f",0.5);
TextOut(hdc,xto1-25,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.4);
TextOut(hdc,xto1-92,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.3);
TextOut(hdc,xto1-176,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.2);
TextOut(hdc,xto1-260,yto1-20,tmpText,3);
sprintf(tmpText,"%2.1f",0.1);
TextOut(hdc,xto1-344,yto1-20,tmpText,3); sprintf(tmpText,"%d",1);
TextOut(hdc,(xfrom1+xto1)/2-4,yfrom1+30,tmpText,1);
}
void CMyDlg::HighPass(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(3.1415926*((double)j+0.5))-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=1;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::HighPassFiltering(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(3.1415926*((double)j+0.5))-sin(m_fc*2.0*3.1415926*((double)j+0.5)))/(3.1415926*((double)j+0.5));
*(lppluse+i)=h*kaiser(N,i,beta);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -