matlab實現訊號與系統中卷積的計算的兩種方法
卷積計算
前言
用matlab也可以實現的卷積計算操作,主要有兩種方法,第一種直接用符號運算,第二種就是用數值運算。
一、卷積是什麼?
卷積積分是訊號與系統時域分析中的重要方法之一。連續訊號的卷積積分定義如下:
MATLAB進行卷積計算可以通過符號運算方法和數值計算方法來實現。
符號運算求解主要是從卷積積分的定義出發,採用積分公式直接計算,此時要注意積分變數和積分限的選取。
數值計算方法是通過時間間隔取足夠小的離散時間訊號的來實現的。可呼叫MATLAB中的conv()函式近似地數值求解連續訊號的卷積積分。如果對連續時間訊號和進行等時間間隔均勻抽樣,則連續訊號變為離放序列。當取樣間隔夠小時,即為連續時間訊號和。因此連續時間訊號的卷積積分運算轉換為
採用數值計演算法,只求當t=n▲的卷積積分的值,n為整數,即
實際上就是離散序列和的卷積和。當▲足夠小時,上式就是卷積積分的結果,即對連續時間訊號的較好數值近似
當取樣間隔足夠夠小時,有
通過 MATLAB實現連續訊號和的卷積,可以利用各自抽樣後的離散時間序列的卷積再乘上抽樣間隔。抽樣間隔越小,誤差也就越小。
二、計算方法
1.符號運算
其中用heaviside(t)表示階躍函式,subs()是符號計算函式,表示將符號表達式中的某些符號變數替換為指定的新的變數,再進行積分操作,類似我們用圖示法求解卷積的過程。
syms tao; t=sym('t','positive'); %t是限定符號變數 xt1=str2sym('heaviside(t)-heaviside(t-2)'); xt2=str2sym('heaviside(t)-heaviside(t-3)+heaviside(t-1)-heaviside(t-2)'); xt_tao=subs(xt1,t,tao)*subs(xt2,t,t-tao); yt=int(xt_tao,tao,0,t); yt=simplify(yt) ezplot(yt,[0,10]),grid on title('符號運演算法求解卷積');
2.數值運算
conv函式用於多項式乘法計算和矩陣卷積,用在離散訊號相乘結果比較合適,然後再進行一些細節上的操作和繪圖。
最後一個是階躍函式的封裝,matlab中的表示為
y=(t>0)
dt=0.001;t1=-0.5:dt:3.5; f1=uCT(t1)-uCT(t1-2); t2=t1; f2=uCT(t2)+uCT(t2-1)-uCT(t2-2)-uCT(t2-3); [t,f]=ctsconv(f1,f2,t1,t2,dt); function[f,t]=ctsconv(f1,f2,t1,t2,dt) f=conv(f1,f2); f=f*dt; ts=min(t1)+min(t2); te=max(t1)+max(t2); t=ts:dt:te; subplot(221) plot(t1,f1);grid on; axis([min(t1),max(t1),min(f1)-abs(min(f1)*0.2),max(f1)+abs(max(f1)*0.2)]) title('f1(t)');xlabel('t') subplot(222) plot(t2,f2);grid on; axis([min(t2),max(t2),min(f2)-abs(min(f2)*0.2),max(f2)+abs(max(f2)*0.2)]) title('f2(t)');xlabel('t') subplot(212) plot(t,f);grid on; axis([min(t),max(t),min(f)-abs(min(f)*0.2),max(f)+abs(max(f)*0.2)]) title('f(t)-f1(t)*f2(t)');xlable('t') function f=uCT(t) f=(t>0); end
遇到的一些問題和解決方法
1.sym還是str2sym
在吧heaviside表示為階躍函式的符號定義中採用的sym在matlab版本中報錯,修改為strtosym可以正常執行。
2,Heaviside還是heaviside
根據報錯資訊,修改為小寫即可。
一些總結
採用了兩種方法來計算卷積,第一種是比較直觀的符號計演算法,採用sym定義符號變數,得到要計算的兩個函式符號表示,其中階躍函式採用heaviside來進行表示,然後再利用subs操作換元,進而進行積分計算,簡化後得到最終結果,ezplot繪圖。第二種是更難理解的數值計算方法。巧妙利用了conv函式近似數值求解連續訊號的積分。