1. 引言
針對特定的研究目標相應的MATLAB程序中存在大量的重復模塊,為了提高工作效率和程序的復用性,將本人經常使用的MATLAB程序模塊重組設計成繪圖輔助工具箱。
2. 功能簡介
3. 標準參數對話框
3.1 問題描述
MATLAB除了數值計算代碼的編寫,我們往往修改輸入參數,作為研究變量。如果直接在代碼腳本中修改有兩個問題:
- 修改不便,必須進入代碼內部,找出相關變量;
- 不熟悉程序的人有可能將程序修改錯誤,得到錯誤的結果。
解決這一問題的一種方案是:采用參數對話框輸入。但是,MATLAB自帶的inputdlg
函數功能有限,調用較為麻煩,因此在此基礎上訂制開發了paradlg
。
3.2 功能要點
該函數的功能要點為:
- 創建標準化對話框
- 支持多種數據格式:標量、向量、字符串,自動判別
- 記憶上次輸入參數
函數說明如下:
function para = paradlg(prompt0,dlg0,isShow)
% 題目:標準化對話框創建程序
% 輸入:
% prompt0 -- 提示語以及默認參數,n*2
% dlg0 -- 可選定制化參數
% .width -- 對話框寬度
% .title -- 標題
% .save -- data_dlg后綴名
% isShow -- 是否彈出對話框,
% 輸出:
% para -- 對話框輸入參數,默認彈出,若isShow=0,則不彈出,數值取上次默認值
% 功能:
% 創建標準化參數輸入對話框
% 支持 標量、向量、字符串
% 導出輸入參數
% 記憶上次輸入
3.3 基本調用方法
構造
prompt0
數據,第一列為輸入提示,第二列為默認參數;支持三類數據輸入,標量、向量、字符串;
調用
paradlg
函數,返回輸入的數據集para
;將
para
中的元素依次賦值給目標的變量f_center,filename_pub,dt,f_range
;調用代碼示例
prompt0 = { % 對話框參數
'發射信號中心頻率(kHz)', 100
'發射信號中心頻率(kHz)','B1_C1_F'
'采樣周期dt (e-9 s)',16
'繪圖頻譜范圍(kHz)',[0 20]
};
para = paradlg(prompt0);
f_center = para{1}; % 發射信號中心頻率(kHz)
filename_pub = para{2}; % 輸出報告文件名
dt = para{3}; % 采樣周期
f_range =para{4};
-
對話框
paradlg.jpg-25.5kB - 參數讀取結果
para =
[ 100]
'B1_C1_F'
[ 16]
[1x2 double]
3.4 高級調用功能
如需控制對話框的寬度、標題,則在函數paradlg
中輸入第二個變量dlg0
。
% dlg0.width -- 對話框寬度
% dlg0.title -- 對話框標題
% dlg0.save -- data_dlg后綴名
- 調用代碼
prompt0 = { % 對話框參數
'發射信號中心頻率(kHz)', []
'發射信號中心頻率(kHz)','B1_C1_F'
'采樣周期dt (e-9 s)',16
'繪圖頻譜范圍(kHz)',[0 20]
};
dlg0.width = 100;
dlg0.title = '信號譜分析參數輸入';
dlg0.save = 'freqpara';
para = tools.paradlg(prompt0,dlg0);
f_center = para{1}; % 發射信號中心頻率(kHz)
filename_pub = para{2}; % 輸出報告文件名
dt = para{3}; % 采樣周期
f_range =para{4};
-
對話框效果
mark
對于同一個程序,如果多次參數沒有改變,可以讓對話框不彈出:
para = tools.paradlg(prompt0,dlg0,0);
在不彈出對話框的情況下,直接載入上次設定的參數。
4. 文件讀取模塊
筆者自定義的文件讀取模塊,通過對系統默認函數改造得到,主要的改進是增加了路徑記憶。
4.1 文件路徑讀取
函數說明
function [dir_name] = getdir()
% 題目:獲取文件夾名稱
% 輸出:
% dir_name -- 文件夾路徑
運行示例
- 運行函數
mydir = tools.getdir;
-
對話框
mark - 獲取路徑
mydir =
D:\Coding\matlab\1701_tools
系統默認函數為:uigetdir
。
4.2 獲取完整文件名
函數說明
function [fullname,pathname,filename] = getfile(type,ext)
% 題目:讀取文件全名、路徑、文件名
% 輸入:
% type -- 類型標識
% 輸出:
% fullname -- 全名
% pathname -- 路徑
% filename -- 文件名
運行示例
- 運行函數
[fullname,pathname,filename] = tools.getfile;
- 選取文件
- 獲取文件名與完整路徑
fullname =
D:\Projects\1610-高頻導波損傷監測\04.MATLAB\GUIGUW\g001.m
pathname =
D:\Projects\1610-高頻導波損傷監測\04.MATLAB\GUIGUW\
filename =
g001.m
4.3 讀取CSV數據文件
函數說明
function [data,para0] = getcsv(flag)
% 題目: 示波器輸出csv數據標準讀取
% 輸入:
% flag -- flag==1,則彈出對話框,否則默認標準參數
% R0 -- 讀取信號數據起始行數
% R1、C1 -- 特定單元格的位置參數
% 輸出:
% data -- 信號數據
% para0 -- 特定單元格參數
% 功能:
% 從R0行開始讀取信號數據,直到末尾
% 讀取(R1,C1)單元格的參數
CSV數據說明
本程序特定針對DPO2024儀器輸出的CSV信號數據,其格式為:
Model,DPO2024
Firmware Version,1.25
Point Format,Y,
Horizontal Units,S,
Horizontal Scale,0.0001,
Sample Interval,8e-09,
Filter Frequency,2e+08,
Record Length,125000,
Gating,0.0% to 100.0%,0.0% to 100.0%
Probe Attenuation,10,10
Vertical Units,V,V
Vertical Offset,0,0
Vertical Scale,20,1
Label,,
TIME,CH1,CH2
-1.28000e-04,-0.45,0.0198438
-1.27992e-04,-0.4,0.02
-1.27984e-04,-0.4,0.025
-1.27976e-04,-0.5,0.0151562
...
CSV數據在Excel中打開的視圖如下:
數據讀取的要點在于:
- 需要跳過文件頭的說明信息,以矩陣形式讀取序列數據
- 需要讀取特定單元格的參數,如Sample Interval
運行示例
- 運行代碼
[data,para0] = tools.getcsv();
-
參數輸入
如上所示,有效數據序列從17行開始;要讀取7行2列的Sample Interval數據,在對話框輸入7 2。
mark -
數據結果
mark - 不彈出參數對話框運行
第一次設置好讀取參數后,后續不需要重復設置,即可記憶以前的設定及文件路徑。
[data,para0] = tools.getcsv(0);
4.4 讀取TXT數據文件
函數說明
function data = gettxt(nrow_start)
% 題目: 讀取txt數據文件,跳躍文件頭說明行
% 輸入:
% nrow_start -- 起始行
% 輸出:
% data -- 信號數據
數據格式
一般儀器輸出的數據為CSV、raw等格式,而數值模擬輸出的數據往往是標準的txt格式。
運行示例
- 直接讀取數據
data = gettxt()
- 跳過10行讀取數據
data = gettxt(10)
-
對話框
mark
``gettxt`函數尚存一些問題,曾經發生讀數出錯,如果無法正常使用,可以采用以下方法;
filename = tools.getfile();
data = load(filename);
4.5 讀取mat文件
函數說明
function data = getmat()
% 題目:讀取只有一個變量的矩陣數據mat文件
數據格式
.mat是MATLAB默認的數據格式,一般直接通過命令導入即可,但如果以下面的方式導入:
data = load('matlab.mat')
讀入的數據會形成一個結構體,不便后續操作。本函數通過數據格式轉換,保證讀取的數據依然為矩陣形式。
運行示例
- 命令
data = tools.getmat;
-
對話框
mark -
結果
mark
5. 繪圖輔助
5.1 坐標軸與標題便捷標注
函數說明
function xyt(str_xyt)
% 題目:生成xlabel,ylabel,title
運行示例
- 繪制典型sine圖像
figure
tools.plot0; % 繪制一個基本的sine
- 添加坐標軸及標題標注
tools.xyt({'時間 s','位移 mm','A typical sine wave'}) % 圖像標注
以上代碼相當于:
xlabel('時間 s')
ylabel('位移 mm')
title('A typical sine wave')
grid on
set(gcf,'color','white')
代碼的集成效率大大提高。
5.2 圖像刷白
函數功能
MATLAB默認繪圖的圖像有灰色底色,如:
本函數的功能是figure底色改為白色,便于截圖處理。
function white()
% 題目:圖像刷白
set(gcf,'color','white');
grid on;
end % white
運行示例
- 調用代碼
figure
tools.plot0;
tools.white;
-
運行效果
mark
5.3 圖像中貫通直線繪制
函數說明
function xline(position,lineSpec)
% 題目:輸入MATLAB默認顏色向量
% 輸入:
% position -- [x y],[1 0]在x=1處繪制豎線,[0 1]在y=1處繪制橫線
% lineSpec -- 'r-*'
% 輸出:輔助直線
% 示例:
% xline([0 6],'r-')
問題描述
這是一個沒有難度,但經常出現的問題。
在MATLAB繪圖中,除了基本的數據繪圖,我們往往需要繪制輔助性直線。
MATLAB中繪制這樣的直線很簡單,只需確定兩個點即可。但是要確定貫通方向的坐標范圍,較為繁瑣,還需要根據主體數據進行調整。
運行示例
- 測試代碼
figure
tools.plot0;
tools.xline([pi/2,0],'r--') % 豎向直線
tools.xline([0,sin(pi/4)],'m-.') % 橫向直線
-
繪圖效果
mark
這一函數的不足之處在于,沒有顯示出直線所在的坐標刻度。
5.4 網格線增加繪制
函數說明
網格線增加繪制函數有兩個:
- xGrid
- yGrid
function xGrid(x0,angle)
% 題目:圖中增加x網格線
% 時間:2017.01.08
運行示例
- 測試代碼
figure
tools.plot0;
tools.xGrid(pi/2,45)
tools.yGrid(sin(pi/4))
-
運行效果
mark
當坐標軸標簽密集,顯示不清楚,可以調整標簽的角度。
5.5 當前圖像保存為圖片文件
函數說明
function saveGraph()
% 題目:保存gcf圖像
% 功能:
% 自定義圖片格式
% 自定義圖片文件名編號
% 時間:2017.01.05
運行示例
- 基本圖像繪制
figure
tools.plot0;
-
圖像保存對話框
此處可以輸入文件名,批量存儲圖片,可以設置固定的前綴和后綴,以便查閱。
mark -
批量存儲圖片效果
mark
快捷使用技巧
本函數僅支持存儲當前figure中的圖像,gcf。
此函數需要經常調用,可以設置為快捷方式
-
添加快捷方式
mark -
編輯代碼
mark -
點擊快捷方式
mark
5.6 默認顏色序列
函數說明
運行示例
5.7 典型快捷繪圖
函數說明
運行示例
6. 數據操作
6.1 數字與字符串序列粘貼
函數說明
function str_x = paste(x,prefix,suffix)
% 題目:對數值序列粘貼前后綴,構成字符串
% 輸入:
% x -- 數值序列
% prefix -- 前綴
% suffix -- 后綴
% 輸出:
% str_x -- 合并后字符串
% 作者: 馬騁
% 2016.04.17 @HIT
運行示例
- 測試代碼
x = [1:10]';
str = tools.paste(x,'通道','原始信號');
- 運行效果
str =
'通道1原始信號'
'通道2原始信號'
'通道3原始信號'
'通道4原始信號'
'通道5原始信號'
'通道6原始信號'
'通道7原始信號'
'通道8原始信號'
'通道9原始信號'
'通道10原始信號'
這一功能主要用于多組數據繪圖的legend字符串構造。
6.2 向量數值區間確定
函數說明
function rg = range(data)
% 題目:給出一個向量/矩陣的數值范圍
本函數結合了max和min函數,主要用于繪圖的坐標限確定。
運行示例
- 測試代碼
x = 1:10;
x_range = tools.range(x)
- 運行效果
x_range =
1
10
6.3 行形式的數據轉換列矩陣
函數說明
function mat = row2mat(row)
% 題目:將行向量或者行向量組成的矩陣轉換為列向量形式
% 時間:2017.01.11
此函數用于矩陣形式的標準化,避免大量數據處理中矩陣維度不匹配的情況。
運行示例
- 調用代碼
a = rand(2,4)
a2 = tools.row2mat(a)
- 運行結果
a =
0.6787 0.7431 0.6555 0.7060
0.7577 0.3922 0.1712 0.0318
a2 =
0.6787 0.7577
0.7431 0.3922
0.6555 0.1712
0.7060 0.0318
6.4 復數矩陣的歸一化
函數說明
此函數用于信號處理中,復數結果的歸一化計算。
function xNorm = norm(x)
% 題目:復數向量歸一化
% 輸入:
% x -- 復數向量
% 輸出:
% xNorm -- 歸一化后的向量
% 作者: 馬騁
% 2016.04.17 @HIT
運行示例
- 測試代碼
a = 2*rand(2,4)+rand(2,4)*i
a_norm= tools.norm(a);
a_norm_abs = abs(a_norm)
- 運行效果
a =
1.1376 + 0.1656i 0.0238 + 0.2630i 0.3244 + 0.6892i 0.6224 + 0.4505i
0.9388 + 0.6020i 0.6742 + 0.6541i 1.5886 + 0.7482i 1.0571 + 0.0838i
a_norm =
0.9896 - 0.1441i 0.5346 - 0.3428i
0.0207 - 0.2287i 0.3840 - 0.3725i
0.2821 - 0.5995i 0.9047 - 0.4261i
0.5414 - 0.3919i 0.6020 - 0.0477i
a_norm_abs =
1.0000 0.6351
0.2297 0.5350
0.6626 1.0000
0.6684 0.6039
注意,歸一化以列向量為單位。
7. 信號處理
7.1 信號去趨勢
函數說明
function data = clean(data0,tol)
% 題目:信號去除環境噪聲(矩陣運算)
% 功能:去趨勢項,對閾值一下的信號歸零
% 輸入:
% data0 -- 原始激勵信號
% tol -- 閾值
運行示例
- 測試代碼
M = tools.getcsv(0); % 讀取csv文件
s = M(:,3); % 提取典型信號
s2 = tools.clean(s); % 信號去除環境噪聲
figure
plot(s),hold on
plot(s2)
legend({'原始信號','去趨勢信號'})
grid on
-
運行效果
mark
7.2 低通濾波器設計
此處簡要介紹,低通濾波器設計的詳細說明見:
函數說明
function y=lowp(x,para,isFreqz)
% 題目: 低通濾波器
% 輸入:
% x -- 原始信號序列
% para.
% f1 -- 通帶截止頻率
% f3 -- 阻帶截止頻率
% rp -- 邊帶區衰減DB數設置
% rs -- 截止區衰減DB數設置
% fs -- 序列x的采樣頻率
% type-- 濾波器類型
% isFreqz -- 是否繪制濾波器曲線
% 輸出:
% y -- 濾波后的信號
% 功能:
% 低通濾波,濾除高頻噪音
% Cheby1
% Butterworth
% 注意:
% 通帶或阻帶的截止頻率的選取范圍是不能超過采樣率的一半
% f1,f3的值都要小于fs/2
% rp=0.1;rs=30;%通帶邊衰減DB值和阻帶邊衰減DB值
運行示例
- 測試代碼
[M,dt] = tools.getcsv(0); % 讀取csv文件
s = M(:,3); % 提取典型信號
% 參數對話框
prompt0 = {
'低通濾波 fp-fs kHz', [500 700]
'低通濾波 Rp',0.1
'是否顯示濾波器頻譜',1
};
dlg0.save = 'myfilter';
para0 = tools.paradlg(prompt0,dlg0); % 對話框參數
para_lp.f1 = para0{1}(1)*1e3; % 濾波器 fp
para_lp.f3 = para0{1}(2)*1e3; % 濾波器 fs
para_lp.rp = para0{2}; % 濾波器 rp
para_lp.rs = 30; % 濾波器 rs
para_lp.fs = 1/dt; % 信號采樣頻率
para_lp.type = 1; % 濾波器類型:切比雪夫-1
flag = para0{3}; % 是否繪制濾波器頻域曲線
s_lp = tools.lowp(s,para_lp,flag); % 輸入信號-濾波
figure % 濾波前后對比
plot(s),hold on
plot(s_lp)
legend({'原始信號','濾波后信號'})
tools.white;
-
濾波參數對話框
mark -
濾波器頻域特性曲線
mark -
濾波效果
mark
7.3 多波峰正弦信號生成
這一問題的詳細描述見:T301|超聲導波激勵信號的生成與頻譜分析
函數說明
function toneburst()
% 題目: 超聲導波激勵信號的生成與頻譜分析
% 參數:
% N - cycle數,即激勵信號波峰數
% fc - 激勵信號中心頻率
% 功能:
% 生成激勵信號序列
% 繪制時域圖和頻域圖
% 對比不同cycle數信號的特征
% 輸出txt文件
% 作者: 馬騁
% 2016.03.18 @HIT
運行示例
- 調用代碼
[s,fs] = tools.toneburst;
-
參數對話框
mark -
信號時程與頻譜
mark -
生成信號數據文件
mark
7.4 激勵信號帶寬計算
函數說明
此函數用于計算給定激勵信號的頻域帶寬,確定信號寬帶、窄帶的指標,采用3Db帶寬。
% 題目:計算給定信號的3db帶寬
% 輸入:
% fs -- 采樣頻率
% S -- 信號時程
% flag-- 是否繪制圖像
% 時間:2017.01.10
```
### 運行示例
- 測試代碼
```
[s,fs] = tools.toneburst;
[band3db,x0] = tools.getband3db(fs,s);
band3db_fk = band3db/1000;
```
- 運行結果

