matlab中的卷積——filter,conv之間的區別


%Matlab提供了計算線性卷積和兩個多項式相乘的函數conv,語法格式w=conv(u,v),其中u和v分別是有限長度序列向量,w是u和v的卷積結果序列向量。 
%如果向量u和v的長度分別為N和M,則向量w的長度為N+M-1.如果向量u和v是兩個多項式的系數,則w就是這兩個多項式乘積的系數。 
x=ones(1,4);                                        %x(n)=R4(n) 
h=ones(1,4);                                        %h(n)=R4(n)                    
y=conv(x,h);                                        %y(n)=x(n) * h(n)       

conv是做卷積,就是按照書上的做法,先翻轉,在一步步平移,得出結果。對於兩個長度分別為n,m的序列,卷積結果長度為m+n-1

filter是做濾波,其實原理跟卷積是想通的,只不過處理結果的方法不同,先看示例程序:

 

 
  1. x=[1,2,3,4,5];  
  2. h=[1,1,1];  
  3.   
  4. y1=conv(h,x)  
  5. y2=filter(h,1,x)  
  6. y3=filter(x,1,h)  
  7. y4=filter(x,1,[h,zeros(1,4)])  

結果為:

 

 

  1. y1 =  
  2.   
  3.      1     3     6     9    12     9     5  
  4.   
  5.   
  6. y2 =  
  7.   
  8.      1     3     6     9    12  
  9.   
  10.   
  11. y3 =  
  12.   
  13.      1     3     6  
  14.   
  15.   
  16. y4 =  
  17.   
  18.      1     3     6     9    12     9     5  

現在對結果一一作出解釋;

 

1.y1的確是嚴格按照卷積的數學表達式計算的,不解釋。

在解釋后面幾條時,先說一下filter的用法:filter(B,A,X),其中B,A組成一個差分方程,X是輸入信號,例如:

filter([1,2],1,[1,2,3,4,5])實現  y[k]=x[k]+2*x[k-1]
咱們這里討論的就是A=1的情況。有了基本說明,現在言歸正傳:

2.說明filter函數平移停滯在X的最后一個輸入與濾波器的第一個系數對齊時。這里為

 


 
  1.                 1   1   1  
  2. 5   4   3   2   1  
  3. 輸出1,到  
  4.                 1   1   1  
  5.                 5   4   3   2   1  
  6. 輸出12  

 

3.驗證2的觀點,這里為:


 

 
  1.         1   2   3   4   5  
  2. 1   1   1  
  3. 輸出1,到  
  4.         1   2   3   4   5  
  5.         1   1   1  
  6. 輸出6  


 

4.依然是驗證2的觀點,從

 


 
  1.                 1   2   3   4   5  
  2. 0   0   0   0   1   1   1   1  
  3. 輸出1,到  
  4.                 1   2   3   4   5  
  5.                 0   0   0   0   1   1   1   1  
  6. 輸出5   


 

並且,第4種情況下,通過補0使得所有的1都移到了濾波器抽頭的末尾,這個結果與卷積是相同的。

 

到這里,我想大家就明白了二者的區別和關系。

 

 

在MATLAB中,可以用函數y=filter(p,d,x)實現差分方程的仿真,也可以用函數 y=conv(x,h)計算卷積。

(1)即y=filter(p,d,x)用來實現差分方程,d表示差分方程輸出y的系數,p表示輸入x的系數,而x表示輸入序列。輸出結果長度數等於x的長度。

實現差分方程,先從簡單的說起:
filter([1,2],1,[1,2,3,4,5]),實現y[k]=x[k]+2*x[k-1]
y[1]=x[1]+2*0=1    (x[1]之前狀態都用0)
y[2]=x[2]+2*x[1]=2+2*1=4

(2)y=conv(x,h)是用來實現卷級的,對x序列和h序列進行卷積,輸出的結果個數等於x的長度與h的長度之和減去1。

卷積公式:z(n)=x(n)*y(n)= ∫x(m)y(n-m)dm.

程序一:以下兩個程序的結果一樣

(1)h = [3 2 1 -2 1 0 -4 0 3]; % impulse response

          x = [1 -2 3 -4 3 2 1]; % input sequence

         y = conv(h,x);

         n = 0:14;

         subplot(2,1,1);

         stem(n,y);

         xlabel('Time index n'); ylabel('Amplitude');

        title('Output Obtained by Convolution'); grid;

(2)x1 = [x zeros(1,8)];

          y1 = filter(h,1,x1);

          subplot(2,1,2);

         stem(n,y1);

         xlabel('Time index n'); ylabel('Amplitude');

         title('Output Generated by Filtering'); grid;

 

 

程序二:filter和conv的不同

               x=[1,2,3,4,5];
               h=[1,1,1];

               y1=conv(h,x)
               y2=filter(h,1,x)
               y3=filter(x,1,h)

 結果:y1 = 1     3     6     9    12     9     5

       y2 = 1     3     6     9    12

‍              y3  = 1     3     6  

可見:filter函數y(n)是從n=1開始,認為所有n<1都為0;而conv是從卷積公式計算,包括n<1部分。

                因此filter 和conv 的結果長短不同

程序三:濾波后信號幅度的變化

                num=100; %總共1000個數 
                x=rand(1,num); %生成0~1隨機數序列 
                x(x>0.5)=1; 
                x(x<=0.5)=-1;
                h1=[0.2,0.5,1,0.5,0.2]; 
                h2=[0,0,1,0,0];
                y1=filter(h1,1,x);
                y2=filter(h2,1,x);
                n=0:99;
                subplot(2,1,1);
                stem(n,y1);
                subplot(2,1,2); 
                stem(n,y2);

 

 

MATLAB中提供了卷積運算的函數命令conv2,其語法格式為: 
C = conv2(A,B) 
C = conv2(A,B)返回矩陣A和B的二維卷積C。若A為ma×na的矩陣,B為mb×nb的矩陣,則C的大小為(ma+mb-1)×(na+nb-1)。 


例: 
A=magic(5) 
A = 
17 24 1 8 15 
23 5 7 14 16 
4 6 13 20 22 
10 12 19 21 3 
11 18 25 2 9 
>> B=[1 2 1 ;0 2 0;3 1 3] 
B = 
1 2 1 
0 2 0 
3 1 3 
>> C=conv2(A,B) 
C = 
17 58 66 34 32 38 15 
23 85 88 35 67 76 16 
55 149 117 163 159 135 67 
79 78 160 161 187 129 51 
23 82 153 199 205 108 75 
30 68 135 168 91 84 9 
33 65 126 85 104 15 27 
MATLAB圖像處理工具箱提供了基於卷積的圖象濾波函數filter2,filter2的語法格式為: 
Y = filter2(h,X) 
其中Y = filter2(h,X)返回圖像X經算子h濾波后的結果,默認返回圖像Y與輸入圖像X大小相同。例如: 
其實filter2和conv2是等價的。MATLAB在計算filter2時先將卷積核旋轉180度,再調用conv2函數進行計算。 
Fspecial函數用於創建預定義的濾波算子,其語法格式為: 
h = fspecial(type) 
h = fspecial(type,parameters) 
參數type制定算子類型,parameters指定相應的參數,具體格式為: 
type='average',為均值濾波,參數為n,代表模版尺寸,用向量表示,默認值為[3,3]。 
type= 'gaussian',為高斯低通濾波器,參數有兩個,n表示模版尺寸,默認值為[3,3],sigma表示濾波器的標准差,單位為像素,默認值為0.5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM