- 积分
- 699
- 在线时间
- 303 小时
- 最后登录
- 2025-6-8
- 阅读权限
- 50
- 精华
- 0
 
- UID
- 787724
- 帖子
- 608
- 精华
- 0
- 经验
- 699 点
- 金钱
- 570 ¥
- 注册时间
- 2015-3-20
|
目前网上廉价机/套件的采样率获取有两种办法:
1·前端模块/芯片有采样率指示
主要是USB模块——SA9227、Amanero、XMOS均有采样率/格式显示脚,单片机监控这几个脚位上拉下拉电位就行了。
2·前端模块/芯片没有采样率指示
主要是SPDIF这里有问题——CS8416仅有>96K脚指示,残疾。DIR9001仅有44/48指示,方便使用外部晶振切换,但实测DIR9001能接收352K你能信?WM8805/8804可以读里面的寄存器值自己算,非常愚蠢。所以SPDIF/DOP采样率指示一直是个难题。
还有一类,是类似SA9227/CT7601这类USB-Audio模块,也能SPDIF解码,当然也就能使用这几种芯片的采样率指示了,但固件不太完美,允许切换信号源的非常少,得手搓信号输入切换开关,同样非常愚蠢。
那行业内一般是如何处理的?
大家看到产品DAC里一般都会有个FPGA放在DAC芯片前边,这个玩意一般是起到多功能MCU处理器的作用,付款即可以买到各种算法模块刷进去,比如开机后初始化、控制静音、屏幕刷写、按键输入,还有最重要的信号路由(对,很多机器FPGA仅负责路由信号)等。当然还有个别的把ASRC异步采样也做进去,不论你给的信号是多少采样率/格式,最后统一ASRC成PCM 44.1K喂给DAC芯片,这也是商品DAC性能指标能做高的原因——DAC芯片只有在PCM 44.1K下才能发挥最高指标。一般来说FPGA做的还不如专用ASRC芯片自己的PLL准,比如古老的CS8421+低Jitter时钟生成芯片。
当然喽,顺便计算一下输入采样率/位宽也就是理所当然的事。
隔了个FPGA除了看起来牛逼,还能把FPGA固件当作解决方案包采购,非常节约团队资源,可以只安排一两个人负责测试、外包沟通等,核心的东西只由一个工程师或老板掌握,安全性很高,其余雇员都负责进销存。
然而这种模式对于DIY几乎没有意义。
实际应用中是用单片机的定时器/计数器监控LRCK/BCLK两个脚,但这个解决方案不好卖,同行没有喜欢用的。自己DIY,干脆就用单片机监控LRCK/SCLK比较实用,它连DSD/PCM指示脚都不需要。处理逻辑非常傻瓜化,而且能实现源码直接路由给DAC,只是代码外行不好写。
处理逻辑是这样的:
使用单片机某两个GPIO空脚做监控脚,隔电阻接到LRCK和BCLK上,鉴于LRCK在DSD码中会变成DSD数据脚,因此处理逻辑是BCLK/DSDSCK判断优先。
单片机内部计数器设定为满1024次就清零重计,同时触发一次中断,中断语句执行计算频率,频率值放一个简单的数字变量flag与上一次暂存的flag对比,只要比值变化了超过3次(<1ms),就证明输入信号格式变化了,拉静音。
然后看一下LRCK脚计数器,如果LRCK是典型的PCM频率,比如44.1K、48K、88.2K、96K、176.4K、192K、352.8K、384K,则判断为PCM,丢Switch判断查表。如果LRCK数值不是典型值,但频率远远高于384K,就判断为DSD,查表可知3种DSD频率。
查表后置DAC状态,执行之后隔1ms静音解除,再执行LCD/OLED屏幕显示程序。
我爱用国产STC8H8K64做这个工作,因为太便宜了,2块钱不到1片,内部RC总时钟虽然不太准,但最高可以跑到27M不带喘气的,省了一个晶振,内置64K内存,可以足够储存OLED 25664显示的数据(可能图像会有点吃力)。总有人说ESP32太便宜了,Arduino太便宜了,国产ARM M0太便宜了,但具体使用起来,不是脚位不够用,就是频率不够高,比如Arduino nano默认的频率就是16M,判断11M主频是不够用的。 |
|