- 帶寬數值z,單位為kHz
```
band3db_fk
=
28.1254
```
# 8. 其他函數
## 8.1 工具箱版本顯示
### 函數說明
此函數用于記錄程序的更新歷程和版本信息。
```
function version()
% 題目:版本自動說明
```
### 運行示例
- 調用代碼
```
tools.version
```
- 運行效果
```
版本說明:數據處理與信號繪圖輔助工具箱
馬騁,創建于2016.04.29
更新日志:
2016.04.29,增加xyt函數;
2016.04.30,增加getmat函數;
2016.04.30,更新paradlg沖突bug;
2016.05.03,更新paradlg空格bug;
2016.05.03,增加range函數;
2016.05.04,增加row2mat函數;
2016.05.06,增加html函數;
2016.05.06,增加clean函數;
2016.12.13,增加colorOrder函數;
2016.12.21,增加xline函數;
2017.01.05,修改paradlg函數,智能彈出;
2017.01.05,增加saveGragh函數;
2017.01.08,增加xGrid,yGrid網格線
2017.01.08,增加plot0函數;
2017.01.10,增加intersection函數;
2017.01.10,增加get3band3db函數;
2017.01.10,增加toneburst函數;
```
# 9. 使用技巧
## 9.1 工具箱的路徑設置
自編MATLAB函數(如信號處理函數庫tools.m),如果不做進一步的設置,往往只能在函數文件下下調用,如果工作路徑在其他文件夾下則不能使用。

基本的解決方法是:將`tools.m`添加到MATLAB可以搜索的路徑下:
- 設置添加路徑對話框
```
pathtool
```
- 添加`tools`敢刷了所在的路徑

## 9.2 函數幫助信息顯示
輸入函數名,按`F1`鍵,即可顯示函數的幫助信息。

與MATLAB內置函數的幫助顯示一樣。
# 10. 更新與下載
本工具箱功能持續更新,代碼托管于coding.net,下載網址為:
[coding.net-frank0449](https://coding.net/u/frank0449/p/matlab/git)
