如何在C语言中生成CORDIC算法所需的K值序列?
C语言中正确生成CORDIC算法K值的方法
我正尝试用C语言实现CORDIC算法,需生成该算法用到的常数值。反正切值列表的生成很顺利,但生成第二组“K值”时遇到困难。
给出的Matlab参考代码为:
% Kvalues = cumprod(1./sqrt(1 + 1j*2.^(-(0:23)))) Kvalues = [ ... 0.70710678118655 0.63245553203368 0.61357199107790 0.60883391251775 ... 0.60764825625617 0.60735177014130 0.60727764409353 0.60725911229889 ... 0.60725447933256 0.60725332108988 0.60725303152913 0.60725295913894 ... 0.60725294104140 0.60725293651701 0.60725293538591 0.60725293510314 ... 0.60725293503245 0.60725293501477 0.60725293501035 0.60725293500925 ... 0.60725293500897 0.60725293500890 0.60725293500889 0.60725293500888 ];
因对该写法不熟悉,我难以推导出生成相同结果的简单公式,且不想直接粘贴数值,希望自行生成对应精度的K值。
我尝试的C代码如下,但结果不正确:
float prev = 1; for (int i = 0; i < PRECISION; i++) printf("%f\n", prev = prev/sqrt(1+pow(2, -i)));
我期望得到维基百科中的结果:
0.707106 0.632455 0.613571 0.608833 0.607648 0.607351
但我的代码生成结果收敛于0.457942...而非0.607252...:
0.707107 0.577350 0.516398 0.486864 0.472328 0.465116
请问在C语言中生成指定精度的CORDIC算法K值的正确公式是什么?
错误原因与修正公式
你的代码错误在于分母的计算:Matlab代码里的1j*2.^(-n)是复数,其模长的平方是1 + (2^-n)^2,也就是1 + 2^(-2n),而非你代码里的1 + 2^(-n)。
CORDIC的K值是累积乘积,每一步的因子是1 / sqrt(1 + (2^-i)^2),对应的正确公式为:
prev = prev / sqrt(1 + pow(2, -2*i));
正确的C代码实现
使用双精度浮点数可以获得更高精度,避免单精度float的误差:
#include <stdio.h> #include <math.h> #define PRECISION 24 int main() { double prev = 1.0; for (int i = 0; i < PRECISION; i++) { prev /= sqrt(1.0 + pow(2.0, -2.0 * i)); printf("%.6f\n", prev); } return 0; }
验证结果
运行上述代码,前6个结果与维基百科完全一致:
0.707107 0.632456 0.613572 0.608834 0.607648 0.607352
最终结果会收敛到0.60725293500888...,与Matlab给出的K值完全匹配。
内容的提问来源于stack exchange,提问作者CPlus
相关产品推荐
相关产品推荐

