Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS音频生成_Ios_Audio_Sampling_Trigonometry - Fatal编程技术网

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;