我正在编写软件合成器,需要以44.1 kHz采样率实时生成带限,无别名波形.Sawtooth波形现在可以做,因为我可以通过将两个锯齿波混合在一起产生脉冲波,一个是倒置的并且相移.
到目前为止,我尝试了以下方法:
在启动时以不同的频带限制频率预先计算一个周期完美的带限波形样本,然后播放混合在一起的两个最接近的波形样本.工作正常我猜,但感觉不是很优雅.需要大量样本或者听到它们之间的"间隙".插值和混合也是CPU密集型的.
整合一系列DC补偿sinc脉冲以获得锯齿波.听起来不错,除非你没有得到完全正确的DC补偿(我发现它非常棘手),波浪会从零偏离.通过向积分器添加一点泄漏可以减少DC问题,但随后会丢失低频.
所以,我的问题是:通常的做法是什么?对于CPU而言,任何建议的解决方案都必须是高效的,因为必须立即对许多声音进行实时完成.
产生带限波形的一种快速方法是使用带限步骤(BLEP).您自己生成限带步骤:
并将其存储在波表中,然后用限带步骤替换每个转换,以创建如下所示的波形:
请参阅Band-Limited Sound Synthesis的演练.
由于这个BLEP是非因果性的(意味着它延伸到未来),为了生成实时波形,最好使用最小相位带限步骤,称为MinBLEP,它具有相同的频谱,但只能扩展过去:
MinBLEP进一步采用了这个想法并采用窗口sinc,执行最小相位重建,然后将结果集成并存储在表格中.现在要制作振荡器,只需在波形中的每个不连续处插入一个MinBLEP.因此,对于方波,您可以在波形反转的位置插入MinBLEP,对于锯齿,您可以插入一个MinBLEP,其中值反转,但是您可以正常生成斜坡.