【问题标题】:What is this ph parameter?这个ph参数是什么?
【发布时间】:2013-07-20 13:38:46
【问题描述】:

我正在测试我在 android 中为一个小音频应用找到的这段代码,但我有点卡住了。

short samples[] = new short[buffsize];
int amp = 32767;
double twopi = 2*Math.PI;
double fr = 262.f;
double ph = 0.0;

while(isRunning)
{
    fr = 262 + 262*sliderval;

    for(int i=0; i < buffsize; i++)
    {
        samples[i] = (short) (amp*Math.sin(ph));
        ph += twopi*fr/sr;
    }
    audioTrack.write(samples, 0, buffsize);
}

我知道这个循环可以合成声音,但我不知道“ph”参数是什么以及它如何适合数学生成正弦波。如果有人知道它是什么,可以向我解释一下吗?

【问题讨论】:

    标签: android audio parameters sound-synthesis


    【解决方案1】:

    这是正弦波的相位。初始值为 0,因此波形的第一个样本为 0。然后对于每个样本,它都会递增,因此波形具有指定的频率。

    看起来更像是一道数学题……

    如果您需要有关阶段的更多信息:Wikipedia - Phase(waves)

    【讨论】:

      【解决方案2】:

      从这个函数导出一个正弦波:

      y(t) = Amplitude * Sin( 2* PI * Frequency * SAMPLE_TIME)
      

      这行代码:

      samples[i] = (short) (amp * Math.sin(ph));
      

      本质上就是上面的函数。在第一次执行 for 循环时,ph 是 zero,因此,计算有效。 ph 本质上是赋予上述函数的角度部分。接下来,ph 取值:

      ph += twopi * fr/sr;
      

      这里,fr / sr 是频率/采样率。另外,请注意:

      SAMPLE_TIME = 1 / SAMPLE_RATE
      

      【讨论】:

      • 谢谢!这实际上有很大帮助!
      【解决方案3】:

      在上面的代码中,ph 是一个相位累加器。

      以下两种关系可能有助于理解正在发生的事情:

      1. 频率是相位相对于时间的变化率。
      2. Sin(x) = Sin(x + N * 2 * PI) 用于N 的所有整数值

      随着循环的每次循环,样本之间的相位差被添加到相位累加器上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-09
        • 2019-10-22
        • 1970-01-01
        • 2021-11-30
        • 2021-01-18
        • 1970-01-01
        相关资源
        最近更新 更多