为什么是桌子?当信号为 -20db 时,这个非常快速的函数在 -90db 处具有最差的噪声峰值。这真是太好了。
对于音频的重采样,我总是使用 Elephant 论文中的一种插值器。这在之前的 SO question中讨论过。
如果你在没有 fp 的处理器上,你仍然可以做这些事情,但它们更难。我去过那儿。我感觉到你的痛苦。祝你好运!我曾经为了好玩而将 fp 转换为整数,但现在你必须付钱给我。:-)
适用于您的问题的酷在线参考:
http://www.audiomulch.com/~rossb/code/sinusoids/
http://www.dattalo.com/technical/theory/sinewave.html
编辑:基于您的评论的其他想法
由于您正在使用一个棘手的处理器,也许您应该研究如何使您的正弦表有更多的角度可供查找,但仍然保持较小。
假设您将一个象限分成 90 个部分(实际上,您可能会使用 256 个部分,但为了熟悉和清晰,我们将其保留为 90 个部分)。将它们编码为 16 位。到目前为止,这是 180 字节的表。
现在,对于这些度数中的每一个,我们将有 9 个(实际上可能是 8 或 16 个)中间点。
我们以 3 度到 4 度的范围为例。
sin(3)=0.052335956 //this will be in your table as a 16-bit number
sin(4)=0.069756474 //this will be in your table as a 16-bit number
所以我们要看看 sin(3.1)
sin(3.1)=0.054978813 //we're going to be tricky and store the result
// in 8 bits as a percentage of the distance between
// sin(3) and sin(4)
您要做的是弄清楚 sin(3.1) 如何介于 sin(3) 和 sin(4) 之间。如果介于两者之间,则将其编码为 128 的字节。如果介于两者之间的四分之一,则将其编码为 64。
那是额外的 90 个字节,并且您在 16 位分辨率中仅在 180+90*9 字节中编码到十分之一度。您可以根据需要进行扩展(可能达到 32 位角度和 16 位补间角度)并在两者之间快速线性插值。为了最大限度地减少存储空间,您正在利用连续值彼此接近的事实。
编辑 2:在表格中编码中间角度的更好方法
我只记得当我这样做时,我最终非常紧凑地表达了根据线性插值的期望值与实际值之间的差异。这个错误总是在同一个方向。
我首先计算了该范围内的最大误差,然后以此为基础。
工作得很好。我觉得我应该在博客条目中编写代码来说明。:-)