丢掉低位只是精度降低,低通后尚且还能听。丢高位的话。。。
是这样的,使用STM32的内部DAC输出做音频输出,现在有16-bit的原始信号,取其中的[15:4]位域输出到一路DAC通道中,另外的[3:0]位域先左移对齐到12位然后再输出到另一路DAC通道中。
在外部用电阻分压网络对这两路信号做16:1的混合,一路串联1k电阻,另一路串联16k电阻,然后合并到一起,但是最后得到的音频信号有非常大的噪声。如果去掉低4位数据转换出来的信号通道,变成12位精度就完全正常,能听到干净的声音。
是我的合并方式不对吗?
会不会是同步的问题
一般的MCU倒有可能,但是STM32的DAC数据更新机制比较特别。写入DAC中的数据是被缓存的,不会直接输出,要再手动触发相关的控制位一次才会真正写到输出寄存器中完成输出。两路通道对应的两个控制位我是同时赋值的,不存在相位差,同时激活输出的。
pwm方法,添加高4bit
实现形式是插值,输出更新率16x
可能低位的不能左移只能前面补0。左移相当于扩大了256倍,后面电路没有补回来。比如要输出的数是Y=A*16+B,A是D[15..4],B是D[3..0]。左移后输出变成了A*16+B*256了。
可能低位的不能左移只能前面补0。左移相当于扩大了256倍,后面电路没有补回来。比如要输出的数是Y=A...
自信点,把“可能去掉”。
是的不应该移位,直接喂就行了。一个思维误区。
现在已经好了,可以正常发生了。
好了,确实是我自己计算失误了,16位数据高12位直接写入,低四位同样如此,不应该左对齐处理,不然就放大了256倍,权电阻设置就有问题了。
现在就按照这样更正设置,声音听起来也没问题了,但是12bit和16bit似乎没有听起来区别,也许对于一般的场合加上没有复杂特征的声音8bit就够用了。各种简单的录音规范好像也只有8bit,听起来也没啥大事。
如图,0x7D7放到DOR1,截断的后四位0xC放到DOR2里,没问题了。
IMG_0119.mp4 点击下载
你要测量SNR、SFDR、INL、DNL这些指标,才能评价最终的效果。
建议输出正弦波到pc声卡看一看
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。