Java 产生一个单一周期的频率?

Java 产生一个单一周期的频率?,java,android,audio,Java,Android,Audio,我想能够采取一个频率(如1000hz,250hz,100hz),并通过手机硬件播放出来 我知道Android的AudioTrack可以让我播放16位PCM,如果我能计算出一组比特或短片的话。我只想计算一个单周期,这样以后我就可以无任何问题地循环它,这样我就可以减少计算时间 如何实现这一点?循环一个周期并不一定是一个好主意-该周期可能不适合精确数量的样本,因此在每个周期结束时可能会出现不希望出现的不连续性,或者更糟的是,音频可能会稍微偏离 也就是说,数学并不难: float sample_rate

我想能够采取一个频率(如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));
}

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

同意。此外,由于调谐似乎通常表示为“分”(百分之一半音),也许可以安全地将频率调整在±0.5分以内,以便获得一些合理的整数采样数。对于整数周期数。
i / samples_per_cycle