我将以下代码组合在一起,以在Android设备上生成和播放正弦波声音。
numSamples根据采样频率(44.1KHz)确定声音的长度。因此,例如,如果我设置numSamples = 22500,则声音将播放500ms。
虽然代码可以在较长的声音持续时间内(即长于150毫秒)正常运行,但是如果我设置numSamples来缩短播放时间,则我听不到任何声音。例如,如果我将numSamples设置为3000,则听不到任何声音。
[我该如何调整代码,以便可以在很短的持续时间内在Android设备上播放正弦波声音,例如1ms,10ms,50ms,100ms?
请提供意见。
void playSound(double freqOfTone, int numSamples) {
final int sampleRate = 44100;
final double sample[] = new double[numSamples];
final byte generatedSnd[] = new byte[2 * numSamples];
for (int i = 0; i < numSamples; ++i) {
sample[i] = Math.sin(2 * Math.PI * i / (sampleRate / freqOfTone));
}
// convert to 16 bit pcm sound array
// assumes the sample buffer is normalised.
int idx = 0;
for (double dVal : sample) {
short val = (short) (dVal * 32767);
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
AudioTrack audioTrack = new AudioTrack(
AudioManager.STREAM_MUSIC,
sampleRate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
numSamples,
AudioTrack.MODE_STREAM);
audioTrack.write(generatedSnd, 0, numSamples);
audioTrack.play();
}
您是否已使用耳机进行测试?笔记本电脑扬声器,甚至平板电脑,电话和手持设备中的扬声器,其扬声器在播放低音时确实非常糟糕。使用一副好的耳机,您应该可以听到较低的音调。在使用算法进入杂草之前,我会进行测试(表面上看起来还不错)。
PS可能希望将“窦”编辑为“正弦”。