如何在固定的持续时间内生成指定频率的音调



我是安卓系统的新手。

有人能帮助我使用非弃用代码来生成F频率和S秒持续时间的音调吗

我找到了这个,但它使用了不推荐使用的方法。

以下是链接代码的呈现,适用于API 23+级,并添加了音调持续时间的参数:

short generatedSnd[];
int sampleRate = 44100;
float freqOfTone = 1000;    //Hz
float amplitude = 10000;    //0..32767 (0x7FFF)
float lengthSeconds = 1.0f;
private void genTone(){
int numSamples = (int) (sampleRate * lengthSeconds);
generatedSnd = new short[numSamples];
// fill out the array
for (int i = 0; i < numSamples; ++i) {
generatedSnd[i] = (short) (Math.sin(2 * Math.PI * i / (sampleRate/freqOfTone)) * amplitude);
}
}
private void playSound(){
AudioTrack audioTrack = new AudioTrack.Builder()
.setAudioFormat(
new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(sampleRate)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.build()
)
.setTransferMode(AudioTrack.MODE_STATIC)
.setBufferSizeInBytes(generatedSnd.length * 2)   //2 bytes-per-sample
.build();
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}

该代码已在模拟器中测试了50秒,但由于传递给setBufferSize()的大小,它可能会在较高的播放时间崩溃。请注意,它不包括其他高级功能来帮助您处理任意长的播放时间,例如1.(流式播放,或2.(由于float量化误差在远离0的值处导致的相位校正。

然而,它应该可以在小于10秒的时间内正常工作。

AudioTrack清除代码(stop()/release()(也被省略。

最新更新