一次智障的尝试

今天应老板的要求,需要做一个matlab调频的仿真。折腾了很久,后来终于用一个极其SB的方法搞定了。

事情的起源是这样的:实验室代代相传下来的模型是整数结构的一套工具。本着线性近似糙点无所谓的原则,直接把分频比改成小数先凑合着仿环路参数了。完了带宽设置了400KHz,仿真效果锁定时间快的飞起。我告诉老板这个时间很快,老板坚持要看一下跳频的仿真。

我心里一句MMP:这尼玛很多余啊。。。根据我看论文的感受,基本上带宽上百K的都不存在锁定时间的问题。。但老板既然要求了,我也不好说啥。。。。就想办法弄呗。

现在我的目标很简单,就是在仿真的中间某一个时刻,改变分频器的分频比。

首先百度了一下实时传递simulink参数。看了一堆头晕的说明。后来看到修改mask,调用函数实现参数传递。找了一段代码折腾了一下,发现不行。把什么callback设置的openFcn,loadFCn,startFcn都试了一遍,还是不行。最后看到网上介绍说什么smulink一旦仿真开始,就无法改变变量。。。晕

后来百度到了一个matlab程序猿的博客,里面记录了用m脚本仿真的办法,实时修改simulink里面某个值的增益;

看它的思路很清晰,就是设置了时间以后跑仿真,就ok了。我照样抄了一段代码改改,发现不行。

于是我意识到,代码头上有一段set_Param函数的使用,莫非是这一段函数的问题?然后看这个作者说是抄的某本书。后来搜matlab论坛里面有人也提问实时修改仿真参数的问题,接着搜到了这本书(Simulink仿真及代码生成技术 入门到精通),并且在脚本之家里面down了一本电子版。

这本书的作者大佬亲自在论坛里面回答了提问,顺着帖子我找到了书的186页实时修改的那一段。接着按照书上的例子操作了一遍。总结在仿真中间修改仿真参数地思路如下:

1、set_Param里面有一个SimulationCommand参数,可以设置它的值为start、pause、step、continue和stop,从而实现simulink的控制。

2、使用定步长的解法,设置一个变量t记录仿真时间,用while语句去对t判断。在while里面不停地用step仿真即可。注意添加pause避免指令执行时间快过上一步仿真时间,造成时序错误。

按照这个思路,本来以为终于拨云见日了。如法炮制了一段m脚本以后,一点,僵硬了,simulink页面跳出了error。

原因是什么呢?因为仿真系统里面有continous的模型,无法用定步长仿真。行吧,那就改回变步长ode45仿真。

然后接着跑,悲剧地发现仿真速度奇慢无比。。。orz

由于鄙人不善于用debug。。。所以我找错的方式就是各种各样地改位置和插flag,经历了n次的软件奔溃死机重启后,终于找到了原因。。。因为改用变步长以后,仿真的每一步时间都非常短,大概在-15(fs)量级。这TM就悲剧了,我跑一步就走一次while指令的循环,相当于原来跑一步的时间,都多了几百倍,所以就很慢了。

然后我就研究,有没有什么办法不用while循环,直接等simulink仿真到时间点,停住,改变参数,再仿真呢?

这就想到了pause函数。我试着用pause函数,实践证明并没有什么软用。

这就很迷了。为什么matlab这么奇怪,我simulink仿我的,你m文件跑你的,有什么毛病?

还真有毛病:百度到:matlab不支持多线程。。。so这就很清楚了,m和simulink都在一个栈下面玩,m文件停了,simulink也自动停了。

这时候感觉很绝望了。。。搞了一整天,最后发现,这个事一开始不可能。。。。(另外下午还被实验室的老头集体批了一顿,真的不想提这个老瓜皮了。。。甩货。。。)

正当我想给老板发一条微信说这事不行的时候,我想最后再努力抢救一下,毕竟一天下来交代个0鸭蛋很不好看。百度了一下发现,matlab为了弥补不支持多线程,有一个定时器timer函数。但time的介绍看得我头大。。。

然后我想到,为什么一定要用M文件定时呢?既然M文件跳到了simulink,那么simulink里面有没有定时工具呢?一搜还就找到了一个,clock,配合switch,就可以实现定时切换了。

这时候我突然想到,好SB啊,直接把固定增益模块替换成这个定时的模块,不就OK了吗。。。但是增益怎么设置输入呢。。。

这时候万能的百度再一次告诉了我答案:把增益(gain)模块改成相乘(product)就行了。。。。orz.。。。好机智

然后就修改了一下,WOC!

一个之前觉得异常复杂的问题,结果用这个非常easy的方法搞定了。想想折腾的一天,觉得。。。虽然我很SB。。。但还是很高兴的。。。另外,我现在开始有些怀念码代码的生活了,可能因为做电路和实验室的糟心事太多了。。。我觉得还是码代码爽一点。而且从一天百度的经过来看,码农的技术分享讨论氛围比做电路的热烈得多了。最后补一张一天的战斗成果(就为了下面的一根线)。(我发现TM做模拟的也太难了,数字信号,matlab都要玩得起来,以后搞不好还要学个skill或者python画版图快一点……)