我正在测试我在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”参数是什么以及它如何适合数学生成正弦波。如果有人知道它是什么,请有人向我解释一下吗?
答案 0 :(得分:1)
这是正弦波的阶段。初始值为0,因此波的第一个样本为0.然后,对于每个样本,它会递增,因此波形具有指定的频率。
无论如何看起来更像是一个数学问题......
您需要有关阶段的更多信息:Wikipedia - Phase(waves)
答案 1 :(得分:0)
在上面的代码中,ph
是阶段累积器。
以下两种关系可能有助于了解正在发生的事情:
Sin(x) = Sin(x + N * 2 * PI)
表示N
每次循环时,样本之间的相位差被添加到相位累加器上。
答案 2 :(得分:0)
正弦波源自此函数:
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
是Frequency / Sample_Rate。另请注意:
SAMPLE_TIME = 1 / SAMPLE_RATE