gpt4 book ai didi

iOS 生成方形声音

转载 作者:行者123 更新时间:2023-11-29 02:03:41 26 4
gpt4 key购买 nike

我想在 iPhone 上生成方波声音,我在 Web 上找到了正弦波代码(抱歉忘了链接),但我想生成方波格式。你能帮帮我吗?

    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;

最佳答案

奇次谐波之和

完美的方波是所有奇次谐波的总和除以谐波数直至无穷大。在现实世界中,你当然必须停下来——特别是在数字的奈奎斯特频率上。下面是基波加上前 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 = ....

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

作弊解决方案

作弊是像在纸上那样画一个正方形。将采样率除以频率再除以 2,然后产生 -1 的数量和 +1 的数量。

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

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

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

关于iOS 生成方形声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30055847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com