- 信號與系統:基于MATLAB的方法
- 譚鴿偉 馮桂 黃公彝 胡朝煒編著
- 2901字
- 2019-07-01 11:12:00
0.4 MATLAB軟件介紹
MATLAB是MathWorks公司于1982年推出的一套高性能的數值計算和可視化軟件。它集數值分析、矩陣運算、信號處理和圖形顯示于一體,構成了一個方便且界面良好的用戶環境。它還包括了Toolbox(工具箱)的各類問題的求解工具,可用來求解特定學科的問題。其有如下特點。
(1)可擴展性:MATLAB最重要的特點是易于擴展,它允許用戶自行建立指定功能的M文件。對于一個從事特定領域的工程師來說,不僅可利用MATLAB所提供的函數及基本工具箱函數,還可方便地構造出專用的函數,從而大大擴展了其應用范圍。
(2)易學易用性:MATLAB不需要用戶有高深的數學知識和程序設計能力,不需要用戶深刻了解算法及編程技巧。
(3)高效性:MATLAB語句功能十分強大,一條語句可完成十分復雜的任務。如fft語句可完成對指定數據的快速傅里葉變換,這相當于上百條C語言語句的功能。它大大加快了工程技術人員從事軟件開發的效率。
MATLAB核心模塊提供了基本的數學算法,例如矩陣運算、數值分析算法。MATLAB集成了2D和3D圖形功能,以完成相應數值可視化的工作,并且它提供了一種交互式的高級編程語言––M語言,利用M語言可以通過編寫腳本或者函數文件實現用戶自己的算法。
MATLAB的桌面應用程序開發工具是以MATLAB Compiler為核心的一組編譯工具。MATLAB Compiler能夠將那些利用MATLAB提供的編程語言––M語言編寫的函數文件編譯生成為函數庫或者可執行文件。
下面介紹MATLAB的數值計算和符號計算。
0.4.1 數值計算
用MATLAB語言,可以很方便地進行數值計算,其特點是將數值型輸入數據通過數學運算變換成所需要的數值型數據輸出。
1.數學運算
在MATLAB中有部分函數可以用來進行基本的數學運算,主要有如下函數:三角函數(見表0-1)、指數運算函數(見表0-2)、復數運算函數(見表0-3)、取整和求余函數(見表0-4)。需要注意的是,這些函數的參數可以是矩陣,也可以是向量或者多維數組,函數在處理參數時,都是按照數組運算的規則來進行的。表0-5是用于矩陣(數組)操作的常用函數。
表0-1 三角函數

表0-2 指數運算函數

表0-3 復數運算函數

表0-4 取整和求余函數

表0-5 用于矩陣(數組)操作的常用函數

2.用MATLAB產生信號
在MATLAB中,可通過創建向量或矩陣的形式,產生數值型信號。下面舉例說明。
【例0-1】利用MATLAB產生信號x(t)=cos(10πt),y(t)=sin(10πt2),分別畫出信號的波形,并在一張圖上比較這兩個信號的波形。
解:通過創建向量來產生一維信號,代碼如下:

運行結果如圖0-7所示。

圖0-7 例0-1信號的波形
【例0-2】利用MATLAB產生信號x1(t)=2e3|t|,x2(t)=2e–3|t|,x3(t)=sin(6πt)+cos(10πt),x4(t)=|t|cos(10πt),分別畫出信號的波形。
解:先創建時間向量,再利用MATLAB基本函數定義所需要的信號,并用subplot把四個函數繪制在一張圖上,代碼如下
t=-1:0.01:1; %定義從-1到1,間隔為0.01的時間向量 f1=2*exp(3*abs(t)); %定義函數f1 subplot(2,2,1) %畫第1個子圖 plot(t,f1) %畫f1的連續圖 xlabel('t(sec)') %X軸標記 ylabel('f1') %Y軸標記 title('2exp(3|t|)'); %給函數命名 grid; %圖形上加網格 subplot(2,2,2) f2=2*exp(-abs(3*t)); %定義函數f2 plot(t,f2) xlabel('t(sec)');ylabel('f2') title('2exp(-3|t|)'); grid f3=sin(6*pi*t)+cos(10*pi*t); subplot(2,2,3) plot(t,f3) xlabel('t(sec)');ylabel('f4') title('sin(6*pi*t)+cos(10*pi*t)');grid f4=abs(t).*cos(10*pi*t); subplot(2,2,4) plot(t,f4) xlabel('t(sec)');ylabel('f3') title('|t|cos(10*pi*t)');grid
運行結果如圖0-8所示。

圖0-8 例0-2信號的波形
除了利用MATLAB的基本函數產生信號外,還可以利用function函數定義所需的任意信號。
【例0-3】利用MATLAB產生信號f(t)=te–cost/(1+t2)。
解:利用function函數定義所需信號,代碼如下:
function y=f(t) y=t*exp(-cos(t))/(1+t^2);
這部分代碼放在一個單獨的M文件中,文件名為f.m,注意文件名一定要和函數名一樣。其他M文件調用該函數時執行下面這段代碼。
t=0:0.1:50; %創建一個輸入向量t N=length(t); %查找向量t的長度,即向量t所包含的元素個數 y=zeros(1,N); %將輸出向量初始化為0 for n=1:N, %當變量n從1變化到N,計算y(n) y(n)=f(t(n)); %調用上面定義的函數f end figure plot(t,y) grid %在圖形上加網格 title('Function f(t)') xlabel('t') ylabel('y')
運行結果如圖0-9所示。

