📄 dwt.cpp
字号:
#include<iostream.h>
#include <iomanip.h>
#include<math.h>
#include<fstream.h>
#include<stdlib.h>
void main()
{
// int key=0; //选择DWT或Inverse DWT
int i=0; //扩充的数据源标号
int N=512;
int key=0;
double source[512];
double result[512];
double mid[512];
for(int s=0;s<512;s++)
{result[s]=0;}
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}; //319,分析512个数据,2657是第256个数据 */
for(;i<319;i++) //只处理256个数据源
{
source[i]=eggs[i];
}
for(i=319;i<512;i++)
{
source[i]=0;
}
cout<<"请您选择是否DWT分析:1代表开始分析;2代表退出"<<endl;
cin>>key;
if(key==1)
{
cout<<"*************DWT压缩如下****************"<<endl;
while(N/2>=1)
{
for(int j=0;j<N/2;j++)
{
result[j]=(source[2*j]+source[2*j+1])/sqrt(2);
}
for(int jj=0;jj<N/2;jj++)
{
result[jj+N/2]=(source[2*jj]-source[2*jj+1])/sqrt(2);
}
for(j=0;j<512;j++)
{
source[j]=result[j];
}
N=N/2;
}
for(int m=0;m<512;m++)
{
if(fabs(result[m])<1)
{
result[m]=0;
}
cout<<setw(9)<<result[m];
if((m+1)%8==0&&m!=0)
cout<<endl;
}
cout<<endl;//DWT分析
// cout<<"Inverse DWT解压缩如下"<<endl;
N=1;
int n=0,nn=0,NN=1;//nn管mid的A;NN管result的D;
source[n]=(result[n]+result[n+1])/sqrt(2);
source[n+1]=(result[n]-result[n+1])/sqrt(2);
N=2*N;
NN=2*NN;
do
{
for(n=0;n<N;n++)
{
mid[n]=source[n];//保存A
}
for(n=0;nn<N,n<2*N;n++)
{
source[n]=(mid[nn]+result[NN])/sqrt(2);
source[n+1]=(mid[nn]-result[NN])/sqrt(2);
nn++;
n++;
NN++;
}
N=2*N;
nn=0;
}while(N<=256);
/*性能估计*/
double E=0;
for(int e=0;e<512;e++)
{
if(e<319)
E=E+(eggs[e]-source[e])*(eggs[e]-source[e]);
else
E=E+source[e]*source[e];
}
cout<<"性能估计均差E为:"<<E<<endl<<endl;
cout<<"*********Inverse DWT解压缩如下:**********"<<endl;
/*数据解压缩后的处理和显示*/
for(int ss=0;ss<512;ss++)
{
//if(fabs(source[ss])<0.5) 解压缩后处理的比较小的数据
// source[ss]=0;
cout<<setw(15)<<source[ss];
if((ss+1)%5==0&&ss!=0)
cout<<endl;
}
cout<<endl;
}
if(key==2)
{cout<<"程序已退出"<<endl;}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -