一維離散小波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錛斤級錛
浠庝笂闈㈢殑鍒嗘瀽鍙浠ョ湅鍑猴紝閲囩敤灝忔嘗閲嶆瀯鍜屼笌閲嶆瀯婊ゆ嘗鍣ㄨ繘琛岄噸鏋勶紝鍏舵晥鏋滃熀鏈涓婃槸涓鏍風殑錛屽畠浠鍦ㄩ噸鏋勭簿搴︿笂瀛樺湪鐫杈冨皬鐨勫樊鍒銆