iOS生成方形声音

时间:2015-05-05 14:30:34

标签: ios audio

我想在iPhone上生成方波声音,我在网上发现了一个正弦波代码(抱歉忘记了链接),但我想生成方波格式。 你能帮帮我吗?

    const double amplitude = 0.25;

ViewController *viewController =
(__bridge ViewController *)inRefCon;
double theta = viewController->theta;
double theta_increment = 2.0 * M_PI * viewController->frequency / viewController->sampleRate;

const int channel = 0;
Float32 *buffer = (Float32 *)ioData->mBuffers[channel].mData;

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;
    }
}
   viewController->theta = theta;

1 个答案:

答案 0 :(得分:1)

奇次谐波之和

完美的方波是所有奇次谐波除以谐波数到无穷大的总和。在现实世界中,你必须停止 - 特别是在数字中的奈奎斯特频率。下面是基波加上前3个奇次谐波的图片。你可以看到广场是如何形成的。

Square of the first 9 harmonics

在您的代码示例中,这意味着将正弦生成包装在另一个循环中。像这样:

double harmNum = 1.0;
while (true)
{
    double freq = viewController->frequency * harmNum;
    if (freq > viewController->sampleRate / 2.0)
        break;

    double theta_increment = 2.0 * M_PI * freq / viewController->sampleRate;

    double ampl = amplitude / harmNum;

    // and then the rest of your code.
    for (UInt32 frame = ....

您遇到的主要问题是您需要跟踪每个谐波的θ。

骗子解决方案

作弊就是画一张像纸一样的正方形。将采样率除以频率2,然后产生-1的数字和+1的数字。

例如,对于48kHz的1kHz正弦波。 48000/1000/2 = 24所以你需要输出[-1,-1,-1,....,1,1,1,.....],其中每个都有24个。

主要缺点是您的频率分辨率较差。就像你的采样率是44100一样,你不能产生1kHz。因为这需要在-1处有22.05个样本,在1处需要22.05个样本,所以你必须向下舍入。

根据您的要求,这可能是一种更简单的方法,因为您可以使用计数器实现它以及调用之间的最后一次计数(因为您现在正在跟踪theta)