1.數(shù)字信號(hào)處理原理
線性系統(tǒng)中,信號(hào)只能以乘以一個(gè)常數(shù)之后再相加的方式進(jìn)行組合。例如,一個(gè)信號(hào)不能直接乘以另外一個(gè)信號(hào)。如下圖所示,根據(jù)給出三個(gè)信號(hào):x0[n],x1[n],x2[n]相加得到最終的信號(hào)x[n]。通過相乘和相加的形式進(jìn)行信號(hào)的組合被稱為信號(hào)的合成。
與信號(hào)合成相反的步驟,叫做信號(hào)的分解。即把原始信號(hào)分解為兩個(gè)或多個(gè)信號(hào)相加。信號(hào)的分解要比信號(hào)合成要復(fù)雜些。試想,假設(shè)我們把15和25相加,那么我們只能得到40,;相反,如果我們把40分解成兩個(gè)或多個(gè)數(shù)字的相加,那么這種分解會(huì)有無(wú)數(shù)種形式,比如1+39,2+38,-30.5+60+10.5。
圖1
數(shù)字信號(hào)處理中,最為關(guān)鍵的步驟是信號(hào)的疊加。假設(shè)有如下圖的輸入信號(hào)x[n],經(jīng)過一個(gè)線性系統(tǒng)之后,輸出信號(hào)為y[n]。輸入信號(hào)可以分解為多個(gè)更為簡(jiǎn)單的信號(hào):x1[n],x2[n],x3[n],這些被稱為輸入信號(hào)分量。之后把各個(gè)輸入信號(hào)分量單獨(dú)的輸入到線性系統(tǒng)中,產(chǎn)生與之對(duì)應(yīng)的輸出信號(hào)分量:y1[n],y2[n],y3[n]。原始的輸入信號(hào)經(jīng)過線性系統(tǒng)之后,得到的輸出信號(hào)y[n]即為各個(gè)輸出信號(hào)分量的合成。線性系統(tǒng)中,通過這種方式獲得的輸出信號(hào)和原始信號(hào)直接通過系統(tǒng)得到的輸出結(jié)果是一樣的。正因?yàn)槿绱?,任何?fù)雜的數(shù)字信號(hào),我們應(yīng)該把它分解為更為簡(jiǎn)單的輸入信號(hào)分量,經(jīng)過線性系統(tǒng)后把輸出信號(hào)分量進(jìn)行合成即為最終的輸出信號(hào)。但是,如果分解的輸入信號(hào)不夠簡(jiǎn)單,那么這樣與分解之前的效果是一樣的,需要復(fù)雜的計(jì)算。
假設(shè)你需要計(jì)算2014乘以4的結(jié)果,我們可以這樣進(jìn)行計(jì)算:把2014分解為2000+10+4,分解的系數(shù)分別乘以4再相加即為最終的輸出結(jié)果。這種方法比直接把兩個(gè)數(shù)相乘要簡(jiǎn)單得多。
圖2
2.卷積
脈沖分解
脈沖分解是卷積的基礎(chǔ)。如下圖所示,N個(gè)采樣信號(hào)經(jīng)過脈沖分解之后,形成N個(gè)信號(hào)分量,每個(gè)信號(hào)分量只包含原始信號(hào)的某一個(gè)采樣點(diǎn)信號(hào),而其他采樣點(diǎn)的值為0。假若某個(gè)信號(hào)只有一個(gè)非零點(diǎn),其他各點(diǎn)數(shù)值均為0,那么這個(gè)信號(hào)被稱為脈沖信號(hào)。
圖3
脈沖函數(shù)
Delta函數(shù)用希臘字母表示為o[n]。delta 函數(shù)是一個(gè)歸一化的脈沖信號(hào),即在采樣點(diǎn)零點(diǎn)位置其值為1,其他采樣點(diǎn)位置各點(diǎn)數(shù)值均為0。
脈沖反應(yīng)
當(dāng)線性系統(tǒng)中輸入信號(hào)為delta函數(shù)時(shí),其輸出的信號(hào)稱為脈沖反應(yīng)。如下圖所示。如果兩個(gè)不同的線性系統(tǒng),當(dāng)輸入信號(hào)均為delta函數(shù)時(shí),其輸出分脈沖反應(yīng)也是不同的。就像離散數(shù)字信號(hào)中,用x[n]、y[n]分別表示輸入信號(hào)和輸出信號(hào),脈沖反應(yīng)使用h[n]表示。當(dāng)然,你也可以使用其他的符號(hào)表示,比如f[n]等。
任何脈沖信號(hào)都可以看作是脈沖函數(shù)的平移和縮放。例如,假設(shè)信號(hào)a[n]只在采樣點(diǎn)8的位置有輸入,且其輸入值為-3,這就相當(dāng)于把delta函數(shù)平移到8的位置,在乘以-3.用公式表示為:a[n] = -3 o[n-8]。假如delta函數(shù)的脈沖反應(yīng)為h[n],那么a[n]的脈沖反應(yīng)為-3h[n-8]。
卷積就像數(shù)學(xué)的加減乘除一樣,是一種形式化的數(shù)學(xué)運(yùn)算。數(shù)學(xué)運(yùn)算中輸入兩個(gè)數(shù)得到第三個(gè)數(shù),卷積則是輸入兩個(gè)信號(hào)產(chǎn)生第三個(gè)信號(hào)。卷積被廣泛應(yīng)用于統(tǒng)計(jì)和概率中。在線性系統(tǒng)中,卷積描述的是輸入信號(hào),脈沖反應(yīng)和輸出信號(hào)三者之間的關(guān)系。
圖4
上圖描述的是卷積應(yīng)用于線性系統(tǒng)的示意圖。輸入信號(hào)x[n]進(jìn)入有脈沖反應(yīng)h[n]的線性系統(tǒng),產(chǎn)生輸出信號(hào)y[n]。用公式表示為:x[n]*h[n] = y[n]。
3.卷積運(yùn)算
卷積可以從輸入信號(hào)的角度理解:輸入信號(hào)的每一個(gè)采樣點(diǎn)是如何貢獻(xiàn)于多個(gè)輸出信號(hào)采樣點(diǎn),即每一個(gè)輸入信號(hào)分量進(jìn)入線性系統(tǒng)之后,都將產(chǎn)生多個(gè)平移和縮放版本的脈沖反應(yīng),輸出結(jié)果即為每個(gè)信號(hào)分量對(duì)應(yīng)的平移和縮放版的脈沖反應(yīng)進(jìn)行合成;從輸出信號(hào)的角度理解:每一個(gè)輸出信號(hào)的采樣點(diǎn)是如何從眾多輸入信號(hào)采樣點(diǎn)獲取信息。即對(duì)于每一個(gè)輸出信號(hào),都將由多個(gè)輸入信號(hào)貢獻(xiàn)其脈沖響應(yīng),輸出結(jié)果即為對(duì)應(yīng)脈沖響應(yīng)的線性加權(quán)。
這兩個(gè)理解只是對(duì)卷積運(yùn)算的不同角度的理解,其結(jié)果都是一樣的。
從輸入信號(hào)的角度理解
圖5
上圖是一個(gè)簡(jiǎn)單的卷積計(jì)算。輸入信號(hào)x[n]有九個(gè)點(diǎn),輸入一個(gè)有四個(gè)脈沖反應(yīng)h[n]的線性系統(tǒng)中,得到9+4-1輸出信號(hào)y[n]。用數(shù)學(xué)術(shù)語(yǔ)表示為:x[n]卷積h[n]輸出結(jié)果y[n]。以第一種角度理解卷積:分解輸入信號(hào),把輸入信號(hào)分量通過線性系統(tǒng),然后把每一個(gè)輸出分量進(jìn)行合成。在這個(gè)例子中,輸入信號(hào)的每一個(gè)采樣點(diǎn)都將產(chǎn)生一個(gè)平移和縮放版的脈沖反應(yīng),輸出信號(hào)即把這些平移和縮放版的脈沖反應(yīng)疊加生成最終的輸出信號(hào)y[n]。其具體的計(jì)算過程如下圖所示:
圖6
圖6:輸入信號(hào)中的每一個(gè)分量都將產(chǎn)生一個(gè)平移和縮放版的脈沖反應(yīng)。即用方形所表示的脈沖反應(yīng)結(jié)果。除了方形之外的所有點(diǎn)起數(shù)值均為0.
假設(shè)我們從輸入信號(hào)的第四個(gè)采樣點(diǎn)x[4]開始。這個(gè)采樣點(diǎn)的下標(biāo)為4,其值為1.4。當(dāng)輸入信號(hào)分解之后,這個(gè)采樣點(diǎn)可以用脈沖函數(shù)表示為:1.4 o[n-4]。經(jīng)過線性系統(tǒng)之后,該采樣點(diǎn)所對(duì)應(yīng)的輸出信號(hào)分量為1.4h[n-4]。如上圖中間位置圖像所示。注意到輸出信號(hào)分量脈沖反應(yīng)乘以1.4,并把采樣點(diǎn)右移到下表為四的采樣點(diǎn)。0-3,8-11各點(diǎn)數(shù)值均為0.
上圖中方塊形狀表示的即為平移和縮放的脈沖反應(yīng)數(shù)值,鉆石形狀的點(diǎn)其值為0.
當(dāng)輸入信號(hào)是四個(gè)采樣,經(jīng)過有九個(gè)點(diǎn)的脈沖反應(yīng)線性系統(tǒng),其輸出的結(jié)果與上圖所示的方法結(jié)果相同。
圖7
圖8
上述兩種計(jì)算方法結(jié)果相同,揭示了卷積的一個(gè)重要性質(zhì):卷積的交換律。即a[n]*b[n]=b[n]*a[n]。即卷積并不關(guān)心哪個(gè)信號(hào)是輸入信號(hào)哪個(gè)信號(hào)是脈沖反應(yīng)。
假設(shè)輸入信號(hào)為{1,2,3,4,1,2,3,4,5};脈沖反應(yīng)為:{2,3,1,4};則卷積計(jì)算過程相當(dāng)于如下所示,每一個(gè)輸入信號(hào)分量分解為單個(gè)脈沖函數(shù),經(jīng)過四個(gè)點(diǎn)的h[n]線性系統(tǒng)之后,其輸出結(jié)果即為h[n]+2*h[n-1]+3*h[n-2]+4*h[n-3]+ h[n-4]+2*h[n-1-5]+3*h[n-6]+4*h[n-7]+5h[n-8]。
圖9
圖10
從輸入信號(hào)角度理解卷積代碼示例:
#include《math.h》#include《stdio.h》#include《stdlib.h》 int main(){ int InputSignal[9] = {1,2,3,4,1,2,3,4,5}; int ImpulseCorres[4] = {2,3,1,4}; int OutPut[12] = {0}; int i,j; //input view for(i = 0;i 《 9;i++) { for(j = 0;j 《 4;j++) OutPut[i+j] = OutPut[i+j]+InputSignal[i]*ImpulseCorres[j]; } for(i = 0;i 《 12;i++) { printf(“%d ”,OutPut[i]); } return 0;}
從輸出信號(hào)的角度理解
從輸出信號(hào)角度理解卷積,分析的是每一個(gè)輸入信號(hào)的采樣點(diǎn)是如何影響眾多輸出信號(hào)的采樣點(diǎn)。而從輸出角度理解卷積,分析的是輸出信號(hào)的每一個(gè)采樣點(diǎn)是由哪些輸入信號(hào)影響的。這種方式對(duì)數(shù)學(xué)角度和實(shí)踐應(yīng)用角度理解卷積都相當(dāng)有作用。用公式表示即為:y[n]=其他變量的組合。換句話說,輸出信號(hào)采樣點(diǎn)n等于眾多輸入信號(hào)和脈沖反應(yīng)的線性組合。
從如圖6可以看出,單個(gè)輸出信號(hào)是如何受到眾多輸入型號(hào)的影響的。假設(shè)我們以y[6]為例,在圖6中找到在n=6的位置,九個(gè)輸入信號(hào)中有哪些數(shù)值為非零的采樣點(diǎn)作用于該位置。由圖可以看出五個(gè)輸入信號(hào)在n = 6的位置其數(shù)值為0,只有四格輸入信號(hào)作用于n = 6的時(shí)候其數(shù)值不為零。分別是x[3],x[4],x[5],x[6]。y[6]的最終結(jié)果即為這四個(gè)輸入信號(hào)作用單獨(dú)作用于線性系統(tǒng)的后輸出信號(hào)分量之和。即y[6] = x[3]*h[3]+x[4]*h[2]+x[5]*h[1]+x[6]*h[0]。
圖11,從輸出信號(hào)角度理解卷積,其相當(dāng)于一個(gè)卷積機(jī)器。如圖所示,假設(shè)輸入信號(hào)x[n],輸出信號(hào)y[n], 虛線方框里表示的是卷積機(jī)器,可以從左到右從右到左自由移動(dòng)。卷積機(jī)器放置的位置應(yīng)該與我們需要求得輸出信號(hào)采樣點(diǎn)對(duì)其,輸入信號(hào)的四個(gè)采樣點(diǎn)進(jìn)入到卷積機(jī)器,四個(gè)采樣點(diǎn)的數(shù)字分別于其對(duì)應(yīng)的脈沖反應(yīng)相乘,再把其乘積相加。例如為了計(jì)算y[6],需要把x[3],x[4],x[5],x[6]四個(gè)輸入信號(hào)輸送到卷積機(jī)器。相應(yīng)的,為了計(jì)算y[7],卷積機(jī)器必須右移一位到采樣點(diǎn)7的位置,這樣,進(jìn)入到卷積的四個(gè)信號(hào)分別是x[4],x[5],x[6], x[7],如此循環(huán)直到所有輸出信號(hào)分量被計(jì)算完成。
圖11
卷積機(jī)器中脈沖反應(yīng)排列順序是相當(dāng)重要的。卷積機(jī)器中的脈沖反應(yīng)與原始的脈沖反應(yīng)做了一個(gè)鏡像的翻轉(zhuǎn)。為什么需要翻轉(zhuǎn)呢?
即假設(shè)我們計(jì)算y[4]的輸出結(jié)果,由上圖可知y[4] = x[4]*h[0]+x[3]*h[1]+x[2]*h[2]+x[1]*h[3]+x[0]*h[4]。即當(dāng)前輸入信號(hào)點(diǎn)輸入到線性系統(tǒng)對(duì)應(yīng)的輸出結(jié)果是當(dāng)前信號(hào)和之前各個(gè)信號(hào)對(duì)當(dāng)前點(diǎn)的脈沖反應(yīng)的一個(gè)線性加權(quán)。如公式所述,為了計(jì)算y[4]的結(jié)果,我們必須把輸入x[0],x[1],x[2],x[3],x[4]作用在n = 4的位置的脈沖響應(yīng)進(jìn)行線性加權(quán)。也就是說,當(dāng)x[0]進(jìn)入系統(tǒng)的時(shí)候,在n = 4的位置對(duì)應(yīng)的脈沖反應(yīng)為h[4],其輸出為x[0]*h[4],當(dāng)x[1]進(jìn)入系統(tǒng)后,在n = 4的位置對(duì)應(yīng)的脈沖反應(yīng)為h[3],其輸出結(jié)果為x[1]*h[3]以此類推。由此可以看出,輸出信號(hào)的每一個(gè)分量都是有收到輸入信號(hào)影響的權(quán)重線性組合,其權(quán)重恰好是脈沖反應(yīng)的鏡像翻轉(zhuǎn)對(duì)應(yīng)的權(quán)重值。這也就是為什么卷積公式中需要把輸入信號(hào)進(jìn)行翻轉(zhuǎn)在進(jìn)行線性疊加的原因。
假設(shè)有N個(gè)點(diǎn)的輸入信號(hào)x[n],采樣點(diǎn)從0-N-1,有M個(gè)點(diǎn),脈沖反應(yīng)為h[n]的線性系統(tǒng),信號(hào)點(diǎn)從0-M-1。則這兩個(gè)信號(hào)的卷積將輸出有N+M-1個(gè)采樣點(diǎn)的信號(hào),下標(biāo)從0-N+M-2。用公式表示為:
從輸出信號(hào)角度理解卷積代碼示例:
#include《math.h》#include《stdio.h》#include《stdlib.h》 int main(){ int InputSignal[9] = {1,2,3,4,1,2,3,4,5}; int ImpulseCorres[4] = {2,3,1,4}; int OutPut[12] = {0}; int i,j; //output view for(i = 0;i 《 12;i++) { OutPut[i] = 0; for(j = 0; j 《 4;j++) { if((i-j)《0) continue; if((i-j)》8) continue; OutPut[i] += ImpulseCorres[j]*InputSignal[i-j]; } } for(i = 0;i 《 12;i++) { printf(“%d ”,OutPut[i]); } return 0; }
4.圖像中的卷積
假設(shè)二維函數(shù)I和H,對(duì)應(yīng)的卷積操作可以表示為:
也可以表示為:
應(yīng)用于圖像領(lǐng)域時(shí),其卷積公式也可以表示為:
當(dāng)濾波函數(shù)H*(I,j) = H(-I,-j)進(jìn),H(I,j)進(jìn)行了180度旋轉(zhuǎn)之后,其結(jié)果與線性濾波時(shí)一樣的。
圖像中的線性濾波可以表示為:
其原理為:
由兩者的公式可以看出,線性濾波其實(shí)是把濾波函數(shù)進(jìn)行180度旋轉(zhuǎn)之后進(jìn)行卷積的結(jié)果。
以待吧!
編輯:lyn
-
數(shù)字信號(hào)處理
+關(guān)注
關(guān)注
16文章
567瀏覽量
46761 -
卷積
+關(guān)注
關(guān)注
0文章
95瀏覽量
18762
原文標(biāo)題:數(shù)字信號(hào)處理之卷積
文章出處:【微信號(hào):leezym0317,微信公眾號(hào):FPGA開源工作室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
數(shù)字信號(hào)處理的基本組成及其特點(diǎn)?

評(píng)論