我是DSP编程的新手,我想知道如何最好地执行水平调整的看似基本的操作。假设我有一个8位数字代表我希望信号以256步进入的幅度。我有一组代表信号数据的16位数字。基于“音量”参数缩放信号数据的最佳方法是什么,以便说0是完全衰减,255使数据保持不变?
答案 0 :(得分:6)
什么放松说:
out_sample = in_sample * volume / 255;
如果您正在使用真正的DSP芯片或没有快速分频器的硬件,您可以使用此技巧获得相同的值而无需分割:
int product = in_sample * volume;
out_sample = (product + (product>>8) + 1)>>8;
在像C64x +这样的现代DSP上,这段代码的运行速度提高了大约10倍......
此外:
您在谈论音量,并且您目前应用8位音量作为线性增益因子。然而,我们的耳朵将音量解释为对数效应。您可能希望在乘法之前从db(您的8位)转换为线性增益。预先计算它们并将它们放入桌子中。在执行此操作时,您还可以将值的比例提高到2 ^ 15以获得更高的精度。
这会给你一个更好的回应,而且你的点击次数会少得多。
答案 1 :(得分:2)
怎么样
out_sample = in_sample * volume / 255;
直线性重新缩放。这假设可以使用更高的精度完成计算,以捕获乘法的结果而不截断。