【研發日記】Matlab/Simulink技能解鎖(七)——兩種復數移相算法

0f7748df2f874c93b444d5652d4cb5f5.png

????????復數移相,也稱為復數相位旋轉,就是在原有復數的基礎上,不改變模數,只把相位角做一定的偏移。

文章目錄

前言

三角函數移相

復數乘法移相

分析和應用

總結


前言

??????? 見《【研發日記】Matlab/Simulink技能解鎖(二)——在Function編輯窗口Debug》

????????見《【研發日記】Matlab/Simulink技能解鎖(三)——在Stateflow編輯窗口Debug》

????????見《【研發日記】Matlab/Simulink技能解鎖(四)——在Simulink Debugger窗口調試》

????????見《【研發日記】Matlab/Simulink技能解鎖(五)——七個Simulink布線技巧》

????????見《【研發日記】Matlab/Simulink技能解鎖(六)——六種Simulink模型架構》

?????

三角函數移相

????????三角函數移相法,是利用模數實部虛部之間的三角函數關系,從原復數求得新復數。在Simulink中建立的移相函數,如下所示:

1c8f021ab1a64c72a70fd368d09fd071.png

????????Tips: offset的范圍在-π到π之間,輸入接口要做溢出處理。

????????上述模型編譯出來的代碼,如下所示:

#include "PhaseOffset.h"
#include "PhaseOffset_private.h"/* External inputs (root inport signals with default storage) */
ExtU_PhaseOffset_T PhaseOffset_U;/* External outputs (root outports fed by signals with default storage) */
ExtY_PhaseOffset_T PhaseOffset_Y;/* Real-time model */
static RT_MODEL_PhaseOffset_T PhaseOffset_M_;
RT_MODEL_PhaseOffset_T *const PhaseOffset_M = &PhaseOffset_M_;
real_T rt_atan2d_snf(real_T u0, real_T u1)
{real_T y;int32_T u0_0;int32_T u1_0;if (rtIsNaN(u0) || rtIsNaN(u1)) {y = (rtNaN);} else if (rtIsInf(u0) && rtIsInf(u1)) {if (u0 > 0.0) {u0_0 = 1;} else {u0_0 = -1;}if (u1 > 0.0) {u1_0 = 1;} else {u1_0 = -1;}y = atan2(u0_0, u1_0);} else if (u1 == 0.0) {if (u0 > 0.0) {y = RT_PI / 2.0;} else if (u0 < 0.0) {y = -(RT_PI / 2.0);} else {y = 0.0;}} else {y = atan2(u0, u1);}return y;
}/* Model step function */
void PhaseOffset_step(void)
{real_T Out1_tmp;real_T Phase;/* MATLAB Function: '<Root>/MATLAB Function' incorporates:*  Inport: '<Root>/In1'*  Inport: '<Root>/In2'*/Phase = rt_atan2d_snf(0.0, PhaseOffset_U.In1) + PhaseOffset_U.In2;Out1_tmp = fabs(PhaseOffset_U.In1);/* Outport: '<Root>/Out1' incorporates:*  MATLAB Function: '<Root>/MATLAB Function'*/PhaseOffset_Y.Out1.re = Out1_tmp * cos(Phase);PhaseOffset_Y.Out1.im = Out1_tmp * sin(Phase);
}/* Model initialize function */
void PhaseOffset_initialize(void)
{/* Registration code *//* initialize non-finites */rt_InitInfAndNaN(sizeof(real_T));
}/* Model terminate function */
void PhaseOffset_terminate(void)
{/* (no terminate code required) */
}

復數乘法移相

????????當一個復數乘以另一個相位角為θ的復數時,那么前者的相位就會偏移θ。如果后者是單位復數(模數為1),那么前者的模數不變,只跟隨θ旋轉相位角。用這種算法建立的移相函數如下所示:

4b7ddc4e5cee411c92b736c7de604bbf.png

????????Tips:exp(1i * offset) = cos(offset) + sin(offset)i

????????上述模型編譯出來的代碼,如下所示:

#include "PhaseOffset.h"
#include "PhaseOffset_private.h"/* External inputs (root inport signals with default storage) */
ExtU_PhaseOffset_T PhaseOffset_U;/* External outputs (root outports fed by signals with default storage) */
ExtY_PhaseOffset_T PhaseOffset_Y;/* Real-time model */
static RT_MODEL_PhaseOffset_T PhaseOffset_M_;
RT_MODEL_PhaseOffset_T *const PhaseOffset_M = &PhaseOffset_M_;/* Model step function */
void PhaseOffset_step(void)
{real_T r;real_T y_re;/* MATLAB Function: '<Root>/MATLAB Function1' incorporates:*  Inport: '<Root>/In2'*/if (PhaseOffset_U.In2 == 0.0) {y_re = exp(PhaseOffset_U.In2 * 0.0);r = 0.0;} else {r = exp(PhaseOffset_U.In2 * 0.0 / 2.0);y_re = r * cos(PhaseOffset_U.In2) * r;r *= r * sin(PhaseOffset_U.In2);}/* Outport: '<Root>/Out1' incorporates:*  Inport: '<Root>/In1'*  MATLAB Function: '<Root>/MATLAB Function1'*/PhaseOffset_Y.Out1.re = PhaseOffset_U.In1 * y_re;PhaseOffset_Y.Out1.im = PhaseOffset_U.In1 * r;
}/* Model initialize function */
void PhaseOffset_initialize(void)
{/* (no initialization code required) */
}/* Model terminate function */
void PhaseOffset_terminate(void)
{/* (no terminate code required) */
}

