📄 fftdrawingdlg.cpp
字号:
else if(fuhao==1)
{
for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
xieshuzi=xieshuzi/2;
if(xieshuzi<100)
{
xieshuzi=xieshuzi*100;
itoa(xieshuzi,zifu,10);
char xiaoyu_10[10]={'*','e','-','1','0','0','\0'};
strcat(zifu,xiaoyu_10);
}
else
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
}
else if(fuhao==0)
{
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
}
/////////////////以上写数值
}
}
////////最大值处极值点处纵坐标
for(js_jizhi=0;js_jizhi<N;js_jizhi++)
{
if(shuju[js_jizhi]==maxzhi)
{
pDC->SetPixel(20,dy-zhongxian-shuju[js_jizhi],2500);
pDC->SetPixel(20+1,dy-zhongxian-shuju[js_jizhi],2500);
pDC->SetPixel(20,dy-zhongxian-shuju[js_jizhi]+1,2500);
pDC->SetPixel(20-1,dy-zhongxian-shuju[js_jizhi],2500);
pDC->SetPixel(20,dy-zhongxian-shuju[js_jizhi]-1,2500);
pDC->SetPixel(20+1,dy-zhongxian-shuju[js_jizhi]+1,2500);
pDC->SetPixel(20+1,dy-zhongxian-shuju[js_jizhi]-1,2500);
pDC->SetPixel(20-1,dy-zhongxian-shuju[js_jizhi]+1,2500);
pDC->SetPixel(20-1,dy-zhongxian-shuju[js_jizhi]-1,2500);
////////写数据值
double xieshuzi=shuju[js_jizhi];
if(fuhao==-1)
{
for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
xieshuzi=xieshuzi*2;
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
}
else if(fuhao==1)
{
for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
xieshuzi=xieshuzi/2;
if(xieshuzi<100)
{
xieshuzi=xieshuzi*100;
itoa(xieshuzi,zifu,10);
char xiaoyu_10[10]={'*','e','-','1','0','0','\0'};
strcat(zifu,xiaoyu_10);
}
else
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
}
else if(fuhao==0)
{
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
}
/////////////////以上写数值
/////对称的另一边
int fanjizhi=N-js_jizhi;
pDC->SetPixel(20,dy-zhongxian-shuju[fanjizhi],2500);
pDC->SetPixel(20+1,dy-zhongxian-shuju[fanjizhi],2500);
pDC->SetPixel(20,dy-zhongxian-shuju[fanjizhi]+1,2500);
pDC->SetPixel(20-1,dy-zhongxian-shuju[fanjizhi],2500);
pDC->SetPixel(20,dy-zhongxian-shuju[fanjizhi]-1,2500);
pDC->SetPixel(20+1,dy-zhongxian-shuju[fanjizhi]+1,2500);
pDC->SetPixel(20+1,dy-zhongxian-shuju[fanjizhi]-1,2500);
pDC->SetPixel(20-1,dy-zhongxian-shuju[fanjizhi]+1,2500);
pDC->SetPixel(20-1,dy-zhongxian-shuju[fanjizhi]-1,2500);
////////写数据值
xieshuzi=shuju[fanjizhi];
if(fuhao==-1)
{
for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
xieshuzi=xieshuzi*2;
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[fanjizhi]+3,zifu);
}
else if(fuhao==1)
{
for(int n_xieshuzi=0;n_xieshuzi<cishu;n_xieshuzi++)
xieshuzi=xieshuzi/2;
if(xieshuzi<100)
{
xieshuzi=xieshuzi*100;
itoa(xieshuzi,zifu,10);
char xiaoyu_10[10]={'*','e','-','1','0','0','\0'};
strcat(zifu,xiaoyu_10);
}
else
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[fanjizhi]+3,zifu);
}
else if(fuhao==0)
{
itoa(xieshuzi,zifu,10);
pDC->TextOut(20+3,dy-zhongxian-shuju[js_jizhi]+3,zifu);
}
/////////////////以上写数值
}
}
//////////////////////////////以上画极值点的纵坐标
//pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
//////////////以下画线
for( int p=0;p<N-1;p++)
{
/*
//////以下有点对,但是去不了竖直线.
if(fabs(shuju[p])!=fabs(shuju[p+1]))
{
pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));////&&shuju[p-1]<=shuju[p+1]
}
*/
if(shuju[p]<=shuju[p+1]&&shuju[p]>0&&shuju[p+1]>0)
{
pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
}
}
for(int p=0;p<N-1;p++)
{
if(shuju[p]>=shuju[p+1]&&shuju[p]>0&&shuju[p+1]>0)
{
pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
}
}
for( p=0;p<N-1;p++)
{
if(shuju[p]>=shuju[p+1]&&shuju[p]<0&&shuju[p+1]<0)
{
pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
}
}
for( p=0;p<N-1;p++)
{
if(shuju[p]<=shuju[p+1]&&shuju[p]<0&&shuju[p+1]<0)
{
pDC->SetPixel(20+p*m_jian_ge,dy-int(shuju[p]+zhongxian),0);
pDC->MoveTo( 20+p*m_jian_ge,dy-int(shuju[p]+zhongxian));
pDC->LineTo( 20+(p+1)*m_jian_ge,dy-int(shuju[p+1]+zhongxian));
}
}
pDC->SelectObject(oldPen2);
/*
CPaintDC dc(this);
CWnd *pWnd=GetDlgItem(IDC_STATIC);
pWnd->UpdateWindow();
CDC *pDC=pWnd->GetDC();
CBrush drawBrush;
drawBrush.CreateHatchBrush(3, RGB(0,0,0));
CBrush *pOldBrush=pDC->SelectObject(&drawBrush);
CRect rcClient;
pWnd->GetClientRect(rcClient);
pDC->Rectangle(rcClient);
pDC->SelectObject(pOldBrush);
*/
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CFftDrawingDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CFftDrawingDlg::OnShujudaoru()
{
// TODO: Add your control notification handler code here
UpdateData();
cishu=0;
if(m_njishu<1||m_njishu>9)
{
MessageBox("请输入计算基2-fft的级数,范围在1--9间,即只能计算2到512个点的fft","提示",0);
}
if(m_njishu>0&&m_njishu<10)
{
b_shuju=1;
double PI=3.1415926535;
double e=2.718281828;
//int M,N;
double x[512],xr[512],xi[512],t[512],jiaodu;
//M=8;
N=1<<m_njishu;
m_jian_ge=512/N;
jiaodu=(-2*PI)/N;
///数据点输入:
//double(m_caidianpinlv);
//double f1=15,f2=40;
double zhouqi=1/m_caidianpinlv;
for(int i=0;i<N;i++)
x[i]=m_A*sin(2*PI*m_f1*i*zhouqi)+m_B*sin(2*PI*m_f2*i*zhouqi);
/*
for(int i=0;i<N;i++)
{
if(i<8)
x[i]=8-i*zhouqi;
else if(i>(N-9))
x[i]=N-i*zhouqi;
else
x[i]=0;
}
*/
/*
for(int i=0;i<N;i++)
{
if(i<8)
x[i]=1;
else
x[i]=0;
}
*/
////数据点输入结束.
////将数据点重新排序,以实现fft计算.
//paixu();
int kuaishu=1,geshu;
for( i=0;i<N;i++)
t[i]=x[i];
for(int pi=1;pi<m_njishu;pi++)
{
kuaishu=1<<(pi);
geshu=N/kuaishu;
for(int fi=0;fi<kuaishu;fi++)
{
if(fi%2==0)
{
for(int fk=0;fk<geshu;fk++)
x[fi*geshu+fk]=t[fi*geshu+fk*2];
}
if(fi%2==1)
{
for(int fk=0;fk<geshu;fk++)
x[fi*geshu+fk]=t[(fi-1)*geshu+1+fk*2];
}
}
for(int i=0;i<N;i++)
t[i]=x[i];
}
////排序结束.
////进行fft计算:
///fft();
int zengzhi;
//double t1r,t2r,t1i,t2i;
double t1r,t1,t1i,t2;
double jd; ///计算的角度
int wz=1<<m_njishu;
for( i=0;i<N;i++)
{
xr[i]=x[i];
xi[i]=0;
}
for(int i1=m_njishu-1;i1>=0;i1--)
{
wz=wz/2;
kuaishu=1<<(i1);
geshu=N/kuaishu;
zengzhi=kuaishu;
for(int i2=0;i2<kuaishu;i2++)
{
for(int i3=0;i3<(geshu/2);i3++)
{
/*
jd=jiaodu*zengzhi*i3;
t1r=xr[geshu*i2+i3];
t1i=xi[geshu*i2+i3];
t2r=xr[geshu*i2+i3+geshu/2];
t2i=xi[geshu*i2+i3+geshu/2];
xr[geshu*i2+i3]=t1r+t2r*cos(jd)-t2i*sin(jd);
xi[geshu*i2+i3]=t1i+t2i*cos(jd)+t2r*sin(jd);
xr[geshu*i2+i3+geshu/2]=t1r-t2r*cos(jd)+t2i*sin(jd);
xi[geshu*i2+i3+geshu/2]=t1i-t2i*cos(jd)-t2r*sin(jd);
*/
jd=jiaodu*zengzhi*i3;
t1r=xr[geshu*i2+i3];
t1i=xi[geshu*i2+i3];
t1=xr[geshu*i2+i3+geshu/2]*cos(jd)-xi[geshu*i2+i3+geshu/2]*sin(jd);
t2=xi[geshu*i2+i3+geshu/2]*cos(jd)+xr[geshu*i2+i3+geshu/2]*sin(jd);
xr[geshu*i2+i3]=t1r+t1;
xi[geshu*i2+i3]=t1i+t2;
xr[geshu*i2+i3+geshu/2]=t1r-t1;
xi[geshu*i2+i3+geshu/2]=t1i-t2;
}
}
}
for( i=0;i<N;i++)
{
shibu[i]=xr[i];
xubu[i]=xi[i];
}
ofstream table;
table.open("d:\\fft.txt");
for(i=0;i<N;i=i+3)
{
table<<"X["<<i<<"]="<<xr[i]<<"+"<<xi[i]<<" j"<<"\t"<<
"X["<<i+1<<"]="<<xr[i+1]<<"+"<<xi[i+1]<<" j"<<"\t"<<
"X["<<i+2<<"]="<<xr[i+2]<<"+"<<xi[i+2]<<" j"<<"\t"<<endl;
/*
table<<"xr["<<i+1<<"]="<<shibu[i+1]<<"\t\t"<<"xi["<<i+1<<"]="<<xubu[i+1]<<"\t\t"
<<"|x|["<<i+1<<"]="<<sqrt(shibu[i+1]*shibu[i+1]+xubu[i+1]*xubu[i+1])
<<"\t\t"<<"@["<<i+1<<"]="<<atan(xubu[i+1]/shibu[i+1])<<"\t\t"<<endl;
*/
}
table.close();
MessageBox("计算所得数据已经以fft.txt文档格式存放于d:\\fft.txt中,请查看。请点击相应按钮查看相关图形","提示");
}
}
void CFftDrawingDlg::OnShibu()
{
// TODO: Add your control notification handler code here
//double *shibu, *xubu;
if(b_shuju!=1)
MessageBox ("请先倒入数据计算fft,请点击 ‘ 倒入数据 ’ !","提示" );
if(b_shuju==1)
{
shuomingwenzi=1;
for( int i=0;i<N;i++)
shuju[i]=shibu[i];
///////////////以下是将数据处理成能在显示区域显示的值
CWnd *pWnd = GetDlgItem(IDC_STATIC);
CDC *pDC = pWnd->GetDC();
CRect rcClient;
pWnd->GetClientRect(rcClient);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -