生成一个频率的单个周期?
我希望能够采用频率(例如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
是一个整数,因此最后一个样本(技术上是最后一个样本之后的样本)正好在循环边界上结束。 我认为如果你的输入频率都是整数,那么产生一秒的价值就完全可行了。