一維小波變換的C 實現

2022-08-22 06:33:13 字數 2762 閱讀 7131

將小波展開係數當成離散訊號,尺度函式和小波函式的mra方程係數看成數字濾波器組,根據mallat快速演算法的原理,小波變換對資料的處理方法可簡化成對訊號逐級取樣和濾波的過程。

圖1 小波變換的濾波器實現

(a)分解演算法 (b)重構演算法

一層小波分解演算法流程如圖2所示,訊號將先經過小波分解低通濾波器和高通濾波器,隨後被降取樣,實現資料重構。而濾波演算法可簡化為待處理訊號與濾波器陣列卷積的過程,為了保證卷積前和卷積後陣列的長度相同,結合小波變換中陣列延拓的思想,在實際程式設計過程中,可以將超過訊號長度的那段資料以前端對齊的方式與前面一段資料相加。將卷積後的陣列每2個點取樣一次,即可獲得小波分解後的尺度係數和小波係數。

圖2 一層小波分解演算法

(x:待分解陣列;h,g:小波分解濾波器;c,d:小波重構後陣列)

小波重構演算法是小波分解演算法的逆運算,其流程為公升取樣和濾波,最後資料相加實現重構。小波重構演算法中濾波可視為係數與小波重構濾波器的卷積,與小波正變換類似,在重構演算法中,需要將卷積後的陣列末位對齊相加,獲得與原陣列長度相同的卷積結果。將小波係數和尺度係數以2為步長進行公升取樣,將獲得的新陣列分別經過小波重構低通濾波器和高通濾波器,再將濾波後的兩組資料相加,即實現了一層小波重構。

1

#define length 512

2#define level 4

3#define l_core 645

static

void covlution(double data, double core, double cov, int

len)6;

8int i = 0;9

int j = 0;10

11for(i = 0; i < len; i++)

1217}18

19for(i = 0; i < len; i++)

202627}

2829

static

void covlution2(double data, double core, double cov, int

len)30;

32int i = 0;33

int j = 0;34

35for(i = 0; i < len; i++)

3641}42

43for(i = 0; i < len; i++)

445051}

5253

static

void dwt1d(double input, double output, double lf, double hf, int

l)54;57

int len = length / pow(2, l - 1

);58

59covlution(input, lf, temp, len);

60for(i = 1; i < len; i += 2)61

6465

covlution(input, hf, temp, len);

66for(i = 1; i < len; i += 2)67

70}7172

static

void dwt(double input, double output, double lf, double hf, int

len)

7386}87

88static

void idwt1d(double input, double output, double lf, double hf, int l, int

flag)89;

92int len = l * 2;93

94if

(flag) covlution2(input, hf, temp, len);

95else

covlution2(input, lf, temp, len);

9697

for(i = 0; i < len; i++)

98101

}102

103static

void idwt(double input, double output, double lf, double hf, int len, int

level)

104112

for(j = 0; j < 2 * len[level + 1 - level]; j++)

113116 idwt1d(input, output, lf, hf, len[level + 1 - level], 1

);117

118for(i = level - 1; i > 0; i--)

119125 idwt1d(input, output, lf, hf, len[level + 1 - i], 0

);126

}127 }

用c++演算法實現的小波變換結果與matlab實現的小波變換結果對比(心電訊號,db5小波,5層分解)。計算的結果幾乎相差無異,大多數字於中間的資料計算結果完全相同,兩端的資料則存在一定誤差,這可能與對訊號採取的延拓方式不同有關。

(a)小波變換結果(紅線:matlab計算結果;藍線:c++演算法計算結果)

(b)小波變換誤差(兩個計算結果相減)

一維離散小波變換過程

小波變換的本質不過是一種數學變換 在這裡僅僅討論小波的小波變換過程中對輸入的訊號進行了怎樣的操作,盡量不涉及內部細節和數學原理 1.一維小波變換的輸入變數是乙個 1 n 的矩陣,你也可以把它理解為訊號 函式等等 2.進行離散小波變換需要預先指定兩個濾波器,乙個是高通濾波器 另乙個是低通濾波器 3.將...

小波分析 三 二維離散小波變換

宣告 該文為本人對小波的理解,不保證正確性與嚴謹性。參考 數字影象處理 gonzalez p317 在給定尺度函式 f x,y 離散函式可以分解為這四個函式不同尺度與位置的線性組合 2didwt 其中近似係數和細節係數分別如下 2ddwt 細節的階數越高,其尺度越小,越細緻,相當於傅利葉中的高頻部分...

小波變換學習筆記(1) 小波變換的背景與體系

前言 眾所周知,變換有好多種,比較流行的有傅利葉變換 小波變換 希爾伯特變換,但是無論是哪種變換,它變換的目的都是為了更清楚 更簡潔地表示訊號,從而方便後續對訊號的分析。話不多說,直接上例子!上圖是乙個訊號的時域表示,如果我讓你在一分鐘之內記住它的波形然後畫出來,我相信大多數人都無法完成,因為這個訊...