繁体   English   中英

sin 的 LUT:在 Matlab 中计算 x 的 sin

[英]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)将获得tablevalue完全匹配的索引。 它可能返回 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM