16 位微控制器上的正弦函数
我需要生成一个正弦波来填充大小为1024的字符表。微控制器上的字大小是16位,并且浮点运算不可用。
正弦波本身会在 0 到 255 的值之间振荡,以 127 为中心点。
有什么想法吗?
I need to generate a sine wave to fill a char table of size 1024. The word size on the microcontroller is 16-bit and floating-point operations are not available.
The sine wave itself will oscillate between the value of 0 to 255, with 127 being the center point.
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您实际上只需要存储正弦波的四分之一 - 您可以从第一象限查找其他四分之三。所以你只需要 256 字节。
要在微控制器上生成值,请实施 CORDIC。您可以存储一个值,并从中生成整个正弦波。
You only actually need to store one quarter of the sine wave -- you can lookup the other three quarters from the first quadrant. So you only need 256 bytes.
To generate the values on the micro controller, implement CORDIC. You can store one value, and generate the whole sine wave from that.
在您的 PC 上创建一个预先计算的数组。如果 ROM(或同等物,例如闪存或代码段)空间非常宝贵,则只需创建阵列的四分之一,然后将此部分镜像到阵列的其他 768 字节。
Create a precomputed array on your PC. You only have to create a fourth of the array if ROM (or equivalent, such as flash or code segment) space is at a premium, then mirror this part out to the other 768 bytes of the array.
使用 float 以您最喜欢的语言编写 sin 表生成器。
将结果缩放并舍入到所需范围 1024/-127..+128(您可以立即执行此操作)。
从表中,生成 ASM 或 C 语言的源文件,哪种更适合您。
确保生成的表在 C 中标记为“const”,或者转到 ASM 中的适当部分,以便它进入闪存而不是 RAM。
将该文件包含在您的项目中。
现在 intsin(x)1 为:
您可以仅使用第一象限的表来提高分辨率。您也可以仅使用正值(0..255)。然后你的 intsin(x) 需要确定象限并镜像第一象限结果。
Write a sin table generator in your favorite language using float.
Scale and round the results to desired ranges 1024/-127..+128 (you may do that right away).
From the table, generate a source file in ASM or C, what ever works better for you.
Make sure the generated table in marked "const" in C or make go to a approbiate section in ASM so it goes to FLASH rather than RAM.
Include the file in your project.
Now intsin(x)1 is:
You can improve resolution by using the table for the first quadrant only. You can than use positive values only, too (0..255). Then your intsin(x) would need to determine the quadrant and mirror the first quadrant results.
您只需在 PC 上生成表格并在 MCU 上使用它即可。正如有人说你只需要一个四分之一周期,但为了完整回答你的问题,这里有所有 1024 个字符:
You just generate table on your PC and use it on your MCU. As somebody said you just need a quater period, but to answer your question fully, here are all 1024 chars: