在微控制器上逼近两个平方和的平方根

use*_*599 5 microcontroller assembly signal-processing numerical-methods

我正在努力在8位微控制器(HCS08)上组装FFT算法以获得乐趣.一旦算法完成,我将有一个8位实/虚对的数组,我想找到每个值的大小.也就是说,如果x很复杂,我想找到

|x| = sqrt(Re{x}^2 + Im{x}^2)  
Run Code Online (Sandbox Code Playgroud)

现在我有一个16位寄存器和一个8位寄存器.我想到只是对它们进行平方,添加它们,并取结果的平方根,但这会产生一个问题:两个8位数的平方和的最大可能值为~130k,大于16位寄存器可以容纳的最大值(65.5k).

我想出了一个子程序,它计算一个16位数的整数平方根,这似乎运行良好,但显然我不能保证使用适合16位的值.我现在的想法是,有一种算法能够直接逼近我需要的算法,但我似乎找不到任何东西.任何想法将不胜感激.

总结一下:假设我有一个带有两个8位组件的向量,我想找到向量的长度.如何在不实际计算平方和平方根的情况下估算这个?

谢谢!

hot*_*aw2 6

有一个描述快速幅度估算器的网页.基本思想是使方程符合最小二乘(或其他高质量):

Mag ~= Alpha * max(|I|, |Q|) + Beta * min(|I|, |Q|)
Run Code Online (Sandbox Code Playgroud)

对于系数Alpha和Beta.列出了几个系数对,其具有均方误差,最大误差等,包括适用于整数ALU的系数.


Mar*_*som 4

如果总和大于 65535,则除以 4(右移 2 位),开平方,然后乘以 2。您将损失一位精度,自然不能保证结果适合 8位。