生成一个频率的单个周期?

时间:2012-02-02 19:47:53

标签: java android audio

我希望能够拍摄频率(例如1000hz,250hz,100hz)并通过手机硬件播放。

我知道如果可以计算比特或短路数组,Android的AudioTrack将允许我播放16位PCM。我想只计算一个单个周期,以便以后我可以循环它而不会出现任何问题,这样我就可以缩短计算时间。

如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

循环一个周期不一定是一个好主意 - 周期可能不适合精确数量的样本,因此在每个周期结束时可能会出现不希望的不连续性,或者更糟糕的是,可听频率可能会结束稍微关闭。

那就说数学并不难:

float sample_rate = 44100;
float samples_per_cycle = sample_rate / frequency;
int samples_to_produce = ....

for (int i = 0; i < samples_to_produce; ++i) {
   sample[i] = Math.floor(32767.0 * Math.sin(2 * Math.PI * i / samples_per_cycle));
}

要了解上述关于频率的含义,请采用440 Hz的标准调谐音高。

严格来说,这需要100.227个样本,但上面的代码会产生100个。所以如果你反复重复100个样本,你实际上每秒会播放 441 次样本,所以你的音调会很高以1 Hz的频率关闭。

为了避免这个问题,你真的需要计算波形的几个周期,虽然我不知道需要很多来欺骗耳朵听到正确的音高。

理想情况下,所需的数量应尽可能多:

i / samples_per_cycle

是一个整数,因此最后一个样本(技术上是最后一个样本之后)完全在循环边界上结束。我如果你的输入频率都是整数,那么产生一秒的价值就完全可以了。