1. 程式人生 > >基於Matlab的離散小波變換

基於Matlab的離散小波變換

簡介
在數字影象處理中,需要將連續的小波及其小波變換離散化。一般計算機實現中使用二進位制離散處理,將經過這種離散化的小波及其相應的小波變換成為離散小波變換(簡稱DWT)。實際上,離散小波變換是對連續小波變換的尺度、位移按照2的冪次進行離散化得到的,所以也稱之為二進位制小波變換。

雖然經典的傅立葉變換可以反映出訊號的整體內涵,但表現形式往往不夠直觀,並且噪聲會使得訊號頻譜複雜化。在訊號處理領域一直都是使用一族帶通濾波器將訊號分解為不同頻率分量,即將訊號f(x)送到帶通濾波器族Hi(x)中。

小波分解的意義就在於能夠在不同尺度上對訊號進行分解,而且對不同尺度的選擇可以根據不同的目標來確定。

對於許多訊號,低頻成分相當重要,它常常蘊含著訊號的特徵,而高頻成分則給出訊號的細節或差別。人的話音如果去掉高頻成分,聽起來與以前可能不同,但仍能知道所說的內容;如果去掉足夠的低頻成分,則聽到的是一些沒有意義的聲音。在小波分析中經常用到近似與細節
。近似表示訊號的高尺度,即低頻資訊;細節表示訊號的高尺度,即高頻信息。因此,原始訊號通過兩個相互濾波器產生兩個訊號。

通過不斷的分解過程,將近似訊號連續分解,就可以將訊號分解成許多低解析度成分。理論上分解可以無限制的進行下去,但事實上,分解可以進行到細節(高頻)只包含單個樣本為止。因此,在實際應用中,一般依據訊號的特徵或者合適的標準來選擇適當的分解層數。

% By lyqmath
% DLUT School of Mathematical Sciences 2008
% BLOG:http://blog.sina.com.cn/lyqmath
clc; clear all; close all;
load leleccum; % 載入訊號資料
s = leleccum;
Len = length(s);
[ca1, cd1] = dwt(s, 'db1'); % 採用db1小波基分解
a1 = upcoef('a', ca1, 'db1', 1, Len); % 從係數得到近似訊號
d1 = upcoef('d', cd1, 'db1', 1, Len); % 從係數得到細節訊號
s1 = a1+d1; % 重構訊號
figure;
subplot(2, 2, 1); plot(s); title('初始電源訊號');
subplot(2, 2, 2); plot(ca1); title('一層小波分解的低頻資訊');
subplot(2, 2, 3); plot(cd1); title('一層小波分解的高頻資訊');
subplot(2, 2, 4); plot(s1, 'r-'); title('一層小波分解的重構訊號');