打印

请问PWM音频还原的问题!

[复制链接]
楼主: stealth
手机看帖
扫描二维码
随时随地手机跟帖
21
zyj9490| | 2015-11-1 15:21 | 只看该作者 回帖奖励 |倒序浏览
能MCU的性能与开关频率要大幅度提高。

使用特权

评论回复
22
stealth|  楼主 | 2015-11-2 09:36 | 只看该作者
本帖最后由 stealth 于 2015-11-2 09:38 编辑

虽然FIR低通滤波的算法估计单片机没有足够的性能跑.不过我还是想了解一下有无算法的源代码或流程之类.
现在我用32k的PWM,一点数据,3点输出零.杂音听起来还是差不多.有2种频率的杂音:一种只要音频数据也为零就不会有.这个声音频率高.
另一种频率较低的杂音只要我单片机跑起来就一直有.

使用特权

评论回复
23
zyj9490| | 2015-11-2 12:34 | 只看该作者
stealth 发表于 2015-11-2 09:36
虽然FIR低通滤波的算法估计单片机没有足够的性能跑.不过我还是想了解一下有无算法的源代码或流程之类.
现在 ...

8K的基音和谐音。第一种。

使用特权

评论回复
24
zyj9490| | 2015-11-2 13:09 | 只看该作者
stealth 发表于 2015-11-2 09:36
虽然FIR低通滤波的算法估计单片机没有足够的性能跑.不过我还是想了解一下有无算法的源代码或流程之类.
现在 ...

你的意思送样率是32K的,PWM频率也是32K?

使用特权

评论回复
25
cool_coder| | 2015-11-2 13:46 | 只看该作者
40kHz到2kHz有20倍的频率差,三阶低通在阻带上差不多能得到-78dB的衰减,应该够用了。不过,我个人认为如果单片机硬件支持,可以试试把PWM频率调整到200kHz,这样用一个二阶低通就能得到-80dB衰减。
至于楼主提到的“类似金属音的噪音”,我认为很可能是存在于原始音频数据中的,应该是进行原始音频采集,或者对高采样率音频做重采样时候的问题。要验证也很简单,把这段声音数据转换成一段标准格式的WAV文件,在电脑上试听一下就行了。

使用特权

评论回复
26
cool_coder| | 2015-11-2 14:00 | 只看该作者
“每个点的数据重复放了5次”应该没有必要,每个8kHz周期设置一次PWM占空比和设置5次结果是一样的。补零、滤波似乎也不可取。你提到的两种噪音,一种是电路布线或者电源退耦的问题,需要改进设计;还有一种是音频采样的问题,可以通过对原始音频信号做滤波解决,执行的时间应该在形成8kHz音频采样之前。

使用特权

评论回复
27
nethopper| | 2015-11-2 16:14 | 只看该作者
本来采用5次重复同一个数据的过采样法(Upsampling,或叫升采样法),然后再低通滤波,看起来比采用1个原始数据加4个零的过采样法更接近实际波形,但这会造成所谓的零阶保持失真。而补零法更像单位冲击函数采样。而且所有的过采样通常都采用补零法的原因是可以利用“零”乘以任何数等于零来简化低通滤波器(插值滤波器)的运算。

使用特权

评论回复
28
stealth|  楼主 | 2015-11-2 16:20 | 只看该作者
zyj9490 发表于 2015-11-2 13:09
你的意思送样率是32K的,PWM频率也是32K?

PWM的频率是32K,16M的时钟/500。
数据是8K的,所以四次PWM中断才有一次数据。现在发一次数据,3次补零。四次同样的数据,一次数据,三次插值数据都试过,都有唧唧声。

使用特权

评论回复
29
stealth|  楼主 | 2015-11-2 16:22 | 只看该作者
cool_coder 发表于 2015-11-2 13:46
40kHz到2kHz有20倍的频率差,三阶低通在阻带上差不多能得到-78dB的衰减,应该够用了。不过,我个人认为如果 ...

金属音是程序打错了一个字母。

使用特权

评论回复
30
nethopper| | 2015-11-2 16:30 | 只看该作者
不添加低通数字滤波,补零过采样的谐波更严重。

使用特权

评论回复
31
stealth|  楼主 | 2015-11-2 16:43 | 只看该作者
cool_coder 发表于 2015-11-2 14:00
“每个点的数据重复放了5次”应该没有必要,每个8kHz周期设置一次PWM占空比和设置5次结果是一样的。补零、 ...

音频采样不存在问题,因为那是电脑给我的音频数据。如果说是布线问题也不象,因为我初始化好硬件之后,设个断点让单片机停下来,就没有噪音。一旦单片机输出PWM的数据,噪音就来我也不知道别人怎么把PWM频率提高就没噪音了(都只说提高,但没说提高后缺的数据怎么处理,补零,重发还是什么的)。
我测试过固定发一个数据,不就相当于是通过PWM恢复一条直线的音频信号吗?这种情况下,我用32K的PWM,每个点都发同样的占空比,也会出来同样的噪音。按道理这时候我已经相当于用32K的PWM还原32K的采样数据了。

