发 帖  
原厂入驻New
[问答] 如何使用微芯片DSP和浮点库?
148 PIC32MX DSP 代码
分享
大家好,我有一个在PIC32MX系列中运行的姿态计算算法,声明的矢量和矩阵的格式是双重的,并且来自该算法的操作是矩阵运算,如乘积、加法、矩阵指数……一切都很好,但是太慢了(我想在一半的时间里执行它)。因此,在尝试PIC32MZ(有点贵的启动器套件加上用于启动器套件扩展板的适配器板)之前,我想优化代码,其中许多操作可以在DSP单元中进行,并且我查看了微€€芯片DSP和浮点库,但是DSP功能ons被声明为int32_t或int16_t格式……问题是,我不知道如何使用这些库,以便更有效率或加速算法,而所有内容都采用双格式……也许唯一的解决办法是跳转到有一个FPU单元的PIC32 MZ……不是吗?提前感谢
0
2019-9-16 10:15:23   评论 分享淘帖 邀请回答

相关问题

13个回答
我想这就是主要问题,最终的结果是在这个范围[-180.0,+180.0]内只有一个小数位数的欧拉度。关键是要得到这个结果,有很多运算,而且数目很小,而且最后的结果必须尽可能精确,而且不确定性很小。因此,我不知道如何才能将正确的格式设置得足够精确,并且不使用火箭筒来杀死苍蝇……对于整数情况(修复)d点),我想你的建议是把所有的数字乘以尽可能大的数字,在任何情况下不超过2_,不是吗?这样做,我可以使用微芯片优化的DSP库。
2019-9-16 10:57:33 评论

举报

…一旦你做到了,你就可以得到你需要的所有速度增长:
2019-9-16 11:16:33 评论

举报

也许规模为2 ^ N而不是10 ^ N/ Ruben
2019-9-16 11:31:18 评论

举报

我猜缩放只用于线性运算,所以我认为一种可能性是在执行最繁重的运算之前缩放数字,例如作为矩阵/数组乘积,而在将非线性运算转换为cos、sin后缩放为double之后……但是,我如何选择正确的sca?如果每一个数字在1到1之间,那么LIN值?像这样的东西吗?(1)& 2;30 - 1 ->2 ^ 31。还有一个问题只是出于好奇,如果使用带有FPU单元的微控制器作为PIC32MZ,我可以将一切声明为浮点或双点,剩下的由编译器和处理器来完成?谢谢你的帮助,问候,安德鲁
2019-9-16 11:47:23 评论

举报

安德烈斯,听起来你正在做AHRS或其他惯性/组合导航系统,你可能想保持四元数的姿态,只是为了输出而转换为欧拉角,因为欧拉角可以在姿态更新中引入奇点。使整个计算脱轨。根据我在文献中看到的,即使使用适当的实现,由于动态范围(至少在LLH帧实现中,可能不是ECEF),float32也常常没有足够的数值精度。ER成本。200MHz的原始(有缺陷的)MZ芯片可以足够快地模拟双精度浮点,以便机械化在~125Hz的惯性,同时为几个传感器流(GPS,baro)在1Hz的22状态卡尔曼滤波器更新留下CPU功率。新的带有浮点单元的PIC32MZEF芯片可以在我的基准测试中更快地运行此代码。在我个人看来,这是手头问题足够复杂而不必担心完善定点实现的情况之一。
2019-9-16 11:55:10 评论

举报

嗨,艾登,实际上这就是我的目标,我在Matlab开始我的代码,在我把它导出到MPLAB之后,一切都正常,但是它运行太慢了,特别是指数矩阵的计算。在使用PIC32 MZEF的情况下,如果满足时间约束,仍然可以将变量声明为双变量吗?谢谢!
2019-9-16 12:13:06 评论

举报

