我有一个大学作业,我们需要通过 PWM 和 DAC 将预编译的 wav 作为整数数组播放。现在,我想要更多的挑战,所以我不遗余力地使用有问题的微控制器通过 USB 创建了一个音频 dac:STM32F051。它基本上使用 wasapi 环回记录器监听我的声卡输出,将分辨率从 16 位更改为 12 位(因为 stm32 上的 dac 只有 12 位分辨率)并使用 usart 将其发送过来,使用 10 倍采样率作为波特率(在我的案例960000)。全部在 C# 中完成。
在微控制器上,我只是为 usart 使用中断并将接收到的数据推送到 dac。
它工作得很好,比 PWM 好得多,并且采样频率为 48kHz。
但是......它来了......当有一些(大部分)高音交响旋律时,它开始听起来“摇摆不定”。
在这里您可以听到一个视频:https ://youtu.be/xD3uTP9etuA?t=88
我在互联网上阅读了一些关于 DIY dac 的信息,并且某个地方的某个人(不记得在哪里)提到 MCU 通常具有中断抖动。所以可能的基本问题是:中断抖动实际上是造成这种情况的原因吗?如果是这样,有没有办法限制抖动的发生?
或者这是完全不同的东西?
我正在考虑尝试压缩通过串行发送的 pcm 数据(如前所述,分辨率为 12 位,但以 2 个 8 位的数据包发送,形成 16 位,因此采样率是波特率的两倍,所以我的计划是尝试转移12 位到 MSB,并将下一个 12 位值的 4 位添加到当前 16 位变量,因此每 8 个样本只需要 12 次传输而不是 16 次。可能会阅读更有效的压缩数据以进行传输的方法。),把缓冲区中的样本,然后使用另一个以 48kHz 触发的定时器将样本发送到 dac。这个概念行得通吗?还是我只是浪费时间?
对于代码,这里是项目:https ://github.com/EldinZenderink/SoundOverSerial