我想在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;
答案 0 :(得分:1)
完美的方波是所有奇次谐波除以谐波数到无穷大的总和。在现实世界中,你必须停止 - 特别是在数字中的奈奎斯特频率。下面是基波加上前3个奇次谐波的图片。你可以看到广场是如何形成的。
在您的代码示例中,这意味着将正弦生成包装在另一个循环中。像这样:
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)