定點設計師產品說明 系統要求 定點設計師產品說明 系統要求 教程 MATLAB工作流 在MATLAB中創建定點數據 定點基礎知識 執行定點算術 “執行定點算術” 查看定點數據 示例代碼中使用的fi對象顯示設置 加速定點模擬 此示例說明如何使用fiaccel函數來加速定點演算法。您可以從MATLAB®代 ...
- 定點設計師產品說明
- 系統要求
教程
MATLAB工作流
在MATLAB中創建定點數據
定點基礎知識
執行定點算術
“執行定點算術”
查看定點數據
示例代碼中使用的fi
對象顯示設置
加速定點模擬
此示例說明如何使用fiaccel
函數來加速定點演算法。您可以從MATLAB®代碼生成MEX函數,運行生成的MEX函數,並使用MATLAB代碼模擬比較執行速度。
使用Min / Max Instrumentation設置數據類型
此示例顯示如何通過檢測最小/最大日誌記錄的MATLAB代碼並使用工具建議數據類型來設置定點數據類型。
生成定點C代碼
生成獨立的定點C代碼
手動將浮點MATLAB演算法轉換為定點
手動將浮點MATLAB演算法轉換為定點
Simulink工作流
開發和測試定點系統
模擬動態系統的開發周期概述
在Simulink模型和MATLAB之間傳遞定點數據
閱讀從MATLAB定點數據®到您的Simulink ®模型,從模型和模擬登錄定點信息到工作區。
配置具有定點輸出的塊
通過配置Simulink模塊輸出定點信號來創建定點模型。
從雙打到固定點
提供基於該fxpdemo_dbl2fix
模型的示例,該示例突出了Fixed-Point Designer™軟體的許多關鍵功能
將浮點模型轉換為不動點
詳細說明將浮點模型轉換為固定點所採取的步驟。
共用定點模型
使用數據類型覆蓋設置來共用和編輯包含定點塊的模型,而無需使用定點設計器軟體。
關於定點
- 使用定點硬體的好處
- 定點數據類型
定點數據類型
- 精度和範圍
討論定點設計器中算術運算背後的概念
- 縮放
討論定點設計器中使用的縮放類型; 二進位僅點和[斜率偏差]
- 算術運算
介紹定點設計器中算術運算背後的概念
- 物理量和測量量表
提供測量標度和代表數字的概述
- 辭彙表
- 精選參考書目
Fixed-Point Designer 產品說明
設計、模擬和分析定點系統Fixed-Point Designer™ 提供開發定點和單精度演算法所需的數據類型和工具,以在嵌入式硬體上進行性能優化。Fixed-Point Designer 會分析您的設計並提供建議的數據類型和屬性,例如字長和定標。您可以指定詳細的數據屬性,如舍入模式和溢出操作,以及混合單精度和定點數據。您可以執行位真模擬來觀察有限範圍和精度的影響,而無需在硬體上實現設計。
Fixed-Point Designer 可讓您將雙精度演算法轉換為單精度或定點。您可以創建和優化滿足數值精度要求和目標硬體約束的數據類型。您可以通過數學分析或檢測後的模擬來確定設計的範圍要求。Fixed-Point Designer 提供的 App 和工具可指導您完成數據轉換過程,並允許您將定點結果與浮點基線進行比較。
Fixed-Point Designer 支持 C、HDL 和 PLC 代碼生成。
主要功能
-
MATLAB®、Simulink® 和 Stateflow® 中的定點數據類型設定
-
定點和單精度演算法的位真模擬
-
用於探查和優化數據類型的直方圖和相關工具
-
用於從雙精度轉換為定點或單精度的 App
-
用於收集模擬最小值和最大值的檢測
-
用於評估完整設計最小值和最大值的範圍分析
-
用於調試和可視化的溢出檢測和精度丟失工具
教程:MATLAB工作流
在 MATLAB 中創建定點數據
以下示例說明如何使用 Fixed-Point Designer™ fi
對象創建定點數據。
對數字調用 fi
會生成具有預設符號性、預設字長和小數長度的定點數。
fi(pi)
ans = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
例 2. 創建具有指定符號性、字長和小數長度的定點數
您可以指定符號性(1 表示有符號,0 表示無符號)以及字長和小數長度。
fi(pi,1,15,12)
ans = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 15 FractionLength: 12
fi
和 numerictype
對象
要創建定點整數值,請指定小數長度為 0。
fi(1:25,0,8,0)
ans = Columns 1 through 13 1 2 3 4 5 6 7 8 9 10 11 12 13 Columns 14 through 25 14 15 16 17 18 19 20 21 22 23 24 25 DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 8 FractionLength: 0
例 4. 創建隨機定點值的數組
fi(rand(4),0,12,8)
ans = 0.1484 0.8125 0.1953 0.3516 0.2578 0.2422 0.2500 0.8320 0.8398 0.9297 0.6172 0.5859 0.2539 0.3516 0.4727 0.5508 DataTypeMode: Fixed-point: binary point scaling Signedness: Unsigned WordLength: 12 FractionLength: 8
例 5. 創建由零組成的數組
編寫代碼時,您有時需要為變數測試不同數據類型。將變數的數據類型與演算法分離使測試變得更加簡單。通過創建數據類型定義表,您可以編程方式使函數在浮點數據類型和定點數據類型之間切換。以下示例說明如何使用此方法和創建由零組成的數組。
T.z = fi([],1,16,0); z = zeros(2,3,'like',T.z)
z = 0 0 0 0 0 0 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 0
註意
有關說明此方法的實現的完整示例,請參閱Implement FIR Filter Algorithm for Floating-Point and Fixed-Point Types using cast and zeros。
定點算術
加減法
將兩個定點數相加時,您可能需要一個進位位來正確表示結果。因此,將兩個B位數(具有相同的定標)相加時,與使用兩個操作數時相比,結果值有一個額外的位。
a = fi(0.234375,0,4,6); c = a + a
c = 0.4688 DataTypeMode:定點:二進位點縮放 簽名:未簽名 WordLength:5 分數長度:6
a.bin
ans = 1111
c.bin
ans = 11110
。如果對具有不同精度的兩個數字執行加法或減法,首先需要對齊小數點才能執行運算結果是:運算結果與操作數之間存在多於一位的差異。
a = fi(pi,1,16,13); b = fi(0.1,1,12,14); c = a + b
c = 3.2416 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:18 分數長度:14
乘法
通常,全精度乘積需要的字長等於各操作數字長之和。在以下示例中,請註意,乘積c
的字長等於a
的字長加上b
的字長。c
的小數長度也。等於a
的小數長度加上b
的小數長度。
a = fi(pi,1,20),b = fi(exp(1),1,16)
a = 3.1416 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:20 分數長度:17 b = 2.7183 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:16 分數長度:13
c = a * b
c = 8.5397 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:36 分數長度:30
與其他內置數據類型的數學運算
註意,在Ç語言中,整數數據類型和雙精度數據類型之間的運算結果會提升為雙精度類型。但是,在MATLAB ®中,內置的整數數據類型和雙精度數據類型之間的運算結果是整數。在這方面,fi
對象的行為與MATLAB中的內置整數數據類型相似。
在fi
狀語從句:double
之間進行加法運算時,雙精度會轉換為與原fi
輸入側具有相同數值類型的fi
。該運算的結果是fi
。在當fi
狀語從句:double
之間進行乘法運算時,雙精度會轉換為fi
,其字長和符號與性原fi
相同御姐具有最佳精度的小數長度。該運算的結果是fi
。
a = fi(pi);
a = 3.1416 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:16 分數長度:13
b = 0.5 * a
b = 1.5708 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:32 分數長度:28
內置在整數數據類型[u]int[8, 16, 32]
之一與fi
之間進行算術運算時,保留整數的字長和符號性。該運算的結果是fi
。
a = fi(pi); b = int8(2)* a
b = 6.2832 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:24 分數長度:13
在fi
與邏輯數據類型之間進行算術運算時,邏輯值被視為值為0或1且字長為1的無符號fi
對象。該運算的結果是fi
對象。
a = fi(pi); b =邏輯(1); c = a * b
c = 3.1416 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:17 分數長度:13
fimath對象
fimath
屬性定義對fi
對象執行算術運算的規則,包括數學,舍入和溢出屬性。fi
對象可以有局部fimath
對象,它也。可以使用預設fimath
屬性。您可以使用setfimath
將fimath
對象附加到fi
對象。您也。可以在創建³³時在fi
構造函數指定中fimath
屬性。當fi
對象具有局部fimath
而不是使用預設屬性時,fi
對象的顯示中將顯示fimath
屬性。在此示例中,a
具有在構造函數中指定的ProductMode
屬性。
a = fi(5,1,16,4,'ProductMode','KeepMSB')
a = 五 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:16 分數長度:4 RoundingMethod:最近的 溢出動作:飽和 ProductMode:KeepMSB ProductWordLength:32 SumMode:FullPrecision
a
的ProductMode
屬性設置為KeepMSB
,其餘而的fimath
屬性使用預設值。
註意
有關fimath
對象及其屬性和預設值的詳細信息,請參閱fimath對象屬性。
位增長
表下顯示fi
對象A
狀語從句:B
的SumMode
狀語從句:ProductMode
屬性使用預設fimath
值FullPrecision
時的位增長。
一個 | 乙 | Sum = A + B. | 產品= A * B. | |
---|---|---|---|---|
格式 | fi(vA,s1,w1,f1) |
fi(vB,s2,w2,f2) |
- | - |
符號 | s1 |
s2 |
Ssum =(|| )s1 s2 |
Sproduct =(|| )s1 s2 |
整數位 | I1 = w1-f1-s1 |
I2= w2-f2-s2 |
Isum = max(w1-f1, w2-f2) + 1 - Ssum |
Iproduct = (w1 + w2) - (f1 + f2) |
小數位 | f1 |
f2 |
Fsum = max(f1, f2) |
Fproduct = f1 + f2 |
總位數 | w1 |
w2 |
Ssum + Isum + Fsum |
w1 + w2 |
示例此說明在for
迴圈中發生的位增長。
T.acc = fi([],1,32,0); Tx = fi([],1,16,0); x = cast(1:3,'like',Tx); acc = zeros(1,1,'like',T.acc); 對於 n = 1:長度(x) acc = acc + x(n) 結束
acc = 1 s33,0 acc = 3 s34,0 acc = 6 s35,0隨著迴圈的每次迭代,
acc
的字長也隨之增加這種增加會導致兩個問題:。一個是代碼生成不允許在迴圈中更改數據類型另一個是,如果迴圈足夠長,則會在MATLAB中耗盡記憶體。請參閱控制位增長瞭解避免此問題的一些策略。
控制位增長
使用fimath
指定通過fi
對象的fimath
屬性,您可以控制在對對象執行運算時的位增長。
F = fimath('SumMode','SpecifyPrecision','SumWordLength',8,...... 'SumFractionLength',0); a = fi(8,1,8,0,F); b = fi(3,1,8,0); c = a + b
c = 11 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:8 分數長度:0 RoundingMethod:最近的 溢出動作:飽和 ProductMode:FullPrecision SumMode:SpecifyPrecision SumWordLength:8 SumFractionLength:0 CastBeforeSum:是的
fi
對象a
具有局部fimath
對象F
。F
指定和的字長和小數長度。在預設fimath
設置下,輸出c
通常字長為9,小數長度為0.但是,由於a
具有局部fimath
對象,因此生成的fi
對象的字長為8,小數長度為0。
還您可以使用fimath
屬性來控制for
迴圈中的位增長。
F = fimath('SumMode','SpecifyPrecision','SumWordLength',32,...... 'SumFractionLength',0); T.acc = fi([],1,32,0,F); Tx = fi([],1,16,0); x = cast(1:3,'like',Tx); acc = zeros(1,1,'like',T.acc); 對於 n = 1:長度(x) acc = acc + x(n) 結束
acc = 1 s32,0 acc = 3 s32,0 acc = 6 s32,0
與T.acc
使用預設fimath
屬性時不同,acc
的位增長現在受到限制。因此,acc
的字長保持為32。
下標賦值
控制位增長的另一種方法是使用下標賦值。a(I) = b
將b
的值賦給由下標向量I
指定的a
的元素,保留同時a
的numerictype
。
T.acc = fi([],1,32,0); Tx = fi([],1,16,0); x = cast(1:3,'like',Tx); acc = zeros(1,1,'like',T.acc); %分配到ACC而不改變其類型 為 n = 1時:長度(X) acc(:) = acc + x(n) 結束
acc(:) = acc + x(n)指示下標向量(:)
處的值發生更改。但是,輸出acc
的numerictype
保持不變。由於acc
是標量,因此如果您使用(1)
作為下標向量,則也會收到相同的輸出。
對於 n = 1:numel(x) acc(1)= acc + x(n); 結束
acc = 1 s32,0 acc = 3 s32,0 acc = 6 s32,0
acc
的numerictype
在for
迴圈的每次迭代中保持不變。
下標賦值還可以幫助您控制函數中的位增長。在函數cumulative_sum
中,y
的numerictype
不會更改,但由n指定的元素中的值會更改。
function y = cumulative_sum(x) %CUMULATIVE_SUM向量元素的累積和。 % 對於向量,Y = cumulative_sum(X)是包含 X元素的累積和的百分比的向量.Y的類型是X的類型 .y =零(size(x),'like',x) ; y(1)= x(1); 對於 n = 2:長度(x) y(n)= y(n-1)+ x(n); 年底 結束
y = cumulative_sum(fi([1:10],1,8,0))
y = 1 3 6 10 15 21 28 36 45 55 DataTypeMode:定點:二進位點縮放 簽名:簽名 WordLength:8 分數長度:0
註意
有關下標賦值的詳細信息,參閱請subsasgn
函數。
accumpo和accumneg
位控制的增長另一種方法的英文使用accumpos
狀語從句:accumneg
函數來執行加法減法狀語從句:運算。與使用下標賦值類似,accumpos
狀語從句:accumneg
保留其輸入側fi
對象之一的數據類型,同時允許您指定舍入方法和輸入值中的溢出操作。
有關如何實現accumpos
和accumneg
的詳細信息,請參閱避免生成代碼中的多字操作
溢出和舍入
在執行定點算術時,考慮溢出的可能性和後果。fimath
對象指定執行算術運算時使用的溢出和舍入模式。
溢出
當運算結果超過最大或最小可表示值時,可能會發生溢出。fimath
對象具有OverflowAction
屬性,它提供兩種處理溢出的方法:與飽和迴繞如果將OverflowAction
設置為saturate
,則溢出會通過飽和方式限製為該範圍內的最大值或最小值。如果將OverflowAction
設置為wrap
,則任何溢出都將繞回,對於無符號值,會採用模運算繞回,對於有符號值,則採用2的補碼繞回。
有關如何檢測溢出的詳細信息,請參閱使用fipref進行下溢和溢出記錄。
舍入
選擇舍入方法時需要考慮幾個因素,包括成本,偏置以及是否存在溢出的可能性.Fixed-Point Designer™軟體提供了幾個不同舍入函數來滿足您的設計要求。
舍入方法 | 說明 | 成本 | 偏差 | 是否可能溢出 |
---|---|---|---|---|
ceil |
舍入到正無窮大方向最接近的可表示數字。 | 低 | 大的正向偏差 | 是 |
convergent |
舍入到最接近的可表示數字。在舍入機會均等的情況下,convergent 舍入到最接近的偶數。這種方法是由工具箱提供的最小偏置舍入方法。 |
高 | 無偏差 | 是 |
floor |
舍入到負無窮大方向上最接近的可表示數字,相當於2的補碼截斷。 | 低 | 大的負向偏差 | 否 |
nearest |
舍入到最接近的可表示數字。在舍入機會均等的情況下,nearest 在正無窮大的方向上舍入到最接近的可表示數字。舍此入方法的英文fi 對象創建³³狀語從句:fi 算術的預設值。 |
中等 | 小的正向偏差 | 是 |
round |
。舍入到最接近的可表示數字在舍入機會均等的情況下,round 方法進行如下舍入:
|
高 |
|
是 |
fix |
舍入到零方向上最接近的可表示數字。 | 低 |
|
否 |
查看定點數據
在 Fixed-Point Designer™ 軟體中,fipref
對象確定 fi
對象的顯示屬性。對於 fi
對象,代碼示例通常在它們與下列 fipref
對象屬性一起使用時才顯示它們:
-
NumberDisplay
-'RealWorldValue'
-
NumericTypeDisplay
-'full'
-
FimathDisplay
-'full'
通過將 'FimathDisplay'
設置為 'full'
,可以快速、輕鬆地區分具有局部 fimath 配置的 fi
對象和那些與預設 fimath 配置相關聯的對象。當 'FimathDisplay'
設置為 'full'
時,MATLAB® 顯示具有局部 fimath 配置的 fi
對象的 fimath
對象屬性。MATLAB 不會顯示與預設 fimath 配置相關聯的 fi
對象的 fimath
對象屬性。由於存在這種顯示差異,您只需通過查看輸出即可知道 fi
對象是否與預設 fimath 配置相關聯。
此外,除非另有說明,否則整個 Fixed-Point Designer 文檔中的示例都使用 fimath 的以下預設配置:
RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision
有關顯示設置的詳細信息,請參閱fi Object Display Preferences Using fipref。
顯示 fi 對象的 fimath 屬性
要查看大多數 Fixed-Point Designer 代碼示例中顯示的輸出,請按如下所示設置 fipref
屬性並創建兩個 fi
對象:
p = fipref('NumberDisplay', 'RealWorldValue',... 'NumericTypeDisplay', 'full', 'FimathDisplay', 'full'); a = fi(pi,'RoundingMethod', 'Floor', 'OverflowAction', 'Wrap') b = fi(pi)
MATLAB 返回以下內容:
a = 3.1415 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13 RoundingMethod: Floor OverflowAction: Wrap ProductMode: FullPrecision SumMode: FullPrecision b = 3.1416 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
MATLAB 在 fi
對象 a
的輸出中顯示 fimath
對象屬性,因為 a
具有局部 fimath 配置。
MATLAB 在 fi
對象 b
的輸出中不顯示任何 fimath
對象屬性,因為 b
將自身與預設 fimath 關聯。
隱藏 fi 對象的 fimath 屬性
如果您正在使用多個具有局部 fimath 配置的 fi
對象,則可能需要關閉 fimath
對象顯示:
-
NumberDisplay
-'RealWorldValue'
-
NumericTypeDisplay
-'full'
-
FimathDisplay
-'none'
例如,
p = fipref('NumberDisplay','RealWorldValue',... 'NumericTypeDisplay','full','FimathDisplay','none') p = NumberDisplay: 'RealWorldValue' NumericTypeDisplay: 'full' FimathDisplay: 'none' LoggingMode: 'Off' DataTypeOverride: 'ForceOff' F = fimath('RoundingMethod','Floor','OverflowAction','Wrap'); a = fi(pi, F) a = 3.1415 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 16 FractionLength: 13
儘管此設置有助於減少產生的輸出量,但它也導致無法根據輸出判斷 fi
對象是否使用預設 fimath。為此,您可以使用 isfimathlocal
函數。例如,
isfimathlocal(a) ans = 1
當 isfimathlocal
函數返回 1
時,fi
對象具有局部 fimath 配置。如果函數返回 0
,則 fi
對象使用預設 fimath 配置。
縮短 fi 對象的數值類型顯示
要進一步減少輸出量,可以將 NumericTypeDisplay
設置為 'short'
。例如,
p = fipref('NumberDisplay','RealWorldValue',... 'NumericTypeDisplay','short','FimathDisplay','full'); a = fi(pi) a = 3.1416 s16,13
加速定點模擬
在 MATLAB 中嘗試此示例說明如何使用 fiaccel
函數來加速定點演算法。您可以從 MATLAB® 代碼生成 MEX 函數,運行生成的 MEX 函數,並使用 MATLAB 代碼模擬比較執行速度。
示例說明
此示例使用一階反饋迴路。它還使用量化器來避免無限的位增長。輸出信號被延遲一個採樣周期並通過回饋來緩衝輸入信號。
複製必需的文件
您需要此 MATLAB 文件來運行此示例。將其複製到臨時目錄。此步驟需要具有對系統臨時目錄的寫入訪問許可權。
tempdirObj = fidemo.fiTempdir('fiaccelbasicsdemo'); fiacceldir = tempdirObj.tempDir; fiaccelsrc = ... fullfile(matlabroot,'toolbox','fixedpoint','fidemos','+fidemo','fiaccelFeedback.m'); copyfile(fiaccelsrc,fiacceldir,'f');
檢查 MATLAB 反饋函數代碼
執行反饋迴路的 MATLAB 函數位於文件 fiaccelFeedback.m
中。以下代碼將量化輸入,並執行反饋迴路操作:
type(fullfile(fiacceldir,'fiaccelFeedback.m'))
function [y,w] = fiaccelFeedback(x,a,y,w) %FIACCELFEEDBACK Quantizer and feedback loop used in FIACCELBASICSDEMO. % Copyright 1984-2013 The MathWorks, Inc. %#codegen for n = 1:length(x) y(n) = quantize(x(n) - a*w, true, 16, 12, 'floor', 'wrap'); w = y(n); end
此函數中使用以下變數:
-
x
是輸入信號向量。 -
y
是輸出信號向量。 -
a
是反饋增益。 -
w
是延遲一個單位時間的輸出信號。
創建輸入信號並初始化變數
rng('default'); % Random number generator x = fi(2*rand(1000,1)-1,true,16,15); % Input signal a = fi(.9,true,16,15); % Feedback gain y = fi(zeros(size(x)),true,16,12); % Initialize output. Fraction length % is chosen to prevent overflow w = fi(0,true,16,12); % Initialize delayed output A = coder.Constant(a); % Declare "a" constant for code % generation
運行 Normal 模式
tic, y = fiaccelFeedback(x,a,y,w); t1 = toc;
編譯反饋代碼的 MEX 版本
fiaccel fiaccelFeedback -args {x,A,y,w} -o fiaccelFeedback_mex
運行 MEX 版本
tic y2 = fiaccelFeedback_mex(x,y,w); t2 = toc;
加速比
代碼加速為通過 MEX 文件生成加速定點演算法提供優化。Fixed-Point Designer™ 提供了一個方便的函數 fiaccel
來將您的 MATLAB 代碼轉換為 MEX 函數,這可以大大加快定點演算法的執行速度。
r = t1/t2
r = 12.7097
清理臨時文件
clear fiaccelFeedback_mex; tempdirObj.cleanUp;
使用Min / Max Instrumentation設置數據類型
在MATLAB中試一試此示例顯示如何通過檢測用於最小/最大日誌記錄的MATLAB®代碼並使用工具建議數據類型來設置定點數據類型。
您將使用的功能是:
-
buildInstrumentedMex
- 在啟用檢測的情況下構建MEX功能 -
showInstrumentationResults
- 顯示檢測結果 -
clearInstrumentationResults
- 清除儀器結果
被測單位
在此示例中轉換為定點的函數是二階直接形式2轉置過濾器。您可以用自己的功能代替這個功能,在您自己的工作中重現這些步驟。
函數 [Y,Z] = fi_2nd_order_df2t_filter(B,A,X,Y,Z) 為 I = 1:長度(X) y(i)= b(1)* x(i)+ z(1); z(1)= b(2)* x(i)+ z(2)-a(2)* y(i); z(2)= b(3)* x(i) - a(3)* y(i); 年底 結束
對於要檢測的MATLAB®函數,它必須適合代碼生成。有關代碼生成的信息,請參閱參考頁面buildInstrumentedMex
。不需要使用MATLAB®Coder™許可證buildInstrumentedMex
。
在此函數中的變數y
和z
用作輸入和輸出。這是一個重要的模式,因為:
-
您可以設置的數據類型
y
和z
外設功能,從而使您可以重覆使用的功能,兩個定點和浮點類型。 -
生成的C代碼將在函數參數列表中創建
y
和z
作為引用。有關此模式的更多信息,請參閱MATLAB®代碼生成下的文檔>用戶指南>生成高效且可重用的代碼>生成高效代碼>消除函數輸入的冗餘副本。
運行以下代碼將測試函數複製到臨時目錄中,因此此示例不會幹擾您自己的工作。
tempdirObj = fidemo.fiTempdir('fi_instrumentation_fixed_point_filter_demo');
copyfile(fullfile(matlabroot,'toolbox',' fixedpoint ','fidemos','+ fidemo',... 'fi_2nd_order_df2t_filter.m'),'。','f');
運行以下代碼以捕獲當前狀態,並重置全局狀態。
FIPREF_STATE = get(fipref); 複位(fipref)
數據類型由設計要求決定
在此示例中,設計要求確定輸入的數據類型x
。這些要求是有符號的,16位和小數。
N = 256; x = fi(零(N,1),1,16,15);
設計要求還決定了具有40位累加器的DSP目標的定點數學運算。此示例使用地板舍入和換行溢出來生成高效的生成代碼。
F = fimath('RoundingMethod','Floor',...... 'OverflowAction','Wrap',...... 'ProductMode','KeepLSB',...... 'ProductWordLength',40,...... 'SumMode','KeepLSB',...... 'SumWordLength',40);
以下繫數對應於由2創建的二階低通濾波器
[num,den] =黃油(2,0.125)
繫數的值會影響將分配給濾波器輸出和狀態的值的範圍。
num = [0.0299545822080925 0.0599091644161849 0.0299545822080925]; den = [1 -1.4542435862515900 0.5740619150839550];
由設計要求確定的繫數的數據類型被指定為16位字長並且被縮放到最佳精度。fi
從常繫數創建對象的模式是:
1. fi
使用預設的舍入到最近和飽和溢出設置將繫數投射到對象,這使得繫數更精確。
2.附加fimath
地板舍入和包裝溢出設置以控制算術,從而產生更高效的C代碼。
b = fi(num,1,16); b.fimath = F; a = fi(den,1,16); a.fimath = F;
通過將濾波器繫數作為常量傳遞給buildInstrumentedMex
命令,將濾波器繫數硬編碼到此濾波器的實現中。
B = coder.Constant(b); A = coder.Constant(a);
數據類型由繫數和輸入的值決定
輸入的繫數和值的值確定輸出y
和狀態向量的數據類型z
。使用縮放的雙數據類型創建它們,以便它們的值達到全範圍,您可以識別潛在的溢出並建議數據類型。
yisd = fi(零(N,1),1,16,15,'DataType','ScaledDouble','fimath',F); zisd = fi(零(2,1),1,16,15,'DataType','ScaledDouble','fimath',F);
將MATLAB®功能用作縮放雙MEX功能
要檢測MATLAB®代碼,可以使用buildInstrumentedMex
命令從MATLAB®函數創建MEX函數。輸入與輸入buildInstrumentedMex
相同fiaccel
,但buildInstrumentedMex
沒有對象fi
限制。輸出buildInstrumentedMex
是帶有儀器插入的MEX功能,因此在運行MEX功能時,將記錄所有命名變數和中間值的模擬最小值和最大值。
使用該'-o'
選項命名生成的MEX函數。如果不使用該'-o'
選項,則MEX函數是'_mex'
附加的MATLAB®函數的名稱。您也可以將MEX功能命名為與MATLAB®功能相同,但您需要記住MEX功能優先於MATLAB®功能,因此在重新生成MEX功能之前,MATLAB®功能的更改不會運行,或者刪除並清除MEX功能。
buildInstrumentedMex fi_2nd_order_df2t_filter ...
-o filter_scaled_double ...
-args {B,A,X,yisd,zisd}
帶有啁啾輸入的測試台
該系統的測試台設置為運行啁啾和步進信號。通常,系統的測試台應覆蓋各種輸入信號。
第一個測試平臺使用啁啾輸入。啁啾信號是很好的代表性輸入,因為它涵蓋了很寬的頻率範圍。
t = linspace(0,1,N); %時間矢量從0到1秒 f1 = N / 2; %啁啾的目標頻率設置為Nyquist xchirp = sin(pi * f1 * t。^ 2); %線性啁啾從0到Fs / 2 Hz,1秒 x(:) = xchirp; %將啁啾投射到定點
運行Instrumented MEX功能以記錄最小值/最大值
必須運行檢測的MEX功能以記錄該模擬運行的最小值和最大值。後續運行會累積檢測結果,直到清除它們為止clearInstrumentationResults
。
請註意,分子和分母繫數被編譯為常量,因此它們不作為生成的MEX函數的輸入提供。
ychirp = filter_scaled_double(x,yisd,zisd);
濾波的線性調頻信號的曲線圖示出了具有這些特定繫數的濾波器的低通行為。低頻通過,較高頻率衰減。
CLF 情節(t,x,'c',t,ychirp,'bo-') 標題('唧唧') 圖例('輸入','縮放雙輸出') 圖(GCF); 的DrawNow;
顯示Chirp的建議分數長度的儀器結果
該showInstrumentationResults
命令顯示帶有檢測值的代碼生成報告。輸入to showInstrumentationResults
是您希望顯示結果的已檢測MEX函數的名稱。
這是showInstrumentationResults
命令的選項列表:
-
-def