分析和應用

????????復數移相在嵌入式軟件開發中應用非常廣泛,尤其是在電源設計和電機控制領域。上述兩種移相算法都能實現相同的功能,但是具體運算過程略有差別,可以從兩者的C代碼中進行分辨。

????????三角函數移相主要用到的運算是arctan()、abs()、cos()、sin()等,復數乘法移相主要用到的運算是e^()、cos()、sin()等,其中的abs()實質是平方和開方,e^()也是n次方,所以底層運算基本上都是一樣的。

????????在matlab函數中,復數乘法移相的運算步驟更加精簡。在底層C代碼中,三角函數移相的運算步驟更加精簡。

????????綜上,可以根據自己的開發理念選取合適的移相算法。如果注重運行高效,就選擇三角函數移相。如果注重開發代碼精煉的,就選擇復數乘法移相。

總結

????????以上就是本人在研發中使用Simulink開發復數移相算法時,一些個人理解和分析的總結,主要介紹了兩種移相算法的工作原理,展示了算法運行的效果,并分析了這兩種算法的特點和適用場景。

????????后續還會分享另外幾個最近解鎖的Matlab/Simulink新技能,歡迎評論區留言、點贊、收藏和關注,這些鼓勵和支持都將成文本人持續分享的動力。

????????另外,上述例程使用的Demo工程,可以到筆者的主頁查找和下載。


????????版權聲明,原創文章,轉載和引用請注明出處和鏈接,侵權必究!

d79359df606148aabc98c6aef99a5519.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12243.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12243.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12243.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(三)Spring教程——依賴注入與控制反轉

Spring框架是為了簡化企業級應用開發而創建的&#xff0c;其強大之處在于對Java SE和Java EE開發進行全方位的簡化&#xff0c;Spring還對常用的功能進行封裝&#xff0c;可以極大地提高Java EE的開發效率。 依賴注入是Spring的核心技術之一&#xff0c;也被稱為“控制反轉”&a…

【Linux】自動化編譯工具——make/makefile(超細圖例詳解!!)

目錄 一、前言 二、make / Makefile背景介紹 &#x1f95d;Makefile是干什么的&#xff1f; &#x1f347;make又是什么&#xff1f; 三、demo實現【見見豬跑&#x1f416;】 四、依賴關系與依賴方法 1、概念理清 2、感性理解【父與子&#x1f468;】 3、深層理解【程序…

【JavaEE】HTTP 協議

文章目錄 一、HTTP 協議1、HTTP 是什么2、理解 "應用層協議"3、理解 HTTP 協議的工作過程4、HTTP 協議格式5、HTTP 請求 (Request)5.1 認識 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作過程3.1 對稱加密3.2 非對稱加密3.3 證書3.4 完…

零樣本身份保持:ID-Animator引領個性化視頻生成技術新前沿

在最新的研究進展中&#xff0c;由Xuanhua He及其團隊提出的ID-Animator技術&#xff0c;為個性化視頻生成領域帶來了突破性的創新。這項技術的核心在于其零樣本&#xff08;zero-shot&#xff09;人物視頻生成方法&#xff0c;它允許研究者和開發者根據單一的參考面部圖像生成…

深度解刨性能測試工具Locust

&#x1f345; 視頻學習&#xff1a;文末有免費的配套視頻可觀看 &#x1f345; 關注公眾號【互聯網雜貨鋪】&#xff0c;回復 1 &#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 Locust安裝 …

Python3 筆記:range() 函數

range() 函數返回數字序列&#xff0c;默認從 0 開始&#xff0c;默認以 1 遞增&#xff0c;并以指定的數字結束。 它的語法格式&#xff1a;range(start,end,step) start是起始值&#xff0c;end是終止值&#xff0c;step是間隔值 上述語句可以產生一個[start,…, end-1]列…

gin框架學習筆記(三) ——路由請求與相關參數

參數種類與參數處理 查詢參數 在講解查詢參數的定義之前&#xff0c;我們先來看一個例子&#xff0c;當我打開了CSDN&#xff0c;我現在想查看我的博客瀏覽量&#xff0c;那么我就需要點擊我的頭像來打開我的個人主頁,像下面這樣: 我們現在把瀏覽器的網址取下來&#xff0c;…

【35分鐘掌握金融風控策略27】貸中風控策略與客戶運營體系

