文号
875570
阅读
23685
回复
11
收藏
7
有没有可能用2路12-bit DCA合并得到16-bit精度的输出信号
2020/03/19
IP:海南

       是这样的,使用STM32的内部DAC输出做音频输出,现在有16-bit的原始信号,取其中的[15:4]位域输出到一路DAC通道中,另外的[3:0]位域先左移对齐到12位然后再输出到另一路DAC通道中。

       在外部用电阻分压网络对这两路信号做16:1的混合,一路串联1k电阻,另一路串联16k电阻,然后合并到一起,但是最后得到的音频信号有非常大的噪声。如果去掉低4位数据转换出来的信号通道,变成12位精度就完全正常,能听到干净的声音。

      是我的合并方式不对吗?

11
6年8个月前IP:四川
875576
1楼

丢掉低位只是精度降低,低通后尚且还能听。丢高位的话。。。

引用
评论
6年8个月前修改于 6年8个月前IP:广东
875581
2楼

会不会是同步的问题

引用
评论
0x00000000作者
6年8个月前IP:海南
875584
3楼
引用zx-16533发表于2楼的内容
会不会是同步的问题

一般的MCU倒有可能,但是STM32的DAC数据更新机制比较特别。写入DAC中的数据是被缓存的,不会直接输出,要再手动触发相关的控制位一次才会真正写到输出寄存器中完成输出。两路通道对应的两个控制位我是同时赋值的,不存在相位差,同时激活输出的。

引用
评论
6年8个月前IP:广东
875586
4楼

电阻的精度可能也是个问题

引用
评论
6年8个月前IP:北京
875588
5楼

pwm方法,添加高4bit


实现形式是插值,输出更新率16x

引用
评论
6年8个月前IP:天津
875600
6楼

可能低位的不能左移只能前面补0。左移相当于扩大了256倍,后面电路没有补回来。比如要输出的数是Y=A*16+B,A是D[15..4],B是D[3..0]。左移后输出变成了A*16+B*256了。

引用
评论
0x00000000作者
6年8个月前IP:海南
875654
7楼
引用fleefly发表于6楼的内容
可能低位的不能左移只能前面补0。左移相当于扩大了256倍,后面电路没有补回来。比如要输出的数是Y=A*16+B,A是D[15..4],B是D[3..0]。左移后输出变成了A*16+B*256了。

自信点,把“可能去掉”。

是的不应该移位,直接喂就行了。一个思维误区。

现在已经好了,可以正常发生了。

引用
评论
6年8个月前IP:天津
875674
8楼
引用0x00000000发表于7楼的内容
自信点,把“可能去掉”。是的不应该移位,直接喂就行了。一个思维误区。现在已经好了,可以正常发生了。

哈哈。不是不相信自己,而是不确定你的描述理解得对不对。

+0.5
科创币
0x00000000
2020/03/19
Nice work.
引用
评论
0x00000000作者
6年8个月前IP:海南
875684
9楼

好了,确实是我自己计算失误了,16位数据高12位直接写入,低四位同样如此,不应该左对齐处理,不然就放大了256倍,权电阻设置就有问题了。

现在就按照这样更正设置,声音听起来也没问题了,但是12bit和16bit似乎没有听起来区别,也许对于一般的场合加上没有复杂特征的声音8bit就够用了。各种简单的录音规范好像也只有8bit,听起来也没啥大事。

如图,0x7D7放到DOR1,截断的后四位0xC放到DOR2里,没问题了。

Annotation 2020-03-19 162629.jpg


IMG_0119.mp4  点击下载


引用
评论
6年8个月前IP:广东
875786
10楼

你要测量SNR、SFDR、INL、DNL这些指标,才能评价最终的效果。

建议输出正弦波到pc声卡看一看

引用
评论
6年8个月前IP:广东
875795
11楼

估计sfdr只有劣化没有改善


建议用MATLAB写一个小程序对声卡采入信号做SINAD计算,然后DAC输出单音正弦看看。

引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的