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

时间:2018-04-10 01:37:52

标签: ios objective-c audio sine synthesizer

我正在尝试为我正在处理的简单波表合成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编程的新手,喜欢使用音频。

1 个答案:

答案 0 :(得分:0)

首先考虑你的行

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

ph是你对sin函数的输入,这是弧度的一些值...请注意,sin函数会自动处理大于2 *的值,它只会包裹它,所以不需要管理你的ph变量,然后简单地递增它

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

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

请记住,当您递增外部循环i时,您正在递增ph,而您正在使用ph来确定您在PI循环中的位置,但这是正常的--assets-dest='./ios'然后也不能输入sin(ph)......还有其他东西必须被输入sin()或者其他东西在你的PI循环中维持你的样本位置......你错误地将两个责任混合成一个变量< / p>

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