📄 dft.cpp
字号:
#include<iostream.h>
#include <iomanip.h>
#include<stdio.h>
#include<complex>
#include<math.h>
#define pi 3.1415927
using namespace std;
void main()
{
double s[319]; //压缩实部
double j[319]; //压缩虚部
double ss[319]; //解压缩实部
double jj[319]; //解压缩虚部
double eggs[319];
for(int init=0;init<319;init++)
{
s[init]=0;
j[init]=0;
ss[init]=0;
jj[init]=0;
}
int k=0; //压缩时x对应的系数
//读入文件****************************88888888888
double *F=new double[319];
char *temp;
int i=0;
FILE *f; //定义文件指针f
cout<<"准备读入原始数据..."<<endl;
if((f=fopen("egg.txt","r"))==NULL) //以读方式打开egg.txt
{
cout<<"文件不能打开!"<<endl; //如果该文件不存在,则报错
}
while (i<319)
{
temp=new char[5];
fscanf(f,"%s",temp);
if(temp[0]=='t')
break;
cout<<setw(5)<<temp<<" ";
F[i]=atof(temp);
if ((i+1)%12==0)
{
cout<<endl;
}
i++;
}
cout<<endl<<"数据读入完毕";
cout<<endl;
fclose(f);//关闭文件
for(i=0;i<319;i++)
{
eggs[i]=F[i];
}
/*float eggs[319]={0,0,0,0,2149,4627,4523,6030,2684,3373,446,133,17,56,58,0,6,25,30,0,0,548,461,1638,1524,2338,1473,3287,1367,617,936,112,91,0,0
,0,1,47,8,0,77,598,6814,1537,1296,451,1863,2408,358,847,14,0,62,4,39,0,0,107,172,828,1216,2109,3460,2438,3234,1574,7445,2019,
672,0,0,0,0,33,26,32,0,321,230,392,253,324,1369,1252,977,1336,1450,2520,3057,302,166,20,27,70,4,38,5,48,115,364,1034,1295,2383,
2435,2535,1701,1601,580,460,363,0,106,80,0,303,755,536,802,688,1244,1662,5050,926,3011,1461,526,107,136,0,0,8,10,418,616,1319,
396,1636,1249,975,813,699,1908,952,477,206,121,39,70,162,3,170,300,417,623,1061,1852,1766,2681,2577,2333,1383,5915,1241,38,108,
10,2,65,128,6,71,336,343,991,1709,766,749,6267,3750,4393,1527,5520,756,1166,1294,206,253,233,1024,185,112,521,287,650,1254,1977,
976,2880,2505,1394,2233,629,683,397,725,14,7,146,285,694,558,1221,901,1754,2066,1311,452,3092,3747,541,1606,884,675,1037,1804,
765,733,981,581,311,1313,946,755,951,422,330,188,1643,1178,1861,1717,1031,2973,2225,1983,1745,1321,1942,433,2009,254,248,2511,
2404,1652,2657,4169,2525,1907,1498,1197,3238,476,819,1094,1238,1167,2082,3168,1645,3892,4603,2717,2162,1998,3547,2825,4377,1189,
1460,279,188,1190,450,2189,1276,2174,2737,2822,2460,1793,603,509,1194,2047,1601,631,1717,1560,2512,2617,4033,8103,7991,10546,
5230,10857,3167,2164,1405,389,0,156,2,676,652,2622,763,2109};*/
cout<<"**************DFT压缩后的数据********************"<<endl;
while(k<319)
{
for(int n=0;n<319;n++)
{
s[k]=s[k]+eggs[n]*cos(2*pi*n*k/319);
j[k]=j[k]-eggs[n]*sin(2*pi*n*k/319);
}
k++;
}
for( i=0;i<319;i++)
{
if(fabs(s[i])<500)
{
s[i]=0;
}
if(j[i]<0)
{
cout<<setw(6)<<s[i]<<j[i]<<"j ";
if((i+1)%4==0&&i!=0)
cout<<endl;
}
else
{
cout<<setw(6)<<s[i]<<"+"<<j[i]<<"j ";
if((i+1)%4==0&&i!=0)
cout<<endl;
}
}
cout<<endl;
cout<<endl;
cout<<"*****************DFT解压缩后的数据*******************"<<endl;
/* int nn=0; //解压缩时x对应的系数
while(nn<319)
{
for(int kk=0;kk<319;kk++)
{
ss[nn]=ss[nn]+(s[kk]*cos(2*pi*nn*kk/319))/319;
jj[nn]=jj[nn]+(j[kk]*sin(2*pi*nn*kk/319))/319;
}
// ss[nn]=ss[nn]/319;
// jj[nn]=jj[nn]/319;
cout<<setw(8)<<ss[nn]<<" ";
if((nn+1)%8==0&&nn!=0)
cout<<endl;
nn++;
*/
complex <float>* source,cons(319,0);
complex <float>* r; //结果输出控制变量
source = new complex<float>[319];
r = new complex<float>[319];
for(int com=0;com<319;com++)
{
source[com].real(s[com]);
source[com].imag(j[com]);
}
for (int nn = 0; nn < 319; nn++)
{
complex <float> temp(0,0),a(0,0);
float x = 0;
for (int kk = 0;kk < 319; kk++)
{
x = (2*pi*nn*kk)/319;
a.real( cos(x) );
a.imag( sin(x) );
temp += source[kk]*a;
}
r[nn] = temp/cons;
}
for(int c=0;c<319;c++)
{
cout<<r[c].real()<<" ";
}
/*性能估计*/
complex <float> E(0,0);
complex <float>* egg;
egg = new complex<float>[319];
for(int e=0;e<319;e++)
{
egg[e].real(eggs[e]);
if(e<319)
E.real(E.real()+(egg[e].real()-r[e].real())*(egg[e].real()-r[e].real()));
}
cout<<endl;
cout<<endl;
cout<<"性能估计均差E为:"<<E.real()<<endl;
/* for(int c=0;c<319;c++)
{
cout<<r[c].real()<<" ";
}*/
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -