这个问题是关于 插值正弦波振荡器 :
假设正弦波的幅度和频率轨迹由相应的断点函数定义或从用户界面读取,以下几行 C -code显示一个常见的正弦波振荡器范例,用于在 实时 中合成单声道音频样本的 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 中的(bi)三次插值正弦波振荡器算法的工作示例,无论它是多么简单(或复杂)。 提前谢谢。
更新
也许这个例子可以澄清要插值的值的含义。紫色点表示频率包络断点曲线(通过线性插值连接)。青色点表示叠加多项式插值的可能性。第一个和最后一个部分是非规模的:
答案 0 :(得分:0)
查看有关(almost) Ready-to-use oscillators帖子的musicdsp.org。帖子的结尾包含您可能对以下签名感兴趣的方法(由Ollie N。提供)
float Oscillator::UpdateWithCubicInterpolation( float frequency )