定點設計師快速入門

来源:https://www.cnblogs.com/52geek/archive/2019/02/25/10434202.html
-Advertisement-
Play Games

定點設計師產品說明 系統要求 定點設計師產品說明 系統要求 教程 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 對象創建定點數據。

例 1. 使用預設屬性創建定點數

對數字調用 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 對象

例 3. 創建定點整數值

要創建定點整數值,請指定小數長度為 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屬性。您可以使用setfimathfimath對象附加到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
aProductMode屬性設置為KeepMSB,其餘而的fimath屬性使用預設值。

 

註意

有關fimath對象及其屬性和預設值的詳細信息,請參閱fimath對象屬性

位增長

表下顯示fi對象A狀語從句:BSumMode狀語從句:ProductMode屬性使用預設fimathFullPrecision時的位增長。

 一個Sum = A + B.產品= A * B.
格式 fi(vA,s1,w1,f1) fi(vB,s2,w2,f2) - -
符號 s1 s2 Ssum=(|| s1s2 Sproduct=(|| s1s2
整數位 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對象FF指定和的字長和小數長度。在預設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) = bb的值賦給由下標向量I指定的a的元素,保留同時anumerictype

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)指示下標向量(:)處的值發生更改。但是,輸出accnumerictype保持不變。由於acc是標量,因此如果您使用(1)作為下標向量,則也會收到相同的輸出。

  對於 n = 1:numel(x)
    acc(1)= acc + x(n);
  結束
acc = 

     1
      s32,0

acc = 

     3
      s32,0

acc = 

     6
      s32,0

 

accnumerictypefor迴圈的每次迭代中保持不變。

下標賦值還可以幫助您控制函數中的位增長。在函數cumulative_sum中,ynumerictype不會更改,但由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對象之一的數據類型,同時允許您指定舍入方法和輸入值中的溢出操作。

有關如何實現accumposaccumneg的詳細信息,請參閱避免生成代碼中的多字操作

溢出和舍入

在執行定點算術時,考慮溢出的可能性和後果。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

在此函數中的變數yz用作輸入和輸出。這是一個重要的模式,因為:

  • 您可以設置的數據類型yz外設功能,從而使您可以重覆使用的功能,兩個定點和浮點類型。

  • 生成的C代碼將在函數參數列表中創建yz作為引用。有關此模式的更多信息,請參閱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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 百度一下資料庫事務隔離,臟讀等,我想也是一堆。有些老學究扯一堆理論,有些通篇全是代碼,都讓人看的有種說不出蛋疼的感覺。本文用圖文並茂的方式,配上行雲流水般的代碼,非要擺清楚這個問題。本文代碼已提交至碼雲(點擊這裡下載)。 事務是現代關係型資料庫的核心之一。在多個事務併發操作資料庫(多線程、網路併發等 ...
  • 先準備一個耗時方法 /// <summary>/// 耗時方法/// </summary>/// <param name="name"></param>private void DoSomeThing(string name){ Console.WriteLine($"開始執行{name}, {Th ...
  • public class EPPlus { public static string ExcelContentType { get { return "application/vnd.openxmlformats-officedocument.spreadsheetml.sh... ...
  • ASP.NET Core 基於 JWT 的認證(一) Json web token ( JWT ), 是為了在網路應用環境間傳遞聲明而執行的一種基於JSON的開放標準(( RFC 7519 ).該 token 被設計為緊湊且安全的,特別適用於分散式站點的單點登錄( SSO )場景。 JWT 的聲明一 ...
  • 1、首先添加空Code Firtst模型 2、新建兩個實體類,關係一對多 3、修改模型文件,啟用實體類 4、修改app.config文件連接屬性,此處Database不存在 5、在代碼中創建資料庫並插入數據 ...
  • 阿裡各版本yum源如下: Centos5:http://mirrors.aliyun.com/repo/Centos-5.repo Centos6:http://mirrors.aliyun.com/repo/Centos-6.repo Centos7:http://mirrors.aliyun.c ...
  • DHCP Server服務在%windir%\System32\DHCP或"%SystemRoot%\System32\DHCP"文件夾下存放了一個審核日誌。審核日誌文件名稱是基於一周的當前天來命名。在預設情況下,如果磁碟空間少於20MB,或當前日誌文件超過分配的最大空間,那麼DHCP Server... ...
  • 1.redis根目錄調出命令行(cmd) 2.登錄redis:redis-cli -h 127.0.0.1 -p 6379 3.查看所有key值:keys * 4.刪除指定索引的值:del key 5.清空整個 Redis 伺服器的數據:flushall 6.清空當前庫中的所有 key:flushd ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...