圖0-9 例0-3自定義信號的波形
3.存儲和加載數據
MAT文件是MATLAB獨有的文件格式,提供了跨平臺的數據交換能力,也是MATLAB用戶最常用的數據文件格式。在MATLAB中,可以將當前工作空間中的變量保存成MAT文件,也可以將MAT文件中的數據導入到MATLAB的工作空間中,這兩個過程分別使用save函數和load函數就可以完成。
save函數能夠將當前工作空間中的變量保存到指定的數據文件中。例如:
x=0:3:360; %創建一個從0°到360°,間隔為3°的輸入向量x y=sin(x*pi/180); %將輸入向量轉換為弧度,取正弦得到向量y xy=[x'y']; %定義向量xy,向量有2列,一列為x,另一列為y save sine.mat xy %將向量xy保存在sine.mat文件中
load函數將數據文件的數據導入到MATLAB的工作空間,例如,要加載上面存儲的數據,可用下面的代碼
clear all load sine whos
運行結果為
Name Size Bytes Class Attributes xy 121x2 1936 double
由whos函數可知:存儲的數據塊包括242個元素,1936字節。
加載火車的聲音信號:
clear all load train sound(y,Fs) plot(y)
運行結果:可聽到火車開動的聲音,顯示的聲音信號的波形如圖0-10所示。
加載圖像信號:
clear all load woman whos colormap('gray') imagesc(X)
運行結果為:
Name Size Bytes Class Attributes X 256x256 524288 double map 255x3 6120 double
顯示的圖像如圖0-11所示。

圖0-10 火車聲音信號的波形

圖0-11 圖像信號
0.4.2 符號計算
符號計算是利用MATLAB的符號數學工具Symbolic Math Toolbox定義函數,這樣就能把對函數進行的代數或微積分運算的結果直接用變量來表示,而不是用數值型的數據來表示。這為用MATLAB對信號進行傅里葉分析和拉普拉斯分析提供了方便。
1.導數和差分
在計算連續信號的導數時,先利用MATLAB的符號數學工具Symbolic Math Toolbox定義函數,然后再對所定義的函數求導。
【例0-4】用MATLAB計算信號y=sint2的導數,并畫出該連續信號及其導數的波形。
解:先用syms定義符號變量,然后再定義需要求導的函數(它是符號變量的函數),接著對所定義的函數求導,最后繪制圖形。代碼如下:
syms t y z %定義符號變量 y=sin(t^2) %定義信號y. 注意:由于t不是向量,所以在^前面沒有 z=diff(y) %對y求導 figure(1) %對仿真圖編號 subplot(211) ezplot(y,[0,2*pi]); %對0~2*pi范圍的信號y作圖 grid hold on subplot(212) ezplot(z,[0,2*pi]); grid
運行結果如圖0-12所示。

圖0-12 連續信號及其導數的波形
【例0-5】用MATLAB計算離散信號y=sink2的差分,并畫出該離散信號及其差分信號的波形。
解:離散信號的差分采用數值計算方法,代碼如下:
Ts=0.1; %定義采樣間隔 t1=0:Ts:2*pi; %定義采樣時間 y1=sin(t1.^2); %定義離散信號y1,注意與上例y的不同 z1=diff(y1)./diff(t1); %求y1的差分--導數的近似 figure(2) %對仿真圖編號 subplot(211) stem(t1,y1,'r'); axis([0 2*pi 1.1*min(y1)1.1*max(y1)]) subplot(212) stem(t1(1:length(y1)-1),z1,'r'); axis([0 2*pi 1.1*min(z1)1.1*max(z1)]) legend('Derivative(black'),'Difference(blue)'); hold off
運行結果如圖0-13所示。

圖0-13 離散信號及其差分的波形
2.連續信號的積分
在MATLAB里,連續信號的積分采用符號計算,而離散信號的累加采用數值計算。下面舉例說明。
【例0-6】用MATLAB計算直線信號y=t的積分,并畫出該直線及其積分信號的波形。
解:先用符號計算求連續信號y=t的積分,再繪制其曲線。代碼如下:
clf;clear all %符號計算 syms t z s for k=1:20, z = int(t,t,0,k); %用符號函數定義t從0到k的積分 zz(k)=subs(z); %把每一個積分值用數值型向量zz保存 end %數值計算 t1=linspace(-4,4); %定義[-4,4]區間的100個等間距點 y=t1; n=1:20; subplot(211) plot(t1,y);grid; axis([0 4 0 1.1*max(y)]); title('y(t)=t'); xlabel('t') subplot(212) stem(n(1:20),zz(1:20));hold on plot(n(1:20),zz(1:20),'r');grid; title('信號t的積分'); xlabel('k') hold off
運行結果如圖0-14所示。

圖0-14 直線信號的積分的計算
圖0-14顯示的是線性函數y=t及其積分的值,即

【例0-7】用MATLAB計算f(t)=[sinc(t)]2的積分,并畫出f(t)及其積分信號的波形。
解:采用符號計算求連續信號y=[sinc(t)]2的積分,再繪制其曲線。代碼如下:
clear all syms t z s for k=1:10 z=int(sinc(t)^2,t,0,k); %用符號函數定義sinc(t)的平方從0到k的積分 zz(k)=subs(2*z); %把每個積分值用向量zz保存 end subplot(211) ezplot(sinc(t)^2,[-3,3,-0.1,1.1]) grid subplot(212) n=1:10; stem(n(1:10),zz(1:10)); hold on plot(n(1:10),zz(1:10),'r'); grid; title('數值積分Ry(t)'); xlabel('k') hold off
運行結果如圖0-15所示。它顯示了y=[sinc(t)]2及其積分的值,即


圖0-15 連續信號[sin(t)]2的積分的計算
這部分關于MATLAB的介紹為讀者提供了理解MATLAB基本操作的必要背景,為初學者進一步學習奠定了基礎。在MATLAB里,獲取信息的最佳來源是help命令。通過學習和應用,讀者會發現MATLAB是進行運算和科學研究的強大工具。