[英]LUT for sin: calculation sin of x in Matlab
我在 Matlab 中通过 LUT 测试 sin 计算。
Nsamples_LUT = 2^10;
Nbits_sine_LUT = 14;
sine_LUT = sin( (0:Nsamples_LUT-1) / Nsamples_LUT * 2 * pi ) * (2^(Nbits_sine_LUT-1)-1) ;
我创建了一个 sin LUT,并给它一个角度。
在 Maltab 我写道:
k = find(sinLUT==angle) % to find an index
phi = sinLUT(k)
但它没有找到索引。
我应该如何从 LUT 中找到 sin 值?
目前尚不清楚您要做什么,但是假设您要获得列表值...
您需要区分查找表输入(如果要计算sin
则为角度)和输出(来自各种角度的sin
值表)。 第一个片段中的sin_LUT
具有一些缩放的正弦值,但该变量不存储有关这些值是如何产生的信息,特别是没有关于它们对应的角度的信息。 也就是说, (0:Nsamples...
不存储为sin_LUT
的一部分。您需要第二个包含输入值的表。Matlab 中的典型查找表将如下完成:
angles = linspace(0, 2 * pi, 2^10);
angles = angles(:); % interp1q requirs a column vector
sinLUT = sin(angles);
angle = 2 * pi * rand;
ansLUT = interp1q(angles, sinLUT, angle);
fprintf('angle %g, sin %g, from LUT %g\n', angle, sin(angle), ansLUT);
还有比interp1q
interp1
后者更快,但仅用于线性插值,输入值表(上面的angles
)必须单调递增。 前者可以做其他类型的插值,而不仅仅是线性的。
执行find(table == value)
将获得table
与value
完全匹配的索引。 它可能返回 0 个或多个值。 如果value
碰巧有一些浮点舍入错误,你将一无所获(这可能是你正在发生的事情)。
如果您有一个线性间隔的值数组,并且想要找到某个特定值所在的存储桶,则最好减去第一个数组值,除以间距,然后四舍五入为整数。 这将立即为您提供位置,而无需像find
那样搜索。 它对轻微的舍入误差很稳健。
您的查找表填充了正弦结果。 即使您修复了浮点比较错误(100% 也对您造成影响),您实际上并没有在此处进行有效检查,因为您的查找表中根本没有任何角度信息可供轮询。
您需要获得与创建表格时相同的比例,并使用该比例将角度转换为索引。 然后您可以将该索引传递给您的查找表并获得结果。
您将在查找表中找到的唯一内容是正弦结果,而不是角度。
:编辑:
对此答案有两次反对,哈哈,但也许人们不理解我在说什么? OP 不能执行以下操作:
find(sinLUT==angle)
因为sinLUT
没有角度。 您永远找不到超出 +/- 1 范围的任何东西,因为正弦的最小/最大输出为 +/- 1。
OP 需要做的是将角度转换为索引并使用该索引来访问查找表中的值。 例如,如果您以毫度为增量创建查找表,那么您会将 30.2 度转换为 30200 并获得正弦值作为result = sinLUT(30200);
.
但同样,正如我上面所说,您不能只将任意角度传递给查找表,您必须传递与表中的索引相对应的角度。 您可以根据相邻条目进行插值,但这超出了此问题的范围。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.