小波變換c語言實現
㈠ 我想用多貝西小波對有奇異點的信號進行分析,然後提取奇異點發生的時間點信息,用c語言怎麼寫
(1)小波模極大值重構 MATLAB代碼_天天向上_新浪博客 http://blog.sina.com.cn/s/blog_6c00b0e30100u1s5.html
function
[signal,swa,swd,ddw,wpeak]=wave_peak(points,level,Lo_D,Hi_D,Lo_R,Hi_R,offset)
%
該函數用於讀取ecg信號,找到小波變換模極大序列
warning off;
ecgdata=load('ecg.txt');
%需要分析的信號,自己加
plot(ecgdata(1:points)),grid on,axis
tight,axis([1,points,-50,300]);
signal=ecgdata(1:points)'+offset;
% 信號的小波變換,按級給出概貌和細節的波形
[swa,swd] =
swt(signal,level,Lo_D,Hi_D);
figure;
subplot(level,1,1);
plot(real(signal)); grid on;axis tight;
for i=1:level
subplot(level+1,2,2*(i)+1);
plot(swa(i,:)); axis
tight;grid on;xlabel('time');
ylabel(strcat('a
',num2str(i)));
subplot(level+1,2,2*(i)+2);
plot(swd(i,:)); axis
tight;grid on;
ylabel(strcat('d ',num2str(i)));
end
%求小波變換的模極大值及其位置
ddw=zeros(size(swd));
pddw=ddw;
nddw=ddw;
posw=swd.*(swd>0);
pdw=((posw(:,1:points-1)-posw(:,2:points))<0);
pddw(:,2:points-1)=((pdw(:,1:points-2)-pdw(:,2:points-1))>0);
negw=swd.*(swd<0);
ndw=((negw(:,1:points-1)-negw(:,2:points))>0);
nddw(:,2:points-1)=((ndw(:,1:points-2)-ndw(:,2:points-1))>0);
ddw=pddw|nddw;
ddw(:,1)=1;
ddw(:,points)=1;
wpeak=ddw.*swd;
wpeak(:,1)=wpeak(:,1)+1e-10;
wpeak(:,points)=wpeak(:,points)+1e-10;
%按級給出小波變換模極大的波形
figure;
for i=1:level
subplot(level,1,i);
plot(wpeak(i,:)); axis tight;grid
on;
ylabel(strcat('j= ',num2str(i)));
end
註:運行此程序時一定要將待處理信號添加進去,程序中的紅色部分。
追問:
ecgdata=load('ecg.txt');
㈡ 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);
}
㈢ 要對圖像進行小波變換去噪,可以用哪些圖像處理庫(C/C++)
1.最簡單的方法:
public static String reverse1(String str)
{
return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{
char[] array = s.toCharArray();
String reverse = ""; //注意這是空串,不是null
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的變形:
public static String reverse2(String s)
{
int length = s.length();
String reverse = ""; //注意這是空串,不是null
for (int i = 0; i < length; i++)
reverse = s.charAt(i) + reverse;//在字元串前面連接, 而非常見的後面
return reverse;
}
4.C語言中常用的方法:
public static String reverse5(String orig)
{
char[] s = orig.toCharArray();
int n = s.length - 1;
int halfLength = n / 2;
for (int i = 0; i <= halfLength; i++) {
char temp = s[i];
s[i] = s[n - i];
s[n - i] = temp;
}
return new String(s); //知道 char數組和String相互轉化
}
㈣ 小波包頻帶能量演算法可以用c語言實現嗎
小波變換已應用到工程的各個方面,但一般只是應用Madab的小波工具包來編程,有時需要自己編程實現.故這里給出了DB4小波變換的C實現
㈤ C語言實現把一個JPG圖片分解為兩個圖片,急!!謝謝
麻煩。。無聊。。
先找著jpg文件頭格式。。
C打開文件。。找到數據部分。。
新建文件。。寫入。。保存。。
綜上所述:無聊+麻煩。
㈥ 有關C語言運行小波變換程序的時間問題。
我只聽聞小波技術,從未試過哈,只做過傅里葉變換而已。。。但是,你可以分析下你輸出的數據,正確與否,就用matlab的輸出和C執行器的輸出對比下,就知道靠不靠譜了啊。
如果嫌數據太多,可以找一些對比分析軟體,如果實在無法全部分析,就弄幾個特殊點,讓程序就在那一些點輸出對應值,對比matlab和C執行器的輸出,多次換點,再對比,就知道靠不靠譜了。。。。你只是通過運算時間,怎麼知道靠不靠譜呢,呵呵,要是你用多核DSP來算,只是一瞬間的事情,豈不是更不靠譜了。
㈦ 怎麼把小波變換分成低頻和高頻部分,單獨進行處理,高人指教,在線等,所有積分送上。。。
沒具體做過,不過按照你的意圖,應該就是使用mallat演算法的離散小波變換(DWT),在matlab中有現成的函數很易實現。
如果你非要用C,那麼需要C下解決以下幾點:
1.信號處理中卷積的C程序實現;
2.當實現了卷積計算的C代碼,你需要得到某個小波函數對應的高頻(帶通)和低通分解和重構濾波器組,這可以在matlab的wfilters函數和幫助中得到詳細的濾波器系數;
3.以上兩個問題都解決了,那麼直接對信號用濾波器進行卷積再去掉結果越一半的數據即可得到DWT的高頻細節和低頻逼近系數,用這些系數補零插值再卷積一次就得到了高頻細節和低頻逼近的重構信號(這就是你要的高頻和低頻的兩個單獨部分,然後你想咋處理就咋處理)。對於多層的DWT你只要對小波系數逐層減半即可實現DWT每層尺度伸長一倍的效果。
4.這時你會碰到卷積濾波的邊緣效應,你需要對原始信號進行擴展,你可以參看matlab中dwtmode函數的幫助文檔;
5.對於二維DWT,你還要實現張量積C代碼的實現,還有二維離散采樣(行抽取,列抽取和斜抽取)的C代碼(在dwt2函數的幫助文檔中有詳細的流程圖)。
由於matlab函數通常是用C語言編制的,而且每個函數都可查詢原始代碼,如果你有一定的水平,可以試試。不過你這問題需要較為深入的小波分析,信號處理和數學理論的支持,能不能編出象樣的C程序就不知道。這問題matlab很容易就解決了,可非要用C,這就是一個比較大的工程了,一個人要花費好長時間還不一定編的成,光數學理論就傷不起啊,技術問題就更別提了!到現在為止也沒見有啥象樣的小波C程序,你搜搜試試吧。能想到的就這么多了,水平有限,僅供參考,Good luck!
㈧ 二維小波變換怎樣用矩陣來實現
二維小波變換矩陣方法
YC,YS]=wavedec2(Y,2,'db1');
Y為要分解的圖像矩陣,2為分解的層數,『db1'為採用的小波基。回兩個矩陣YC和YS。Yh2=detcoef2('h',YC,YS,2);這是提取出圖像2層分解後的水平分量,h改v是垂直分量,h該d是對角分量。細節分量用另外一個方法提取。
㈨ 關於小波db2和db4在c語言中的實現
小波db2和db4在c語言程序中具體差別體現在階數不同,也就是存儲單元佔用量不同,同時信號的延時不同,延時單元的長度也不同