MCU上的高效幅度调制(C)

时间:2012-10-29 23:33:15

标签: signal-processing msp430 amplitude dac

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

它运行正常,但分辨率非常差,而且我不知道如何以足够快的速度运行来改进它(因为必须为每个样本执行此操作)

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

The waveform

Here is an MP3 how it sound now: (note: the DAC is on a breadboard and there is no Low pass filter at the output so there is some excess noise)

我正在使用MSP430器件(目前是MSP430G2553,但如果确实需要我可以使用MSP430F5510(更多内存,速度更快) 我也尝试过查看示例,但它们都使用浮点变量sin();函数和math.h中的其他人,但我没有那些奢侈...

编辑:我是一个完全白痴,另一段代码提出了幅度包络的较低分辨率,尽管如此,我仍然可以采用其他振幅调制解决方案。

2 个答案:

答案 0 :(得分: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来省去麻烦。

答案 1 :(得分:0)

我看一下MSP430G2553数据表&没找到任何DAC。你在使用外置DAC吗?

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

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