Matlab/C/Java 中的正弦函数或数字系统中的任何其他程序
Posted
技术标签:
【中文标题】Matlab/C/Java 中的正弦函数或数字系统中的任何其他程序【英文标题】:Sine function in Matlab/C/Java or any other program in digital systems 【发布时间】:2012-06-27 15:13:20 【问题描述】:Matlab/C 如何生成正弦波,我的意思是它们是否存储每个角度的值?但如果他们这样做,那么需要存储无限的值。
【问题讨论】:
How do Trigonometric functions work? 的可能重复项 【参考方案1】:仅使用任何现代数字计算机上可用的基本算术运算符来计算角度正弦的例程有很多很多。 the CORDIC algorithm 就是其中之一,但只有一个例子。我不知道 Matlab 对三角函数使用什么算法。
计算机不会简单地在存储的值表中查找三角函数的值,尽管当前使用的一些算法确实会在存储的表中查找临界值。这些表包含的内容是特定于算法的,可能不符合对三角表的天真期望。
请注意,这个问题在 SO 上已被多次询问,this answer 似乎是他们的选择。
【讨论】:
次要问题,但是如果您查看 CORDIC 算法文章,您会发现它们确实存储了三角表;对于集成 FPU 中的 Intel CPU。【参考方案2】:不,他们通常不会。即使他们这样做了,不,没有“无限价值”。数字有限(真实)计算机不能很好地处理无限,但这同样适用于角度(正弦函数的输入)。您不能要求“每个”角度,因为角度本身必须以有限的位集表示。
我认为使用Taylor series 很常见,或者其他基于插值的解决方案。
此外,现代 CPU:s 具有计算正弦的指令,但这当然只是将它如何实现的问题推低了一个或三个级别。
有关详细信息,另请参阅this very similar question。
【讨论】:
我不认为泰勒级数在现代数字计算机上用于三角函数计算。【参考方案3】:在 90 年代之前,计算机会使用基本函数加减乘除对正弦函数和其他三角函数进行数值计算。计算它们的算法通常包含在基本编译器库中。在某些时候,可以添加一个可选的硬件处理器,称为浮点处理器 (FPU)。我对 FPU 的理解是它确实存储了三角函数的硬值。随着 FPU 的加入,计算三角函数的速度将显着提高。然而,自 90 年代以来,FPU 已与 CPU 捆绑在一起。
我似乎找不到任何关于 FPU 如何准确实现正弦和其他三角函数的明确描述,通常这是留给设计芯片的电气工程师的实现细节。然而,实际上只需要知道从 0 到 pi/2 的值。其他一切都可以从这些值轻松计算出来。
编辑:好的,这是在 FPU 上使用的实现:CORDIC,我在 answer 找到了它。
【讨论】:
以上是关于Matlab/C/Java 中的正弦函数或数字系统中的任何其他程序的主要内容,如果未能解决你的问题,请参考以下文章
数字信号处理相关函数应用 ( 正弦信号 的 自相关函数 分析 二 | 在白噪声中检测正弦信号 )