【研发日记】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.hqwc.cn/news/700290.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NARUTO 复现记录

1 环境配置 下载项目&#xff0c;一定要 git 下载全项目&#xff0c;下载完后要检查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 环境配置 注意 bash scripts/installation/conda…

为什么使用AI 在游戏中不犯法

使用AI在游戏中本身并不违法&#xff0c;甚至在很多情况下&#xff0c;游戏公司自己也会在游戏中集成AI来提高游戏体验&#xff0c;例如通过AI驱动的非玩家角色&#xff08;NPC&#xff09;来增加游戏的互动性和挑战性。然而&#xff0c;使用AI是否违法取决于AI的使用方式和目的…

项目-坦克大战-让坦克动起来

为什么写这个项目 好玩涉及到java各个方面的技术 1&#xff0c;java面向对象 2&#xff0c;多线程 3&#xff0c;文件i/o操作 4&#xff0c;数据库巩固知识 java绘图坐标体系 坐标体系-介绍 坐标体系-像素 计算机在屏幕上显示的内容都是由屏幕上的每一个像素组成的像素是一…

vue3 element plus el-date-picker组件在日期上做标识

1.先看效果图,带红点的就是我要做标识的日期 2.直接把代码拿出来就可以用 (1)html部分 <el-date-pickerv-model"startTime"type"datetime"placeholder"选择开始日期"format"YYYY-MM-DD HH:mm"value-format"YYYY-MM-DD HH:mm…

centos7安装zabbix-server

zabbixan-server安装 环境安装zabbix安装zabbix配置apachezabbix-UI前端配置修改zabbix为中文语言 环境 准备&#xff1a; centos7系统、mysql数据库/MariaDB数据库 mysql数据库可参照&#xff1a;https://blog.csdn.net/weixin_61367575/article/details/138774428?spm1001.…

CSS2(一):CSS选择器

文章目录 1、CSS基础1.1 CSS简介1.2 CSS编写位置1.2.1 行内样式1.2.2 内部样式1.2.3 外部样式1.2.4 样式优先级 1.2.5 CSS代码风格 2、CSS选择器2.1、基本选择器2.1.1 通配选择器2.1.2 元素选择器2.1.3 类选择器2.1.4 ID选择器2.1.5 总结 2.2、CSS复合选择器2.2.1 交集选择器2.…

【Viso画图】Viso导出与图形适配的pdf

step1:选中开发工具点击shapeSheet&#xff0c;选中页 step2&#xff1a;进入页面参数设置窗口&#xff0c;将下面框选的参数设为0,enter后保存 目前效果&#xff1a; step3:选中设计->大小&#xff0c;选择适应页面大小或者自己根据图片调整 目前效果&#xff1a; step4: 以…

memset函数

让我们先看两个代码 memset(dp, 0x3f, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; memset(dp, 127, sizeof(dp)); for (int i 0; i < 5; i)cout << dp[i] << " "; 代码结果如下&#xff1a; 现在我们来分…

短视频最后的慢动作怎么做:成都鼎茂宏升文化传媒公司

短视频最后的慢动作怎么做&#xff1a;技巧与创意实践指南 在短视频创作的浩瀚宇宙中&#xff0c;慢动作特效如同一颗璀璨的星辰&#xff0c;为作品增添无限魅力与情感深度。它不仅能够放大细节之美&#xff0c;还能延长关键瞬间&#xff0c;引发观众强烈的情感共鸣。短视频最…

idea2023.3.2版本全局设置maven地址

idea每次新建项目都默认使用了一个user目录下的地址&#xff0c;而不是自己安装的maven地址&#xff0c;每次创建项目后&#xff0c;都要重新从settings中设置一下maven地址。 可以全局修改&#xff1a;首先在File-->Close Project回到idea最开始的界面 然后在Customize里点…

luci框架相关笔记

luci架构 LuCI 架构采用了MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;各个目录的作用如下&#xff1a; model&#xff08;模型&#xff09;: 位于 /usr/lib/lua/luci/model 下&#xff0c;存放了与系统配置相关的模型脚本。这些脚本负责与底层系统…

【JavaWeb】Day77.Spring——SpringBoot原理(一)

SpringBoot原理 Spring是目前世界上最流行的Java框架&#xff0c;它可以帮助我们更加快速、更加容易的来构建Java项目。而在Spring家族当中提供了很多优秀的框架&#xff0c;而所有的框架都是基于一个基础框架的SpringFramework(也就是Spring框架)。而如果我们直接基于Spring框…