首先是幾個名詞:
時域:時域是描述數學函數或物理信號對時間的關系,我們在實際中對信號物理量的描述都是以時間為基准的,沿着時間增加的方向我們才有了波形周期、波形的概念,從以時間為角度稱為時域。
頻域:頻域分析是把信號變為以頻率軸為坐標表示出來。也即從頻率的角度去描述波形。
時域分析與頻域分析是對模擬信號的兩個觀察面,根據傅立葉分析,所有的波形都可以分解為正弦波,可以由不同頻率的正弦波疊加而成,一種頻率的正弦波在頻域上對應一個點,就行時域上的時間點一樣。例如下圖波形,從時域上看是類似方波,二如果從頻域上看就是一個個線段。
傅立葉變換:將時域上的波形分解成正弦波的過程就是傅立葉變換,傅立葉正變換可以將波形分解,投影到頻域上,傅立葉逆變換可以將頻域上波形疊加,映射到時域上。變換過程如下圖所示:
為何要進行傅立葉變換?
很多在時域看似不可能做到的數學操作,在頻域相反很容易。這就是需要傅里葉變換的地方。尤其是從某條曲線中去除一些特定的頻率成分,這在工程上稱為濾波,是信號處理最重要的概念之一,只有在頻域才能輕松的做到。離散傅里葉變換(DFT)是傅里葉變換在離散系統中的表示形式。但是DFT的計算量非常大, FFT就是DFT的一種快速算法。
matlab實現:
我們對函數x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)進行FFT變換,並繪制出變換之前和之后的圖像。

fs=100;N=1024;n=0:N-1;t=n/fs; x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信號函數 subplot(2,1,1),plot(t,x); %繪出信號曲線 y=fft(x,N); %對信號進行快速Fourier變換 mag=abs(y); %求取Fourier變換的振幅 f=n*fs/N; %求頻率 subplot(2,1,2),plot(f,mag); %繪出隨頻率變化的振幅 xlabel('頻率/Hz'); ylabel('振幅');title('N=1024');grid on;
結果如下,我們可以看出上方是時域波形,下方是頻域波形:
傅立葉變換的缺點:
基於傅里葉(Fourier)變換的信號頻域表示,揭示了時間函數和頻譜函數之間的內在聯系,但是基於傅里葉變換的信號頻域表示,揭示了時間函數和頻譜函數之間的內在聯系。傅里葉變換可以完成從時域到頻域的轉換(正變換),也可以完成從頻域到時域的轉換(逆變換),但不能同時具有時域和頻域信息,而且傅立葉變換還有一個很大的缺點就是不能很好的處理突變。
為何同時需要時域和頻域信息?
現實中大部分波形都是非穩態波形,頻域信息只提供了波形的成分,並沒有提供成分出現的先后,因此單純的傅立葉分析對頻率隨時間變化的非平穩信號分辨率差。如下圖所示:
做FFT后,我們發現這三個時域上有巨大差異的信號,頻譜(幅值譜)卻非常一致。尤其是下邊兩個非平穩信號,我們從頻譜上無法區分它們,因為它們包含的四個頻率的信號的成分確實是一樣的,只是出現的先后順序不同。

