为了好玩,我正在 8 位微 Controller (HCS08) 上实现 FFT 算法。算法完成后,我将有一个 8 位实数/虚数对的数组,我想找出每个值的大小。也就是说,如果 x 是复数,我想找到
|x| = sqrt(Re{x}^2 + Im{x}^2)
现在我可以使用一个 16 位寄存器和一个 8 位寄存器。我想过将它们平方,相加,然后取结果的平方根,但这带来了一个问题:两个 8 位数字的平方和的最大可能值是 ~130k,它大于16 位寄存器可以容纳的最大值 (65.5k)。
我想出了一个计算 16 位数字的整数平方根的子程序,它似乎运行良好,但显然我不能保证使用适合 16 位的值。我现在的想法是有一种算法可以直接近似我需要的东西,但我似乎找不到任何东西。任何想法将不胜感激。
总结一下:假设我有一个包含两个 8 位分量的向量,我想找到向量的长度。如何在不实际计算平方和平方根的情况下近似这个?
谢谢!
最佳答案
有一个网页描述了 Fast Magnitude Estimator .基本思想是对等式进行最小二乘(或其他高质量)拟合:
Mag ~= Alpha * max(|I|, |Q|) + Beta * min(|I|, |Q|)
对于系数 Alpha 和 Beta。列出了几个系数对,包括均方误差、最大误差等,包括适用于整数 ALU 的系数。
关于assembly - 在微 Controller 上逼近两个平方和的平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527790/