打印

请问PWM音频还原的问题!

[复制链接]
10241|46
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stealth|  楼主 | 2015-10-27 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用单片机的PWM输出音频数据,接了个三阶RC低通滤波后接功放芯片,然后推动喇叭出声.
声音还原的是清楚的,但是总有尖尖的类似金属音的噪音伴随,不知道怎么去掉.
低通滤波器的截止频率是2Khz.声音数据的采样频率是8khz,PWM输出的频率用了40khz(是采样频率的5倍,所以每个点的数据重复放了5次,不知道这对不对.).

相关帖子

沙发
PowerAnts| | 2015-10-27 21:08 | 只看该作者
用有源滤波,阶数弄高点

使用特权

评论回复
板凳
stealth|  楼主 | 2015-10-27 21:43 | 只看该作者
PowerAnts 发表于 2015-10-27 21:08
用有源滤波,阶数弄高点

我需要体积小,成本低的.

使用特权

评论回复
地板
PowerAnts| | 2015-10-27 21:44 | 只看该作者
那就没办法罗,除非单片机还有潜力,把PWM提高到16K以上

使用特权

评论回复
5
stealth|  楼主 | 2015-10-27 22:28 | 只看该作者
PowerAnts 发表于 2015-10-27 21:44
那就没办法罗,除非单片机还有潜力,把PWM提高到16K以上

音频的数据是8k采样的,对人说话来说应该足够好了吧?
PWM的频率是40K,现在是同一个数据输出了5次,这点我还有疑问的.

使用特权

评论回复
6
holle| | 2015-10-27 23:48 | 只看该作者
我也是这么用的,连滤波器都没加,人耳会直接滤掉高于20kHz以上的频率。语音效果很好。

使用特权

评论回复
7
william008| | 2015-10-28 09:51 | 只看该作者
我见过别人解决过类似的问题,蛮有趣
水果手机,可以到appstore上下载一个app:SpectrumView
https://itunes.apple.com/us/app/spectrumview/id472662922?mt=8
用单片机播放一段1KHz的正弦波,理论上扬声器也该发出1KHz的声音。用SpectrumView去分析扬声器的频谱,是否谐波成分过大,就知道电路该怎么改了。
当然了,更专业的做法,用专业音频监听设备去采集声音,用专业软件在PC上分析频谱。   但总比不过手机方便

使用特权

评论回复
8
stealth|  楼主 | 2015-10-29 22:58 | 只看该作者
holle 发表于 2015-10-27 23:48
我也是这么用的,连滤波器都没加,人耳会直接滤掉高于20kHz以上的频率。语音效果很好。  ...

问题是PWM怎么处理.
8K采样率的数据比如说用32K的PWM来输出,是同一个数据用32K的频率输出4次,还是插值之后输出4次.这两个我都试过,效果都差不多,一样的有噪音.管脚固定低电平没有这个噪音,但是只有输出数据,哪怕是固定一个数据比如0x80输出,就会有噪音,而且这噪音的大小是固定的,不随真正要输出的声音的音量的大小而变化.
还是说,在一个8k数据的时间内(125us),只输出一个40k的PWM波.

使用特权

评论回复
9
nethopper| | 2015-10-30 10:24 | 只看该作者
虽然PWM的输出频率为40KHZ,但同一个数据用8KHZ重复输出5次,得到的还是8KHZ的采样率,需要用截止频率在4KHZ一下的低通滤波,且要相当陡峭才能将4K~20KHZ听觉范围内的谐波或噪音衰减到听不到的程度。

如果将8KHZ的原始信号的采样率通过过采样提升到40KHZ的PWM的输出频率,那么低通滤波就容易多了,而且没滤掉的频率也在听觉范围之外。过采样应该先补零,然后低通滤波。

使用特权

评论回复
10
stealth|  楼主 | 2015-10-31 21:48 | 只看该作者
可是我过来的数据就是8Khz采样的已经数字化的数据,还怎么样去过采样呢?

使用特权

评论回复
11
nethopper| | 2015-10-31 22:35 | 只看该作者
没有数据的地方补零,再数字滤波,去掉4KHZ以上噪音。

使用特权

评论回复
评论
zyj9490 2015-11-1 00:50 回复TA
说对了。 
12
zyj9490| | 2015-11-1 00:43 | 只看该作者
明显是不对,
数字信号处理是只要输出一次原信号的值,其他输出0.就可以了,CD机就是这样做的。

