iOS音频生成
我看这个是因为我需要做一些类似的事情,但有些地方我不明白,我希望有人能帮我 在守则的这部分:iOS音频生成,ios,audio,sampling,trigonometry,Ios,Audio,Sampling,Trigonometry,我看这个是因为我需要做一些类似的事情,但有些地方我不明白,我希望有人能帮我 在守则的这部分: double theta_increment = 2.0 * M_PI * viewController->frequency / viewController->sampleRate; // Generate the samples for (UInt32 frame = 0; frame < inNumberFrames; frame++) {
double theta_increment = 2.0 * M_PI * viewController->frequency / viewController->sampleRate;
// Generate the samples
for (UInt32 frame = 0; frame < inNumberFrames; frame++)
{
buffer[frame] = sin(theta) * amplitude;
theta += theta_increment;
if (theta > 2.0 * M_PI)
{
theta -= 2.0 * M_PI;
}
}
你知道为什么这样不行吗?另外,我也不知道这部分代码的用途:
if(theta>2.0*M_PI)
所以对此的任何解释都是非常受欢迎的。我想它会按照你的方式工作(但别忘了乘以振幅):
只是用两种不同的方式表达同一个数学。看起来编写原始代码的人希望保留0您的方法可以用于创建相同的结果,但表达方式不同。然而,
theta+=theta_增量代码>将是一个比您建议的更简单的表达式(要计算)
阶段的域被包装到sin'
s逻辑参数域。对于较短的示例,此步骤确实不是必需的。由于浮点存储的限制,如果未包装该值,您的频率最终可能会发生变化,并且最终不会增加,这取决于您生成的样本数量以及您是使用浮点
还是双精度
。这样想:如果你有一个巨大的正浮点数(相位累加器的值),并且你试图向它添加0.000004
,会发生什么?浮点误差将使其四舍五入到浮点或双精度中,误差将导致相位不稳定,最终导致基音不稳定。对于短样本(例如,一些循环),在这种情况下不需要缠绕,但对于许多循环,缠绕用于随时间稳定节距和相位累加器
最后,θ将用于存储相位渐变的最后一个值,以便在后续渲染调用中停止的位置恢复生成。否则,输出将在渲染调用边界的0处重新启动,产生非常不愉快的噪音和错误的频率
综合考虑:这可能是因为它是一个简单的演示,并且是在该上下文中生成正弦的一种快速方法。您的方法有一些“昂贵”的转换,但它是无分支的——它可能比原来的更快,尤其是对于更高的频率
buffer[frame] = sin(theta_increment * frame);
buffer[frame] = sin(theta_increment * frame) * amplitude;