嗨,从matlab开始进行调试是个好主意。我还建议你为每个函数编写一个测试脚本,其中包含一组输入和预期输出,这样你就可以在PIC目标上运行相同的测试,并确保你得到的输出是位准确的。在PIC32MZECH上,我声明了双精度的东西,但是您可能希望参照这个线程http://www.micro..com/for./m683940.aspx。添加-fno-.-double参数非常重要,否则XC32编译器会很高兴地将所有内容转换为32位浮点数,如详细解释的那个论坛。我强烈建议跳过第一代PIC32MZ设备,因为它们充满了bug,只要直接使用FPU转移到PIC32MZEF即可。在这个实现中,使用64位浮点而不是32几乎没有速度损失(换句话说,FPU不支持SIMD,因此除了高速缓存/带宽方面的考虑之外,使用浮点32没有性能优势,这非常小)。当使用软浮点时,可以尝试对PIC32MZECH工作得很好的PIC32MX进行优化,其中之一是针对密集矩阵和稀疏矩阵分别具有矩阵乘法/加法等函数,并根据代码中每个点预期的需要调用它们。在PIC32MZEC(也可能是PIC32MX)上,浮点运算需要很多周期,因此当使用稀疏矩阵显式检查每个元素以查看它是否是0而不是进行乘法时,它实际上更快。如果我还记得,使用稀疏矩阵时,吞吐量几乎翻了一番(比如卡尔曼滤波中的phi矩阵):当乘以稀疏矩阵时,使用软浮点时,在旧版本的XC32下,这实际上更快。可能需要双重检查以确保情况仍然如此。
2019-9-16 12:26:07 评论

举报

这是一个非常有用的信息。我必须说我的矩阵不是真正的矩阵,我已经将它们声明为向量,数据按列主次序存储(即“double MatrixA[3*3]”),我想这没什么关系(不是吗?)你说Mult/Addio的单独功能是什么意思?实际上,我有一个函数用于矩阵相加,另一个函数用于乘法,你的意思是先计算乘法后计算矩阵相乘?这就是我如何计算矩阵乘法:
2019-9-16 12:37:32 评论

举报

嗨,关于矩阵和向量的声明,我确信存在差异,但幸好在C语言中,可以把它们看成几乎可以互换的。处理稀疏矩阵与处理密集矩阵的单独函数。例如,这里是用于基准和验证数字正确性的测试程序的一部分:
2019-9-16 12:56:36 评论

举报

我看到你也使用向量代替矩阵。稀疏函数和稠密函数有什么区别?我猜你检查值是否为零,以避免当前的操作,正如上面提到的稀疏函数,但是稠密?它像正常乘法而不检查零点吗?
2019-9-16 13:13:13 评论

举报

是的,我像你一样使用向量,并传入每个矩阵的维数。如果维数是有效的,还要检查函数,如果维数无效,函数返回错误。不同之处在于,不是在我上一篇文章中发布的代码,而是在它之前的代码,它只检查每个元素任何一个元素都是零。这很简单,但帮助很大。
2019-9-16 13:32:39 评论

举报

好的,谢谢你的帮助,现在我想我会成功解决这个问题!
2019-9-16 13:47:37 评论

举报

嗨,我在另一个线程中为用户做了一些测试,用户正在询问PIC32ZEF的近似FLOP性能是什么,我重新运行了对密集函数和稀疏函数的比较。在XC32 v1.40下,这个间隙比我过去记得的要小得多,这意味着软浮点代码必须从XC32 v1.32开始优化。现在我的密集函数和稀疏函数之间的改进只有8%——与我去年注意到的2x因子相差很远!我测试了一个MX目标,结果是相同的软浮动。这个8%的改进真的不再值得了,因为我正在测试的稀疏矩阵中只有3个元素,但是由于零检查开销,它仍然勉强领先。我建议不要做这个检查,因为矩阵必须非常稀疏地填充,否则它最终会花费更多的周期而不是更少的周期。
2019-9-16 13:53:23 评论

举报

只有小组成员才能发言,加入小组>>

65个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表