具有(双)三次插值的音频振荡器

Audio oscillator with (bi)cubic interpolation

这个问题是关于内插正弦波振荡器:

假设正弦波的幅度和频率轨迹由相应的断点函数定义或从用户界面读取,以下几个C 代码行显示了一个常见的正弦波振荡器范例,用于合成 inNumberFrames 中的单声道音频样本 实时,使用线性插值

// ... (pre-computing initial amplitude and phase values)...
for (UInt32 frame = 0; frame < inNumberFrames; frame++) 
{                 
     buffer[frame] = sinf(phasef) * ampf[frame];                               
     phasef += osc->previousPartialPhaseIncrementf + df*frame;                         
     if (phasef > TWO_PI) phasef -= TWO_PI;
}
// ... (storing current amplitude and phase values)...

虽然总体上在音乐上令人满意(尽管可以使用预先计算的正弦波表和指针算法来优化性能),但有时会听到线性插值伪影。我想知道是否有振幅和相位振荡器瞬时值的三次或双三次插值的免费示例?考虑到渲染线程具有实时优先级(至少在 CoreAudio 中),保持轻量级很重要,同时避免 运行 进入太多低优先级线程如果在渲染线程外插值会出现问题。如果有人向我指出 C 中的(双)三次插值正弦波振荡器算法的工作示例,无论它多么简单(或复杂),我都会非常感激。 提前致谢。

更新:

也许这个插图可以阐明要插值的值的含义。紫色点表示频率包络断点曲线(通过线性插值连接)。青色点表示叠加多项式插值的可能性。第一段和最后一段超出比例:

看看 musicdsp.org (almost) Ready-to-use oscillators 上有一个 post。 post 的末尾包含您可能对以下签名感兴趣的方法(来自 Ollie N.)

float Oscillator::UpdateWithCubicInterpolation( float frequency )