傅里葉變換,變量只有頻率ω,小波變換有兩個變量:尺度a(scale)和平移量 τ(translation)。尺度就對應於頻率(反比),平移量τ就對應於時間,小波分析的過程就是用單個小波不斷伸縮平移,疊加出時域上的完整波形。
傅立葉變換與小波分析的區別:
傅立葉變換適合周期性的數據,分析不隨時間變化的信號,小波不但適用此類信號,更能很好的處理突變信號以及非穩態信號。
小波:均值為0的一類波形,如圖
小波分析:將原來的信號分解為基於小波波形經過平移和比例變化之后的一系列波形。小波變換分成兩個大類:離散小波變換(DWT) 和連續小波變換(CWT)。兩者的主要區別在於,連續變換在所有可能的縮放和平移上操作,而離散變換采用所有縮放和平移值的特定子集。一般來說,對於連續信號采用連續小波變換,對於離散信號采用離散小波變換。
母小波:母小波是一類具有快速衰減有限長的波函數
基小波(小波基):母函數伸縮、平移得到的一系列函數就是小波基函數,如下圖就是小波基,常用的小波基有:Haar小波基、db系列小波基、Biorthogonal(biorNr.Nd)小波系、Coiflet(coifN)小波系、SymletsA(symN)小波系、Molet(morl)小波、Mexican Hat (mexh)小波、Meyer小波等。
Matlab代實現:
名詞:
離散小波變換、二進制小波與連續小波變換(DWT和CWT):三者的主要區別不是信號的離散,因為輸入計算機的必然是離散信號,連續與離散是指尺度和平移量的取值是否離散。連續小波是尺度可連續取值的小波,里面的a一般取整數,而不像二進小波a取2的整數冪。從連續小波到二進小波再到正交離散小波,其實就是a、b都連續,a不連續、b連續,a、b都不連續的過程。在MATLAB里,也就是CWT,SWT,DWT。
近似系數和細節系數:可以理解為信號分離之后的低頻部分和高頻部分。
主要常用的函數如下:
wavedemo ;小波工具箱函數demo
cwt ;一維連續小波變換
dwt 單尺度一維離散小波變換,對離散小波單層分解
分析之前的圖形:
t=0:0.03:2*pi;
y=sin(t.^2);
plot(t,y);
分析之后的圖形:
a=1:32;
z=cwt(y,a,'mexh',plot)
三維顯示:
代碼:
surf(t,a,z)
shading flat;
axis([0 2*pi,0,32,min(z(:)) max(z(:))])
例子:離散小波,一般來說,離散小波分析用的較多,因為方便后續進行分析,離散小波采用dwt函數,調用形式為[cA,cD]=dwt(X,'wname'),使用wavemngr ;小波管理函數可列出所有可調用小波。
調用命令如下:
wavemngr('read',1)
結果:
小波模板數據采用wavefun函數繪制波形,此處不再繪制
我們一般采用Daubechies簇的小波,,db1也即haar小波,離散小波代碼如下:

x=0:0.002:2*pi; y=sin(x.^2);%原始信號波形 r=0.1*randn(size(x)); y1=y+r; subplot(211); plot(x,y1); title('原始圖像'); [cA,cD]=dwt(y1,'db4');%離散小波變換 subplot(223), plot(x(1:length(cA)),cA); title('低頻圖像'); subplot(224), plot(x(1:length(cD)),cD); title('高頻圖像'); %離散小波逆變換,並檢驗精度 y2=idwt(cA,cD,'db4'); ans=norm(y1-y2)
離散結果:
逆變誤差:
例子:一維小波信號的多層分解:
[C,L]=wavedec(x,n,fun),x為原始信號,n為分解步數,fun為所選用基小波的名稱,C、L為分解后的兩個向量,C、L兩個向量的近似系數和細節系數的提取需要利用appcoef()和detcoef()完成。調用格式為:cA=appcoef(C,L,fun,n);以及cD=detcoef(C,L,i);提取第i段細節系數。重建函數采用wrcoef(),調用格式為:x=wrcoef(類型,C,L,fun,n);其中類型可選'a'或者'd',選擇利用近似系數還是細節系數進行源信號構建,選擇近似系數對去噪有很好的效果。
matlab代碼如下:

%一維離散小波多層分解 clc;clear; x=0:0.002:2*pi; y=sin(x.^2);%原始信號波形 r=0.1*randn(size(x)); y1=y+r; subplot(411); plot(x,y1); title('原始圖像'); %信號重構 [C,L]=wavedec(y1,3,'db6'); y2 = waverec(C,L,'db6') subplot(412); plot(x,y2); title('重構圖像'); %高低頻信號重建 y3=wrcoef('a',C,L,'db6',3) subplot(413); plot(x,y3); title('低頻重建圖像'); y4=wrcoef('a',C,L,'db6',3) subplot(414); plot(x,y4); title('高頻重建圖像'); figure(2); %下面為各層系數 cA1=appcoef(C,L,'db6',1); subplot(611); plot(cA1) title('一層分解低頻圖像'); cD1=detcoef(C,L,1); subplot(612); plot(cD1) title('一層分解高頻圖像'); cA2=appcoef(C,L,'db6',2); subplot(613); plot(cA2) title('二層分解低頻圖像'); cD2=detcoef(C,L,2); subplot(614); plot(cD2) title('二層分解高頻圖像'); cA3=appcoef(C,L,'db6',3); subplot(615); plot(cA3) title('三層分解低頻圖像'); cD3=detcoef(C,L,3); subplot(616); plot(cD3) title('三層分解高頻圖像');
運行結果:
此外還可以使用wavemenu小波工具箱命令,通過界面的方式進行分析。
還需研究的問題:
1.基小波的選擇,什么情況下選什么基小波,目前看來差別是不大的,選擇常用就好
2.多層分解步數的確定是如何確定的