一维离散小波c语言
Ⅰ C语言怎么实现小波变换
#include<stdio.h>
#include<stdlib.h>
#defineLENGTH512//信号长度
/******************************************************************
*一维卷积函数
*
*说明:循环卷积,卷积结果的长度与输入信号的长度相同
*
*输入参数:data[],输入信号;core[],卷积核;cov[],卷积结果;
* n,输入信号长度;m,卷积核长度.
*
*李承宇,[email protected]
*
*2010-08-18
******************************************************************/
voidCovlution(doubledata[],doublecore[],doublecov[],intn,intm)
{
inti=0;
intj=0;
intk=0;
//将cov[]清零
for(i=0;i<n;i++)
{
cov[i]=0;
}
//前m/2+1行
i=0;
for(j=0;j<m/2;j++,i++)
{
for(k=m/2-j;k<m;k++)
{
cov[i]+=data[k-(m/2-j)]*core[k];//k针对core[k]
}
for(k=n-m/2+j;k<n;k++)
{
cov[i]+=data[k]*core[k-(n-m/2+j)];//k针对data[k]
}
}
//中间的n-m行
for(i=m/2;i<=(n-m)+m/2;i++)
{
for(j=0;j<m;j++)
{
cov[i]+=data[i-m/2+j]*core[j];
}
}
//最后m/2-1行
i=(n-m)+m/2+1;
for(j=1;j<m/2;j++,i++)
{
for(k=0;k<j;k++)
{
cov[i]+=data[k]*core[m-j-k];//k针对data[k]
}
for(k=0;k<m-j;k++)
{
cov[i]+=core[k]*data[n-(m-j)+k];//k针对core[k]
}
}
}
/******************************************************************
*一维小波变换函数
*
*说明:一维小波变换,只变换一次
*
*输入参数:input[],输入信号;output[],小波变换结果,包括尺度系数和
*小波系数两部分;temp[],存放中间结果;h[],Daubechies小波基低通滤波器系数;
*g[],Daubechies小波基高通滤波器系数;n,输入信号长度;m,Daubechies小波基紧支集长度.
*
*李承宇,[email protected]
*
*2010-08-19
******************************************************************/
voidDWT1D(doubleinput[],doubleoutput[],doubletemp[],doubleh[],
doubleg[],intn,intm)
{
// doubletemp[LENGTH]={0};//?????????????
inti=0;
/*
//尺度系数和小波系数放在一起
Covlution(input,h,temp,n,m);
for(i=0;i<n;i+=2)
{
output[i]=temp[i];
}
Covlution(input,g,temp,n,m);
for(i=1;i<n;i+=2)
{
output[i]=temp[i];
}
*/
//尺度系数和小波系数分开
Covlution(input,h,temp,n,m);
for(i=0;i<n;i+=2)
{
output[i/2]=temp[i];//尺度系数
}
Covlution(input,g,temp,n,m);
for(i=1;i<n;i+=2)
{
output[n/2+i/2]=temp[i];//小波系数
}
}
voidmain()
{
doubledata[LENGTH];//输入信号
doubletemp[LENGTH];//中间结果
doubledata_output[LENGTH];//一维小波变换后的结果
intn=0;//输入信号长度
intm=6;//Daubechies正交小波基长度
inti=0;
chars[32];//从txt文件中读取一行数据
staticdoubleh[]={.332670552950,.806891509311,.459877502118,-.135011020010,
-.085441273882,.035226291882};
staticdoubleg[]={.035226291882,.085441273882,-.135011020010,-.459877502118,
.806891509311,-.332670552950};
//读取输入信号
FILE*fp;
fp=fopen("data.txt","r");
if(fp==NULL)//如果读取失败
{
printf("错误!找不到要读取的文件/"data.txt/"/n");
exit(1);//中止程序
}
while(fgets(s,32,fp)!=NULL)//读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行?回车符返回的是零值?是,非数字字符经过atoi变换都应该返回零值
{
// fscanf(fp,"%d",&data[count]);//一定要有"&"啊!!!最后读了个回车符!适应能力不如atoi啊
data[n]=atof(s);
n++;
}
//一维小波变换
DWT1D(data,data_output,temp,h,g,n,m);
//一维小波变换后的结果写入txt文件
fp=fopen("data_output.txt","w");
//打印一维小波变换后的结果
for(i=0;i<n;i++)
{
printf("%f/n",data_output[i]);
fprintf(fp,"%f/n",data_output[i]);
}
//关闭文件
fclose(fp);
}
Ⅱ Symlets灏忔尝婊ゆ尝鍣╯ymwavf璋幂敤鏂瑰纺
F=symwavf锛堚荣ymname钬欙级
璇存槑锛氲ュ嚱鏁拌繑锲炰笌镓鎸囧畾镄剆ymlets灏忔尝鐩稿叧镵旂殑灏哄害婊ゆ尝鍣锛孨镄勫彲鑳藉间负2锛3锛4锛5锛6锛7鎴8銆
锛讳緥6-13锛%璁$畻涓巗ym4鐩稿叧镄勫昂搴︽护娉㈠櫒
w=symwavf锛堚荣ym4钬欙级
杈揿嚭缁撴灉锛
w=
Columns 1 through 7
0.0228-0.0089-0.0702 0.2106 0.5683 0.3519-0.0210
Column 8
0.0536
涓嬮溃浠嬬粛涓缁村皬娉㈠彉鎹㈢殑链夊叧鍑芥暟镄勭敤娉曪纴鍖呮嫭涓缁磋繛缁灏忔尝鍙樻崲鍜屼竴缁寸绘暎灏忔尝鍙樻崲銆
Ⅲ 涓缁寸绘暎灏忔尝阃嗗彉鎹idwt璋幂敤鏂瑰纺
锛1锛塜=idwt锛坈A锛宑D锛屸榳name钬欙级
锛2锛塜=idwt锛坈A锛宑D锛孡o_R锛孒i_R锛
锛3锛塜=idwt锛坈A锛宑D锛屸榳name钬欙纴L锛
锛4锛塜=idwt锛坈A锛宑D锛孡o_R锛孒i_R锛孡锛
璇存槑锛氲ュ嚱鏁扮敤浜庡崟灏哄害涓缁寸绘暎灏忔尝鍙樻崲镄勯吨鏋勚傚规牸寮忥纸1锛夈侊纸3锛夛纴瀹冩槸鐢ㄥ皬娉㈠嚱鏁拌繘琛岄吨鏋勶纴瀵逛簬锛2锛夈侊纸4锛夊畠鏄鐢ㄩ吨鏋勬护娉㈠櫒杩涜岄吨鏋勶纴鍏朵腑锛宑A鍜宑D镄勯暱搴︽槸鐩哥瓑镄勶纴Lo_R鍜孒i_R镄勯暱搴︽槸鐩哥瓑镄勚傝繑锲炵郴鏁疖涓洪吨鏋勫悗淇″彿镄勫悜閲忋傚傛灉cA镄勯暱搴︿负la锛孡o_R镄勯暱搴︿负lf锛屽垯X镄勯暱搴︿负length锛圶锛=2*la lf+2銆傚逛簬镙煎纺锛3锛夈侊纸4锛夛纴鍒欐槸瀵逛俊鍙蜂腑闂撮暱搴︿负L镄勯儴鍒呜繘琛岄吨鏋勶纴L锛2*la lf+2銆
锛讳緥6-16锛絣oad leleccum锛%瑁呰浇铡熷嬩竴缁翠俊鍙
s=leleccum锛1锛1000锛夛绂
subplot锛6锛2锛1锛夛绂plot锛坰锛夛绂
title锛堚桦师濮嬩俊鍙封欙级锛
%涓嬮溃鐢╠b2娉㈠嚱鏁拌繘琛屼竴缁寸绘暎灏忔尝鍙樻崲
锛籧a锛宑d锛=dwt锛坰锛屸榙b2钬欙级锛
%鐢ㄦ尝鍑芥暟db2杩涜屼俊鍙风殑閲嶆瀯
锲6-42 涓缁寸绘暎灏忔尝阃嗗彉鎹idwt
xl=idwt锛坈a锛宑d锛屸榙b2钬欙级锛
subplot锛625锛夛绂plot锛坸l锛夛绂
title锛堚桦皬娉㈤吨鏋勨欙级锛
errxlmax=max锛坅bs锛坰-xl锛夛级锛
errxl=s-xl锛
Subplot锛626锛夛绂plot锛坋rrxl锛夛绂
Title锛堚桦皬娉㈤吨鏋勮宸钬欙级锛
Axis锛堬蓟0锛1000锛-2e-11锛2e-11锛斤级锛
%浜х敓涓涓涓巇b2鐩稿叧镄勯吨鏋勬护娉㈠櫒
锛籐o_D锛孒i_D锛孡o_R锛孒i_R锛=wfilters锛堚榙b2钬欙级锛
%鐢ㄥ垎瑙f护娉㈠櫒瀵逛俊鍙穝杩涜屼竴缁村皬娉㈠垎瑙
锛籧a锛宑d锛=dwt锛坰锛孡o_D锛孒i_D锛夛绂
%鐢ㄩ吨鏋勬护娉㈠櫒杩涜屼俊鍙风殑閲嶆瀯
x2=idwt锛坈a锛宑d锛孡o_R锛孒i_R锛夛绂
subplot锛6锛2锛9锛夛绂plot锛坸2锛
title锛堚樻护娉㈠櫒閲嶆瀯钬欙级锛
errx2max=max锛坅bs锛坰-x2锛夛级
errx2=s-x2锛
subplot锛6锛2锛10锛夛绂plot锛坋rrx2锛夛绂
title锛堚樻护娉㈠櫒閲嶆瀯璇宸钬欙级锛
axis锛堬蓟0锛1000锛-2e-11锛2e-11锛斤级锛
浠庝笂闱㈢殑鍒嗘瀽鍙浠ョ湅鍑猴纴閲囩敤灏忔尝閲嶆瀯鍜屼笌閲嶆瀯婊ゆ尝鍣ㄨ繘琛岄吨鏋勶纴鍏舵晥鏋滃熀链涓婃槸涓镙风殑锛屽畠浠鍦ㄩ吨鏋勭簿搴︿笂瀛桦湪镌杈冨皬镄勫樊鍒銆