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

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

我知道Android的AudioTrack允许我播放一个16位PCM,如果我可以计算一个位或短路数组。 我想只计算一个句点,以便以后我可以循环它没有任何问题,所以我可以保持计算时间。

怎么能实现这一目标?

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

那说,数学并不难:

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 

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