DSP

2014TI杯(D题)带啸叫检测与抑制的音频功率放大器

2019-07-13 17:29发布

为了能够在2018年的TI杯电子设计竞赛中获得个好成绩,也为了多学些知识,我和我的团队选了2014年TI杯大学生电子设计竞赛的D 题来训练:带啸叫检测与抑制的音频功率放大器   第一眼看到这个题目时,感觉难度似乎不大,前几问都是做个音频功率放大器,无非是指定了芯片,要求功率程序可调,这个挺容易实现的啊,用数字电位器就可以很方便的解决的啊。   后面啸叫的检测部分。了解到,啸叫是因为声场的作用,导致输出反馈进入输入,使得某一个频率的信号呈现增幅震荡,经喇叭放大形成了啸叫。既然是单频信号,就会有很多的方法可以检测到这个频率,比如:使用一个单限比较器,当出现啸叫时,单频信号幅度足够大,达到了比较器的阈值电平,就会被整形成方波,送入单片机就可以测出频率值。还可以使用数字的方法,将音频信号放大、抬高之后送给单片机的ADC单元、之后对采集到的离散的电压信号做傅里叶变换,这样就可以得到这一段信号的频谱,找出频谱中幅度最大的那个点,对应的频率就是啸叫频率。 得到频率后,显示出来。之后就是抑制了,我们计划了以下几种方案:首先就是使用专用的程控滤波芯片MAX262,软件设置滤波中心频率、Q值和滤波器类型,但现成的模块比较贵,康威科技做的一块就要188。然后想到了使用数字滤波的方法,这多省事,滤波电路都不用搭,而且ARM已经提供了FIR和IIR滤波的函数,只要调用就可以了。最后还有一种纯模拟的方法,就是移频电路,将信号的频谱搬移几个Hz,再与原信号相加,这样就可以破坏原始信号的相位特征,使得反馈回路建立不起来,从而抑制啸叫。测量输出功率使用有效值检测模块,方案大体就是这样,接下来就是在做的时候出了好多问题。
以下内容更新于2018/07/25日
大概一个月之前写的上面的内容,现在电赛已经做完了,有时间来完善一下了,但是当时好多的细节都已经有点不清晰了。 制作功放的时候,要求了使用TPA3112这个功放芯片,于是就淘了几片,设计电路是让一个队友来做的,他也是刚刚入门,就焊过几个放大器啊比较器之类的基础电路,自主设计还没怎么做过。我让他仔细看看数据手册,再在网上找一找有没有好的电路解决方案,最终选定了TI手册中给出的那个典型电路图:                             根据这个电路图焊出了个洞洞板电路,加上了输入信号,但是输出信号的功率一直上不去,好像是到了5W的时候就没有波形了,然后重新上电才会再出来,看了看手册,应该是芯片的自我保护模式,但一直不知道为什么会进入自我保护模式,说的明明是可以达到25W的,然后我们加大了供电电压,不幸的是芯片一下子就烧了,特别的烫。 没办法,按照手册上说的,供电电压是可以达到26V的。我18V就把它烧了(至今仍然不知为什么),为了验证是不是电压太大把它烧了,我们又卖了几个芯片实验,又在网上查找论文,但所有的论文里面的电路都是一样的这一个典型电路,就像是所有的假芯片都被我买到了一样,所以……最后……终于发现不了什么原因,但为了可以使用,我们只能把供电电压限制在一个安全水平。 之后是啸叫的检测,考虑到了啸叫频率可能会有多个,而且为了不受到音频信号的干扰,我们没有使用比较器通过测方波频率的方法来检测啸叫频率,而是使用了AD采集4096个点,将信号做4096点的实数FFT运算,得到频谱,进而确定啸叫频率的。 得到了啸叫的频率,然后就是啸叫的抑制,我们首先是尝试了数字滤波方法,使用IIR滤波,单片机先采集一段信号,然后做个傅里叶变换测出来啸叫频率,然后使用对应的参数进行IIR滤波,这个参数是使用Matlab提前生成的,需要生成许多的数据,因为啸叫的频率在变化,只能先建立一个离线的很大的系数表,得到频率后就去查找,得到对应的系数数组,进行IIR滤波。我们使用的是NUCLEO-F767的板子,F7具有双精度的浮点运算单元,计算FFT啊或者IIR啊还是很快的,测试的时间是小于4个毫秒,但是问题是采集一段波形需要时间,FFT和IIR只能对一个数组里的数进行操作,不能动态的对数据进行处理,这就导致了很大的延迟,计算了一下,大概会有50ms的延时,播放音乐时已经可以分辨出了,而且不知为什么输出的声音信号有很大的噪声,特别不清晰。最终我们放弃了这个方法; 改成了使用程控滤波器MAX262,我们买了芯片,自己动手开始焊接,根据手册……结合康威科技……做了个电路,程序也写了写,发现效果还真的好,而且使用方便,直接软件修改中心频率和Q值就可以。 ……吃了个饭……回来再测芯片就烧了,特别烫,不知道为啥,换了一个,加上电压,发现输出电流也不大,但是芯片发烫,很烫,又烧……这是怎么回事,一瞬间烧了两个芯片了……50多块钱啊。 不知为什么,然后自己比较了一下我的电路和别人的电路的区别,发现只有电源供应处,我比他少了两个二极管!!!难道真的是因为电压高,手册里写的±5V的供电范围啊,没办法,只好是又加上了两个二极管,发现终于不烧了,真开心 然后就基本没有什么特别难的地方的,有个有效值检测电路,我们也自己做了一个,用的是有效值检测芯片AD736,效果还可以。 整体调试还算顺利,可以抑制啸叫,效果不错,最后附上一张整个系统的照片:
2018/07/25/23:46