1

我正在研究微控制器合成器,但我遇到了音量包络生成问题。我现在有这个代码:
to_dac =(SinTable[lut_pos] * (volume))>>8;

它工作正常,但分辨率真的很差,我不知道如何改进它以使其仍然可以足够快地运行(因为必须为每个样本执行此操作)

这些是我现在得到的结果:

波形

这是一个 MP3 现在的声音:(注意:DAC 在面包板上,输出端没有低通滤波器,所以有一些多余的噪音)

我正在使用 MSP430 设备(目前是 MSP430G2553,但如果真的有必要,我可以使用 MSP430F5510(更多内存,更快的速度)我也尝试寻找示例,但它们都使用浮点变量,sin() ; 函数和 math.h 中的其他函数,但我没有这些的奢侈......

编辑:我是个彻头彻尾的白痴,另一段代码导致幅度包络的分辨率较低,但我对幅度调制的其他解决方案持开放态度。

4

2 回答 2

0

我查看了 MSP430G2553 数据表并没有找到任何 DAC。你用的是外接DAC吗?

现代 MCU 具有支持 DMA 的高速 DAC。您可以在内存中填写表格(一个或多个罪恶周期),而不是向 DMA 发出命令以将数据发送到 ADC。

因此,您将给 CPU 更多空闲时间来完成其他工作。

于 2014-07-20T16:27:18.703 回答
0

我必须查看您的其余代码和您的一些硬件设置,但我会假设您有一个中轨的虚拟地面?如果是这样,并且您的 SinTable[] 以参考接地为参考(即对于 12 位 dac,虚拟接地输出将为 2048,Vcc 将为 4095,Gnd 将为 0,然后乘以音量将改变您的虚拟地面。

尝试这个..

if (SinTable[lut_pos] >= 2048) {
  out = 2048 + (SinTable[lut_pos]-2048)*volume;
} else {
  out = 2048 - (2048-SinTable[lut_pos])*volume;
}
to_dac = out>>8;

我不确定你为什么要移位,但你可以通过事先缩放 SinTable 来省去麻烦。

于 2012-11-09T11:01:51.760 回答