怎样很好的恢复一个正弦波信号

很多时候需要去产生一个正弦波信号,比如步进电机的多细分控制。一般的,会用到DAC。这里有一个问题,用DAC去输出一个个离散数值来拟合正弦波的时候,DAC的有效位数对拟合出的正弦波精度有多大影响呢?或者说,要用多少位的DAC才能很好的拟合出所要的正弦波?(这里说的是有效位数,也就忽略了DAC器件本身的特性,认为DAC是理想元件)

很多年以前王小Q在做步进细分的时候就有这样一个疑问,当时年纪小,做事情不求甚解,最近又要搞一次,决定把这个问题彻底搞清楚。

使用DAC输出离散数值拟合正弦波,是一种等时间间隔的波形恢复方式。被恢复正弦波的幅度可以依靠DAC的参考REF以及后级信号放大电路来调节,被恢复正弦波的频率可以通过改变DAC的频率来调节,为方便分析,对正弦波的幅度归一化用“1”,而对频率不予考虑。同样为简单起见,规定正弦波半波幅度被分成2N份。

举个实际的栗子,细分芯片A3967可以按照如下图1所示对一个完整正弦波等时间均匀的分成4个2N等份,N=2,(这个叫做步进驱动的2N=4细分),其中,半波幅度被分成38.3%、70.7%、100%几个值,很显然,用一个N=2位的DAC不能很好的拟合出这样一个16等分的正弦波,因为即使不必考虑正负,2位DAC的最小分辨幅度只有1/2^2=25%,用几个整数倍的25%能拟合出38.3%和70.7%呢?很显然不行。

图1 A3967对步进驱动的一种细分方式

通过简单的实例的分析,可以对问题进一步提炼一下:假设对一个正弦波进行等时间间隔的分割,分为4*2N份,其中半波幅度被分为2N份,那么,要求正弦波的幅度方向上应该有至少多少位的分辨率,才能使正弦波具有很好的还原度?

要使被恢复正弦波不失真,那么需要在每一个采样时刻的幅度都能被DAC的输出序列所覆盖。被恢复正弦波的1/4周期被分成了2N份,那么这1/4周期的幅度就是

而对于一个具有M位有效位的DAC来说,其能输出的幅度序列为

于是问题可以进一步转变为:M的值最小取多少,才能使得数组①:

中的每一个值都能在数组②:

中被找到呢?

这似乎是一个比较容易理清思路的计算查找问题,考虑到工程应用中N的值取8以下比较常见,而实际DAC器件的有效位数也不会超过20,也就是说M<=20,于是,可以带入N=8,先求出第一个数组,然后枚举M= 9~20时的第二个数组,查找第一个数组中每一个元素是否在第二个数组中。考虑到工程应用上也不会对数值有100%相等的要求,所以比较时可以增加一个误差系数……

于是王小Q兴奋的下载了C语言编译器,在试过3个不同版本后才终于能让编译器稳定运行,然后又是一通的百度语句语法+敲代码+调试,发现,不出结果,闪退,真是一顿操作猛如虎,回头一看原地杵。经过对语句的调试分析,发现似乎是编译器处理超长双精度浮点数组的时候出问题了。呃,王小Q生无可恋的拿过草纸,呆呆地看着上面写的两个数组,想了想,这似乎还是一个最大公约数的问题,也就是数组①的最大公约数是多少,这个最大公约数应该是数组②中最小的数。用计算机求解两个数的最大公约数是一个在学习编程阶段很初级的问题,但是求解这么多数的最大公约数,不管用哪种算法,都会使程序占用大量的计算和存储资源,王小Q想了想恐怖的n!问题,觉得还是算了吧……

隔了很多天以后(国庆),王小Q再次回到这个问题上,过了个假期脑袋迟钝了,还是先画画图,于是打开visio,用小方格来还原正弦波,没成想,灵感又有了。

图2 用小长方形去还原正弦波

从图上可以把这个问题简化成,用一系列小长方形去还原正弦波,长方形的高H设置为是长度L的多少,能使得还原出的正弦波与理想正弦波非常接近。

仔细观察小方格还原出正弦波的波峰/波谷和过零点位置,可以得出一个结论:波峰/波谷处,也就是幅度变化率(导数)最小的位置,应该是进行波形恢复时最应该关注的地方,如果能把峰/谷处的最小变化幅度区分开,由于正弦波波形变化率在半波范围内的单调性,那么其他位置处的幅度都将被很好的表示出来。也就是要用

y=1/2^M

能把

比较准确的表示出来。什么叫做“比较准确的表示出来”呢?不难发现应该需要满足y,上限应该是y = x/2,那么下限呢?应该是没有的,越小越好嘛,但是不能这么办,工程师是要抓狂的。设定一个系数δ来表示y/x,理想的δ取值在0~50%之间。于是王小Q把N=8带入,在δ不同条件下求得M的值,得到表1中的数据。

表1

N=8,

δ=

M=

50%

17

40%、30%

18

20%、10%

19

万万没想到竟然要这么高的位数,这要是对应DAC位数的话,还要再加一位,还是有效值,王小Q看着结果有点惊讶了。于是把正弦波分割数减小一点,改为N=7和N=6分别计算结果如下表2表3所示。

表2

N=7,

δ=

M=

60%、50%

15

40%、30%

16

20%

17

10%

18

表3

N=6,

δ=

M=

90%~60%

12

50%

13

40%、30%

14

20%

15

10%

16

看来即使细分数少很多,仍然需要很多位数的啊,并且还是有效位数,而且这还只是一种近似的粗略算法,看到这样的结果,突然就觉得搞的细分他就不香了。想想之前用12位DAC做的256细分控制,虽然宏观上看着波形挺好的,但从上面的分析可以看出,那时的峰谷一定是梯形的。

虽然这样,考虑到使用要求,考虑到红红绿绿的毛爷爷,还是继续用12位的去细分吧,这也叫做,看清了XX的真相,依然热爱XX吧。

能仔细探究一个问题,搞明白了,还是很开心的。最后违心的说一句,我爱工作,工作使我快乐。

c语言正弦波程序_怎样很好的恢复一个正弦波信号相关推荐

  1. c语言二维数组输入数据,c语言编写程序,把下面的数据输入到一个二维数组中:...

    c语言编写程序,把下面的数据输入到一个二维数组中: 答案:3  信息版本:手机版 解决时间 2019-10-07 01:08 已解决 2019-10-06 03:19 1. 编写程序,把下面的数据输入 ...

  2. linux 易语言窗口程序_易语言开发Linux程序

    令人兴奋的是易语言可以开发Linux程序,易语言是一个跨平台的开发工具,支持Windows及Linux.使用易语言开发Linux程序,您可以在Windows环境下编写基本于Windows的程序,及编写 ...

  3. python语言属于什么_最近很火的Python是什么?属于什么语言?

    Python是一种脚本语言,可以直接运行后,消除编译和链接的麻烦.初学者来说需要更多的动手实践,减少错误的机会.和Python也有一个互动的方式.如果它是一个简单的小程序,甚至可以保存编辑器,它可以直 ...

  4. c语言延时程序_科技文化艺术节 | 电子信息学院“剑指疫情,策‘码扬‘编”程序设计大赛...

    2020年5月29日,青岛大学"剑指疫情,策'码'扬'编'"程序设计大赛于晚七点正式开始,本次大赛面向全校19级同学,同学们踊跃报名参加,最终有16支队伍在今天展示他们的智慧成果. ...

  5. c语言延时程序_科技文化节 | 剑指疫情,策“码”扬“编”程序设计大赛完美收官...

    2020年5月29日,青岛大学"剑指疫情,策'码'扬'编'"程序设计大赛于晚七点正式开始,本次大赛面向全校19级同学,同学们踊跃报名参加,最终有16支队伍在今天展示他们的智慧成果. ...

  6. linux 易语言窗口程序_浅谈Linux入门的基本知识

    浅谈Linux入门的基本知识 图形模式与文字模式的切换方式Linux预设提供了六个命令窗口终端机让我们来登录. 默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1.tty2 - ...

  7. linux 易语言窗口程序_用易语言开发Linux程序的方法

    漫溃廉江欧洲恺撒哈博浑饨?农区南雄青枫沙袋风行画行全盘.赁租落子淋雨长笑林登联氨.欠身双黄妹妹稠密平摊麻乱封杀,蹦极四友萌芽布鞋魔符采制.馆子恭喜乐天内绘磨勘泪液旁出并且! 全盟女神功曹使劲信徒,用易 ...

  8. 更适合python的应用程序_一些很棒的Python应用程序

    我们可以从180多个成功发布的Python软件案例中学到什么. 我很高兴地发布一些很棒的Python应用程序,这是一个手工整理的180多个项目的列表,所有这些都是: 1.带有在线源代码仓库的免费软件. ...

  9. 构建meteor应用程序_我如何在一个月内构建一个复杂的文本分析应用程序

    构建meteor应用程序 by Jeffrey Flynt 由Jeffrey Flynt 我如何在一个月内构建一个复杂的文本分析应用程序 (How I built a complex text ana ...

  10. python写一个表白程序_用Python个女神做一个表白神器

    用Python给女神表白 情人节刚刚过去,但男同胞们对女神的暗恋愈加热烈,想尽一切办法表白,今天,咱们就用Python制作一个表白神器. 程序介绍 运用pygame制作一个小游戏,当女神用鼠标点击&q ...

最新文章

  1. Symfony2学习笔记之HTTP Cache
  2. ROS知识【13】:ubuntu下安装eclipse-CDT【非installor】
  3. Linux看内存标压低压,三代锐龙、国产Linux上身笔记本电脑,性能是否和参数一样好看?...
  4. redis中multi和pipeline区别以及效率(推荐使用pipeline)
  5. CCF201503-1 图像旋转(100分)【数学计算】
  6. 一大批历史精彩文章啦
  7. 最长回文子串问题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
  8. bin文件查看器app_鸿蒙系统编译第一个APP:hello
  9. “丧文化”的祖师:波德莱尔:不懂得使自己的孤独为众人接受的人,也不懂得在碌碌众生中自立。...
  10. archLinux安装记录
  11. MacOS brew 仓库URL源替换方法
  12. ‘primordial is not defined‘ node 报错解决方法 终极篇!!
  13. Games on a CD CodeForces - 727E(双hash)
  14. 桔子菌和楼下超市田大爷的角色互换经历–Python做的商品价格语音播报器
  15. java 如何实现一个字符串的反转
  16. Matlab .asv是什么文件
  17. python调用usb设备_在Python中查询连接的USB设备信息的简单方法?
  18. 一看就懂!!各进制转换方法
  19. 罗永浩是怎样买到 T.TT 域名的?
  20. dm3730调试笔记

热门文章

  1. 太空探测器 java_宇宙究竟有多大?这个探测器或将告诉你答案
  2. (11)企业合并长期股权投资
  3. USB转串口电路之CH340G
  4. MFC学习篇:鸡啄米MFC教程字体格式设置函数解析
  5. matlab中tdma源程序,40MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法MATLAB源代码...
  6. 服务器抓不到mrcp协议,MRCP协议学习笔记-语音识别资源的概括和全部Methods
  7. 服务器抓不到mrcp协议,MRCP协议
  8. 2. 工业大数据的特点
  9. 网络编程分享二之魔兽对战平台编码实战
  10. Sling CMS 学习:环境搭建(一)