在Objective-C中创建方形,锯齿波和三角波



我正在尝试为我正在开发的简单波表合成器iOS应用程序生成不同的波形。这就是我生成正弦波的方式:

if (waveType == 1) // sine wave
{
//NSLog(@"sine in AU");
for (int i=0;i<n;i++)
{
float x = 0.0;        // default to silence
if (toneCount > 0)  // or create a sinewave
{
x = testVolume * sinf(ph);
ph = ph + dp;
if (ph > M_PI) { ph -= 2.0 * M_PI; } // sine wave
toneCount -= 1;    // decrement tone length counter
}
if (ptrLeft  != NULL){
ptrLeft[ i] = x;
}
if (ptrRight != NULL) {
ptrRight[i] = x;
}
}
}

对于方波,我假设这会起作用,但它没有:

if (ph > M_PI) { 
ph -= 2.0 * M_PI;
ph >= 0 ? 1.0 : -1.0;
}

我将如何创建锯齿波和三角波,方波哪里出了问题?

谢谢,我是iOS编程的新手,喜欢使用音频。

对于初学者来说,考虑一下你的生产线

if (ph > M_PI) { ph -= 2.0 * M_PI; } // sine wave

ph是你对sin函数的输入,这是弧度中的一些值......请注意,sin 函数将自动处理大于 2 * PI 的值,它只会将其包装起来,因此无需管理您的ph变量,只需增加它即可

关于你的方波...请记住,您的输出只有两个值低或高...不要按曲线值驱动低/高之间的切换

if (ph > M_PI) { 
ph -= 2.0 * M_PI;
ph >= 0 ? 1.0 : -1.0;
}

请记住,当您增加外循环i时,您正在增加ph用于确定您在 PI 周期中的位置,这是可以的,但是相同的ph也不能输入到 sin(ph) 以及......必须将其他东西输入 sin(),否则其他东西会保持您在 PI 周期中的样本位置......您错误地将两个职责混为一个变量

在上面,如果代码块考虑何时必须执行从低到高或从高到低的切换......它发生在M_PI吗? 每个周期发生多少次这样的切换? 什么时候? 也许您需要一个额外的 if 测试来确定何时执行该切换......在您的正弦曲线算法中,您已经在管理 pH 值,您必须以不同的方式处理方波 pH 值还是保持 pH 逻辑相同?

最新更新