使用特权

评论回复
32
stealth|  楼主 | 2015-11-2 16:52 | 只看该作者
nethopper 发表于 2015-11-2 16:14
本来采用5次重复同一个数据的过采样法(Upsampling,或叫升采样法),然后再低通滤波,看起来比采用1个原始 ...

补零的话,由于单片机的资源和速度限制,没有进行FIR滤波。这样做反而比重复法和插值发更差了,多了个很尖锐的唧唧声,而且声音变小了,所以显得噪音更大了。
其实我现在用插值的方法,假设8k的数据,当前点是80,下一点是90.在125us时间内,每一个31.25us PWM中断,我发80,82,85,87.这样发的,理论上应该是平滑了很多的,但不知道怎么还是出来直接重复发四次80差不多的噪音.要是不考虑噪音,声音还原的还是可以的.

使用特权

评论回复
33
cool_coder| | 2015-11-2 17:22 | 只看该作者
本帖最后由 cool_coder 于 2015-11-2 17:25 编辑
stealth 发表于 2015-11-2 16:43
音频采样不存在问题,因为那是电脑给我的音频数据。如果说是布线问题也不象,因为我初始化好硬件之后,设 ...

电脑给你的音频数据就一定是没有问题的?验证过了吗?
在这个应用里,PWM被当作DAC使用,提高PWM频率只是为了使后续的滤波更容易处理,不需要补零或重发什么的。另外,32k的PWM只适合还原采样率远低于32k的音频数据,否则要考虑做严格的时钟同步,后续滤波也是问题。如果可能,用一路DMA和一路定时器,设置到8kHz触发数据传输是比较理想的。

使用特权

评论回复
34
stealth|  楼主 | 2015-11-2 17:53 | 只看该作者
我现在用插值的方式,PWM的占空比已经是1秒变化32k次了.现在发现我上面说的固定发一个数据也会出来的噪音,在发0x80的时候是最小的,固定发0都会有很大噪音.

使用特权

评论回复
35
stealth|  楼主 | 2015-11-2 18:06 | 只看该作者
cool_coder 发表于 2015-11-2 17:22
电脑给你的音频数据就一定是没有问题的?验证过了吗?
在这个应用里,PWM被当作DAC使用,提高PWM频率只是 ...

电脑过来的是8K的数据,这点无问题.时钟同步有考虑的,如果不同步的明显,能听得出来的.现在其实要是不管噪音,用来听歌都还可以.

使用特权

评论回复
36
zyj9490| | 2015-11-2 18:33 | 只看该作者
本帖最后由 zyj9490 于 2015-11-2 18:37 编辑
stealth 发表于 2015-11-2 16:20
PWM的频率是32K,16M的时钟/500。
数据是8K的,所以四次PWM中断才有一次数据。现在发一次数据,3次补零。 ...

可以肯定的是你这样处理音频数据不完美,对比传统的音频流,BITCLK 几百K,码率32K,PWM相当于BITCLK,复现一个音频值,可以几个微秒达到稳定。现在你的方案不是。无法实现阶梯状的数字波形。PWM频率决定了边沿的上升,下降速度,码率决定了阶梯平台的宽度。你将二者合一,原理上有问题。

使用特权

评论回复
37
zyj9490| | 2015-11-2 18:46 | 只看该作者
本帖最后由 zyj9490 于 2015-11-2 18:49 编辑

不应采用PWM中断的方式来改变寄成器的值,应自动加载。码率时刻时才修改寄存器的值。以上处理针对DAC段,源头有没有做防混迭低通啊?

使用特权

评论回复
38
nethopper| | 2015-11-2 19:12 | 只看该作者
stealth 发表于 2015-11-2 16:43
音频采样不存在问题,因为那是电脑给我的音频数据。如果说是布线问题也不象,因为我初始化好硬件之后,设 ...

“...每个点都发同样的占空比,也会出来同样的噪音。按道理这时候我已经相当于用32K的PWM还原32K的采样数据了..." 这相当于输出直流了,都有噪音啊....输出端不是还有个2KHZ的三阶低通吗?

使用特权

评论回复
39
nethopper| | 2015-11-2 19:34 | 只看该作者
stealth 发表于 2015-11-2 09:36
虽然FIR低通滤波的算法估计单片机没有足够的性能跑.不过我还是想了解一下有无算法的源代码或流程之类.
现在 ...

简单的FIR插值算法可参考: http://dspguru.com/dsp/faqs/multirate/interpolation

复杂点的FIR插值算法,可参考这个MIT硕士论文:
Design of Efficient Digital Interpolation Filters for Integer Upsampling.pdf (312.5 KB)

不过先解决你这个输出直流都有噪音的问题吧。

使用特权

评论回复
40
zyj9490| | 2015-11-2 19:51 | 只看该作者
根据SACD的原理,其三用波的频率是很高的。为何,提高瞬态响应,稳态时的信号远大于晢态的信号。可以参考下SACD的PWM原理。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则