1. 程式人生 > >轉 matlab卷積函式介紹 conv filter conv2

轉 matlab卷積函式介紹 conv filter conv2

最近在做控制演算法實現的時候,對於其中參雜的各種差分、卷積很頭疼,就在網上搜集了些資料,彙總於此,以做備忘。
在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