使用特权

评论回复
13
zyj9490| | 2015-11-1 00:44 | 只看该作者
信号幅度会下降,但原信号的频谱比例不会改变。

使用特权

评论回复
14
zyj9490| | 2015-11-1 00:49 | 只看该作者
8KHZ取样时刻的点值,跟40KHZ取样的时刻点是一样的话,原信号频谱跟取样频率无关,离散化的信号频谱进行移频而已。

使用特权

评论回复
15
zyj9490| | 2015-11-1 01:02 | 只看该作者
你这个问题,不是开关频率40K的没有滤除的问题,而是8K送样率的问题,如果不改变8K的送样率,噪声是一直存在的。在数字声中,有40K和8K的混合,这样有可能产生可听区的噪声。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
stealth + 3 赞一个!
16
zyj9490| | 2015-11-1 01:06 | 只看该作者
解决方案如果用40K的数据率送出样本数据,用400K的开关频率进行PWM,一点样本,四点补0,对后面的滤波大为降低。光是提高开关频率是没用的。

使用特权

评论回复
17
nethopper| | 2015-11-1 12:30 | 只看该作者
本帖最后由 nethopper 于 2015-11-1 15:03 编辑

8KHZ采样率的原始音频数据,经过三阶2KHZ低通,仍然可能存在听得见的高频声。

假定用原始音频数据是2KHZ正弦波,那么通过8KHZ的采样率输出,每个周期只有四个采样点,假定分别为0,正向最大值,0,负向最大值,那就是4级阶梯正弦波了。 阶梯正弦波的频谱含基波n=1,和n=mN-1及n=mN+1次谐波,m=1,2,3,..., N为阶梯级数,幅度为N*|sin(PI/N)|/PI/n。 就是说幅度为1的2KHZ正弦波,以8KHZ的采样率输出后,变为2KHZ的4级阶梯正弦波,其中含有:

1) 2KHZ的基波,幅度为4*sin(PI/4)/Pi/1=0.9/1
2) 6KHZ的谐波,幅度为4*sin(PI/4)/Pi/3=0.9/3
3) 10KHZ的谐波,幅度为4*sin(PI/4)/Pi/5=0.9/5
4) 14KHZ的谐波,幅度为4*sin(PI/4)/Pi/7=0.9/7
5) 18KHZ的谐波,幅度为4*sin(PI/4)/Pi/9=0.9/9



如图。拿6KHZ的分量来说,假定基波的幅度为0dB,6kHZ的幅度则为-9.34dB左右。LZ用的是截止频率为2KHZ(-3dB)三阶低通滤波,每倍频程下降18dB, 在6KHZ的衰减为28.5dB左右。因此在低通输出端,假定2KHZ的基波信号为0dB,那么6KHZ的残留信号幅度为-9.34-28.5+3=-34.84dB。 这个只比基波幅度低34.84dB的声音是听得见的。

使用特权

评论回复
18
nethopper| | 2015-11-1 13:33 | 只看该作者
过采样,输出一个实际数据,补零,再输出一个实际数据。这里用的是48K采样率过采样8K采样率的数据, 即:每个实际数据点加配5个零,频谱如下。
。谐波严重。

然后再数字滤波,如下图,采用的是128个点的FIR截止频率为4000HZ的低通滤波。图中可见通过数字滤波,6KHZ信号已经衰减到-72dB了。而且这个数字滤波器的特性和阶数还可以通过仔细设计而大大提高。这样就大大减少了对最后输出端模拟滤波器特性的压力。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
stealth + 3 很给力!
19
nethopper| | 2015-11-1 13:35 | 只看该作者
补零后再数字滤波不会对信号造成信号幅度下降,因为数字增益太容易了,只是运算过程中不要丢失精度即可。

使用特权

评论回复
评论
zyj9490 2015-11-1 15:19 回复TA
不调节数字增益的情况下比较。 
20
zyj9490| | 2015-11-1 15:18 | 只看该作者
nethopper 发表于 2015-11-1 13:35
补零后再数字滤波不会对信号造成信号幅度下降,因为数字增益太容易了,只是运算过程中不要丢失精度即可。 ...

不矛盾,基本功,理论扎实,赞一个。

使用特权

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

本版积分规则

16

主题

87

帖子

1

粉丝