目錄 貸中風控策略與客戶運營體系 貸中風控日標 貸中風控數據源 貸中風控策略與客戶運營體系 貸中是風控的第二道防線&#xff0c;貸中階段風控的重點工作就是存量客戶風控及運營。在當下&#xff0c;新客市場趨于飽和且獲客成本越來越高&#xff0c;所以&#xff0c;在做好…

基于Java的俄羅斯方塊游戲的設計與實現

關于俄羅斯方塊項目源碼.zip資源-CSDN文庫https://download.csdn.net/download/JW_559/89300281 基于Java的俄羅斯方塊游戲的設計與實現 摘 要 俄羅斯方塊是一款風靡全球&#xff0c;從一開始到現在都一直經久不衰的電腦、手機、掌上游戲機產品&#xff0c;是一款游戲規則簡單…

物聯網設計競賽_1_邊緣人工智能云計算

邊緣人工智能&#xff1a; 本質上邊緣人工智能&#xff0c;直接會在邊緣設備上運行機器學習算法&#xff0c;例如物聯網設備或邊緣服務器上&#xff0c;這樣可以減少數據傳輸延遲&#xff0c;提高響應速度。 云計算&#xff1a; 云計算模型中&#xff0c;數據通常被發送到遠…

在React中利用Postman測試代碼獲取數據

文章目錄 概要名詞解釋1、Postman2、axios 使用Postman測試API在React中獲取并展示數據小結 概要 在Web開發中&#xff0c;通過API獲取數據是一項常見任務。Postman是一個功能強大的工具&#xff0c;可以幫助開發者測試API&#xff0c;并查看API的響應數據。在本篇博客中&…

【C語言】—— 動態內存管理

【C語言】——動態內存管理 一、動態內存管理概述1.1、動態內存的概念1.2、動態內存的必要性 二、 m a l l o c malloc malloc 函數2.1、函數介紹2.2、應用舉例 三、 c a l l o c calloc calloc 函數四、 f r e e free free 函數4.1、函數介紹4.2、應用舉例 五、 r e a l l o …

無列名注入

在進行sql注入時&#xff0c;一般都是使用 information_schema 庫來獲取表名與列名&#xff0c;因此有一種場景是傳入參數時會將 information_schema 過濾 在這種情況下&#xff0c;由于 information_schema 無法使用&#xff0c;我們無法獲取表名與列名。 表名獲取方式 Inn…

Redis——Redis集群腦裂問題

Redis集群的腦裂問題&#xff08;Split-Brain&#xff09;是一個在分布式系統中可能發生的嚴重問題&#xff0c;特別是在基于主從復制和哨兵&#xff08;Sentinel&#xff09;機制的Redis集群環境中。以下是對Redis集群腦裂問題的詳細闡述&#xff1a; 定義 Redis集群腦裂問題…

FullCalendar日歷組件集成實戰(3)

背景 有一些應用系統或應用功能&#xff0c;如日程管理、任務管理需要使用到日歷組件。雖然Element Plus也提供了日歷組件&#xff0c;但功能比較簡單&#xff0c;用來做數據展現勉強可用。但如果需要進行復雜的數據展示&#xff0c;以及互動操作如通過點擊添加事件&#xff0…

SwiftUI中的常用圖形(Shapes)

概述 在SwiftUI中&#xff0c;常用的圖形&#xff08;Shape&#xff09;主要有&#xff1a; Circle&#xff1a;圓形 Ellipse&#xff1a;橢圓形 Capsule&#xff1a;膠囊形 Rectangle&#xff1a;矩形 RoundedRectangle&#xff1a;圓角矩形 上面的這些圖形都繼承了Shape協議…

DFA算法 敏感詞過濾方案匯總以及高效工具sensitive-word

敏感詞過濾方案匯總以及高效工具sensitive-word 導入pom文件 <dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version>0.12.0</version> </dependency>接下來我們編寫相關測試類…

解四層負載和七層負載:Nginx 的應用示范

在網絡架構中&#xff0c;負載均衡是分配網絡或應用程序流量到多個服務器的技術&#xff0c;以優化資源使用、最大化吞吐量、最小化響應時間和避免任何單一資源的過載。Nginx&#xff0c;作為一款強大的HTTP和反向代理服務器&#xff0c;能夠處理七層&#xff08;應用層&#x…

深入剖析JVM、JDK和JRE的區別與聯系

在Java開發和運行過程中&#xff0c;JVM、JRE和JDK是三個核心組件。理解它們的區別和聯系是每個Java開發者的基礎技能。本文將深入探討這三個組件的作用、組成及其在實際應用中的重要性。 一、Java虛擬機&#xff08;JVM&#xff09; **JVM&#xff08;Java Virtual Machine&…

Hive讀寫文件機制

Hive讀寫文件機制 1.SerDe是什么&#xff1f; SerDe是Hive中的一個概念&#xff0c;代表著“序列化/反序列化” &#xff08;Serializer/Deserializer&#xff09;。 SerDe在Hive中是用來處理數據如何在Hive與底層存儲系統&#xff08;例如HDFS&#xff09;之間進行轉換的機制…