我希望能够拍摄频率(例如1000hz,250hz,100hz)并通过手机硬件播放。
我知道如果可以计算比特或短路数组,Android的AudioTrack将允许我播放16位PCM。我想只计算一个单个周期,以便以后我可以循环它而不会出现任何问题,这样我就可以缩短计算时间。
如何实现这一目标?
答案 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
是一个整数,因此最后一个样本(技术上是在最后一个样本之后)完全在循环边界上结束。我想如果你的输入频率都是整数,那么产生一秒的价值就完全可以了。