📄 unit1.cpp
字号:
char *file_name="e:/测试信号/dianliuzs.txt";
fp=fopen(file_name,"r");
for(i=0;i<DATA;i++)
{
fscanf(fp,"%f", &temp);
data[0][i]=temp;
}
fclose(fp);
}
void getdata2(int DATA)//读取数据
{
int i;
float temp;
FILE *fp;
for(i=0;i<DATALEN;i++)
data[0][i]=0;
char *file_name="e:/测试信号/xchengzs.txt";
fp=fopen(file_name,"r");
for(i=0;i<DATA;i++)
{
fscanf(fp,"%f", &temp);
data[0][i]=temp;
}
fclose(fp);
}
float hh(int i,int m) //返回H算子周期化后的值
{
return h1[i+m];
}
float gg(int i,int m)//返回G算子周期化后的值
{
char flag;
if(i%2) flag=-1;
else flag=1;
return hh(-1*i+1,m)*flag;
}
void hhh1(int level)//H算子周期化过程
{
int len,m,i,sign;
float temp;
len=DATALEN>>level;
m=filterlen/2;
for(sign=0;sign<len;sign++)
{
temp=0;
for(i=(-1*m+1);i<=m;i++)
{
if(((sign-i)%len)==0)
temp+=hh(i-1,m);
}
hhh[sign]=temp;
}
}
void ggg1(int level)//G算子周期化过程
{
int len,m,i,sign;
float temp;
len=DATALEN>>level;
m=filterlen/2;
for(sign=0;sign<len;sign++)
{
temp=0;
for(i=(-1*m+3);i<=(m+2);i++)
{
if(((sign-i)%len)==0)
temp+=gg(i-1,m);
}
ggg[sign]=temp;
}
}
void codeh(int level,int flen,int len)//H算子作用
{
int i,i2,k,m,len1;
float temp1;
m=filterlen/2;
len1=len>>1;
for(i=0;i<len1;i++)
{
i2=2*i;
data[level][i]=0;
if(len>flen)
{
for(k=i2-len;k<=i2-len+m;k++)
{
if((k>=0)&&(k<len))
if((temp1=hhh[(k-i2+len)%len])!=0)
data[level][i]+=temp1*data[level-1][k];
}
for(k=i2-m+1;k<=i2+m;k++)
{
if((k>=0)&&(k<len))
if((temp1=hhh[(k-i2+len)%len])!=0)
data[level][i]+=temp1*data[level-1][k];
}
for(k=i2+len-m+1;k<i2+len;k++)
{
if((k>=0)&&(k<len))
if((temp1=hhh[(k-i2+len)%len])!=0)
data[level][i]+=temp1*data[level-1][k];
}
}
else
{
for(k=0;k<len;k++)
{
if((temp1=hhh[(k-i2+len)%len])!=0)
data[level][i]+=temp1*data[level-1][k];
}
}
}
}
void codeg(int level,int flen,int len)//G算子作用
{
int i,i2,k,m,len1;
float temp1,exchange ;
len1=len>>1;
m=flen/2;
for(i=0;i<len1;i++)
{
i2=2*i;
data[level][i+len1]=0;
if(len>flen)
{
for(k=i2-len;k<=i2-len+m+2;k++)
{
if((k>=0)&&(k<len))
if((temp1=ggg[(k-i2+len)%len])!=0)
data[level][i+len1]+=temp1*data[level-1][k];
}
for(k=i2-m+3;k<=i2+m+2;k++)
{
if((k>=0)&&(k<len))
if((temp1=ggg[(k-i2+len)%len])!=0)
data[level][i+len1]+=temp1*data[level-1][k];
}
for(k=i2+len-m+3;k<i2+len;k++)
{
if((k>=0)&&(k<len))
if((temp1=ggg[(k-i2+len)%len])!=0)
data[level][i+len1]+=temp1*data[level-1][k];
}
}
else
{
for(k=0;k<len;k++)
{
if((temp1=ggg[(k-i2+len)%len])!=0)
data[level][i+len1]+=temp1*data[level-1][k];
}
}
}
//??此部分程序是为了对应Matlab的输出结果,将首末互换,加负号
for(i=len1+1;i<2*len1;i++)
dataex[level][i]=data[level][i-1];
dataex[level][len1]=data[level][2*len1-1];
for(i=len1;i<2*len1;i++)
dataex[level][i]=-dataex[level][i];
}
void stagek2(int level,int flen)
{
int i,j,len,start;
len=DATALEN>>(level-1);
hhh1(level-1);
ggg1(level-1);
codeh(level,flen,len);
codeg(level,flen,len);
}
void de2composek(int STAGE)//小波分解过程
{
int i;
for(i=1;i<STAGE;i++)
stagek2(i,filterlen);
}
//以下部分为小波反变换部分
void codehrec(int level,int flen,int len)//H*算子作用
{
int i,k,k1,m,len1;
float temp1;
len1=len>>1;
m=flen/2;
for(i=0;i<len;i++)
{
data[level-1][i]=0;
if(len>flen)
{
for(k1=(i-m);k1<(m+i);k1++)
{
k=k1/2;
if((k>=0)&&(k<len1)&&((k1%2)==0))
if((temp1=hhh[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k];
}
for(k1=(len+i-m);k1<=(len+i);k1++)
{
k=k1/2;
if((k>=0)&&(k<len1)&&((k1%2)==0))
if((temp1=hhh[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k];
}
for(k1=(i-len)+1;k1<(i-len+m);k1++)
{
k=k1/2;
if((k>=0)&&(k<len1)&&((k1%2)==0))
if((temp1=hhh[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k];
}
}
else
{
for(k=0;k<len1;k++)
{
if((temp1=hhh[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k];
}
}
}
}
void codegrec(int level,int flen,int len)//G*算子作用
{
int i,k,k1,m,len1;
float temp1;
len1=len>>1;
m=flen/2;
for(i=0;i<len;i++)
{
if(len>flen)
{
for(k1=(len+i-m-2);k1<(len+i);k1++)
{
k=k1/2;
if((k>=0)&&(k<len1)&&((k1%2)==0))
if((temp1=ggg[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k+len1];
}
for(k1=(i-m-2);k1<(i+m-2);k1++)
{
k=k1/2;
if((k>=0)&&(k<len1)&&((k1%2)==0))
if((temp1=ggg[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k+len1];
}
for(k1=i-len+1;k1<(i+m-len-2);k1++)
{
k=k1/2;
if((k>=0)&&(k<len1)&&((k1%2)==0))
if((temp1=ggg[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k+len1];
}
}
else
{
for(k=0;k<len1;k++)
{
if((temp1=ggg[(i-2*k+len)%len])!=0)
data[level-1][i]+=temp1*data[level][k+len1];
}
}
}
}
void rec(int STAGE) //小波反变换
{
int level,len,len1,j;
for (level=STAGE-1;level>0;level--)
{
len=DATALEN>>(level-1);
hhh1(level-1);
ggg1(level-1);
codehrec(level,filterlen,len);
codegrec(level,filterlen,len);
}
}
int tipan(int Start,int End, int Yuzhi)
{
int i,Ty=0;
float index;
for(i=Start;i<End;)
{
if (data[0][i]>=Yuzhi)
{
index=i;
break;
}
i++;
}
for(i=index+1;i<=index+10;i++)
{
if(data[0][i]>Yuzhi)
continue;
else
{
Ty=i;
break ;
}
}
if(Ty!=0)
tipan(Ty,End,Yuzhi);
else
return (index);
}
int Maxzhi(int level,int Start,int End)
{
float zhongjie;
int i;
zhongjie=data[level][Start];
for (i=Start+1;i<End;i++)
{
if(data[level][i]>zhongjie)
zhongjie=data[level][i];
}
for (i=Start;i<End;i++)
{
if(data[level][i]==zhongjie)
break;
}
return(i) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -