论坛风格切换切换到宽版
  • 7576阅读
  • 31回复

用89C2051作哑音发生器 [复制链接]

上一主题 下一主题
离线剑心
发帖
397
只看该作者 20楼 发表于: 2005-07-06
一阶的sigma-delta比pwm还容易:把数据往累加器里裸加,溢出位就是sigma-delta输出。
可以一次带8个电机跑到256种速度,价格便宜量又足,我们现在都用它。
离线BG7JUN
发帖
889
只看该作者 21楼 发表于: 2005-07-07
'
bg7jun大侠你好!如你所说,斩波频率会对音频影响啊?
真正做出的哑音你用来上台试过了吗?我很想试试,不过我还没有这方面的编程技巧。
是否有什么源程序能指点吗?
'
没有源程序,还在做,比较简单,复杂的只是算法的问题,写代码很简单。算法就是用的前面我说过的方法,把波形按高度分成8段,找出对应水平位置改变占空比,算出50种亚音的对应的分频周期,就可以生成亚音了。
斩波频率要和最高的信号频率离得足够远,至少要10倍,30倍以上比较理想。对于亚音来说,最高频率是250hz,斩波周期就要到2.5k以上,最好是10k以上,为了防止干扰落到话音频率内产生干扰,可能还要提高频率,但频率高了要求单片机工作频率也高,就容易产生emi问题了。
我在做的这个东西还有几个信号铃音也是用pwm产生的,而且幅度也比较高,要做到7位量化,所以更加复杂一点。
补充:忘了个事,斩波周期不能光按一个频率来算,因为各亚音频率之间没有倍数关系,所以要用一个比较高的频率来实现。我在做的这个东西,以前打算用3m的时钟,一个亚音分成80段,通过对这个80段的周期进行计数来改变亚音频率,pwm周期与亚音频率无关,可以自由调节。后来又改成1.79m,每个亚音分成48段。因为cpu型号改了。
离线BG7JUN
发帖
889
只看该作者 22楼 发表于: 2005-07-07
[quote=剑心]一阶的sigma-delta比pwm还容易:把数据往累加器里裸加,溢出位就是sigma-delta输出。
可以一次带8个电机跑到256种速度,价格便宜量又足,我们现在都用它。[/quote]
呵呵,原来输出用的是定宽的pfm调制,滤波比较难做吧?
sigma-delta的算法我不是很了解,大侠能否给我讲一讲,通常都有些什么算法、比较高级的实现方法难度在什么地方?先谢了。
离线BG7JVJ
发帖
14
只看该作者 23楼 发表于: 2005-07-12
各位大侠,有用单片机做tone解码的方法,请指点小弟好吗?
离线BG7JUN
发帖
889
只看该作者 24楼 发表于: 2005-07-12
'
各位大侠,有用单片机做tone解码的方法,请指点小弟好吗?
'
用6阶以上的250hz有源低通,再加一级整形成方波,计周期就行了,yaesu的手台都是这样做的,国产机也是这样的。
随便找个电路抄一下。
调试时用pc机的声卡做信号源和示波器,配合goldwave、wavegen之类的软件,不需要仪器就可以调了。
离线BG7JVJ
发帖
14
只看该作者 25楼 发表于: 2005-07-12
'
用6阶以上的250hz有源低通,再加一级整形成方波,计周期就行了,yaesu的手台都是这样做的,国产机也是这样的。
随便找个电路抄一下。
调试时用pc机的声卡做信号源和示波器,配合goldwave、wavegen之类的软件,不需要仪器就可以调了。
'

多谢bg7jun大侠, 假若tone信号被音频信号霸占了,计不到周期,还有什么好方法呢?
离线BG7JUN
发帖
889
只看该作者 26楼 发表于: 2005-07-13
'
多谢bg7jun大侠, 假若tone信号被音频信号霸占了,计不到周期,还有什么好方法呢?
'
发射时,放大mic后的话音信号在调制前要经过一个300hz的高通,对处于亚音频率范围内的话间要有33db以上的衰减,然后再把亚音加进去——如果有没有滤干净话音,它们会混在亚音里面,无论用什么方法解调出来都会不稳定,所以需要先滤掉300hz以下的话音。ctcss的eia标准里面对此有要求。
接收时,分离亚音的的低通滤波器对300hz以上的话音要有50db以上的衰减,这样滤出来的就是亚音信号了。另外,接收机的话音通道对300hz以下也要有33db的衰减,否则会听到交流声——带亚音的系统如果接收方不做高通滤波,多少都会有交流声,听到交流声也可能是接收机问题——其实人耳完全可以听到亚音。
那几个滤波模板在cmx882的datasheet上都有,您查一下吧。
离线剑心
发帖
397
只看该作者 27楼 发表于: 2005-07-14
这不是定宽的pfm调制,因为加法溢出后不是变成0而是发生回绕,减去255。这个过程相当于一阶的积分负反馈环路。

关于模拟sigma-delta adc的原理,可以搜索ad公司关于ad7710的一篇文章。把模拟sigma-delta环路用软件实现就是sigma-delta dac的算法了。一阶的算法可以简化成累加器溢出算法。另外,有一个"快速画线算法"也是这样搞的。

高级的方法为了实现高分辨率(可达24bit)、高的带内信噪比,要使用高阶负反馈环路,保持稳定较难,需要一些特殊的技术,而且对时钟抖动也有严格要求。

'
呵呵,原来输出用的是定宽的pfm调制,滤波比较难做吧?
sigma-delta的算法我不是很了解,大侠能否给我讲一讲,通常都有些什么算法、比较高级的实现方法难度在什么地方?先谢了。
'
离线BG7JUN
发帖
889
只看该作者 28楼 发表于: 2005-07-15
to 剑心:
抄收了,我去看看ad7710资料。
你的那种算法实际上就是一阶的锯齿波逼近算法,我也是按那个算法考虑才误以为是定宽pfm的,因为画线时总是按小于45度的角度来画(大于45度时就在y轴方向累加了),不会出现连续溢出的情况。所以定宽pfm只出现在da值小于半量程的情况,当幅度大于1/2时,就会连续溢出了,波形反过来了。呵呵,搞错了,不好意思。
离线BG7JVJ
发帖
14
只看该作者 29楼 发表于: 2005-07-18
'
to 剑心:
抄收了,我去看看ad7710资料。
你的那种算法实际上就是一阶的锯齿波逼近算法,我也是按那个算法考虑才误以为是定宽pfm的,因为画线时总是按小于45度的角度来画(大于45度时就在y轴方向累加了),不会出现连续溢出的情况。所以定宽pfm只出现在da值小于半量程的情况,当幅度大于1/2时,就会连续溢出了,波形反过来了。呵呵,搞错了,不好意思。
'

bg7jun\剑心你们好!
两位大侠的说法我还是不明白,可否告诉我有什么方面的书籍。
离线BG7JUN
发帖
889
只看该作者 30楼 发表于: 2005-07-26
'
bg7jun\剑心你们好!
两位大侠的说法我还是不明白,可否告诉我有什么方面的书籍。
'
好象没有什么专门讲算法的书,有些是大学里讲信号处理时学的(但是内容太多、没有针对性,细节比较少、公式比较多,很多篇幅是在计算误差和信噪比),但大部分是工作后看器件的资料和applicaion note时学的,也一些有自己推导的。至于画斜线的折线逼近算法,好象是某本计算机图形教材上看来的——可能是多年前某个大学同学的,当时恰好翻到那一页、看了一眼——我实在记不起哪门课学过这个东西了。
离线BG7JVJ
发帖
14
只看该作者 31楼 发表于: 2005-07-26
多谢bg7jun啦!
要封帖好好学习,在这里给各位美好的73!