Java蜂鸣声:产生某些特定频率的声音
我正在尝试使用Java产生哔哔声。我在SO上找到了这个答案。
我正在使用该答案中的代码来产生哔哔声。代码是:
import javax.sound.sampled.*;
public class Sound
{
public static float SAMPLE_RATE = 8000f;
public static void tone(int hz, int msecs)
throws LineUnavailableException
{
tone(hz, msecs, 1.0);
}
public static void tone(int hz, int msecs, double vol)
throws LineUnavailableException
{
byte[] buf = new byte[1];
AudioFormat af = new AudioFormat(SAMPLE_RATE,8,1,true,false);
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af);
sdl.start();
for (int i=0; i < msecs*8; i++) {
double angle = i / (SAMPLE_RATE / hz) * 2.0 * Math.PI;
buf[0] = (byte)(Math.sin(angle) * 127.0 * vol);
sdl.write(buf,0,1);
}
sdl.drain();
sdl.stop();
sdl.close();
}
public static void main(String[] args) throws Exception {
Sound.tone(15000,1000);
}
}
在该方法中,我用产生频率15000Hz的声音来播放1000msmain
Sound.tone(15000,1000);
但是,如果我将其更改为:,我可以听到声音:
-
Sound.tone(1,1000);
, . Sound.tone(19999,1000);
从科学上讲,这是不可能的。
- 在第一种情况下,声音应该是次音速的,我不应该能够感知它。
- 在第二种情况下,我仍然无法听到声音,因为随着年龄的增长,听力能力往往会下降,而我这个年龄的人应该只能听到大约16000 Hz的声音。
此外,我听不到:
-
Sound.tone(0,1000);
(有点符合预期) Sound.tone(20000,1000);
那么,如何产生某些特定频率的声音呢?
我在互联网上搜索,但找不到任何关于它的东西。
在此编辑之前给出的答案解释了为什么会发生,但没有给出我想要的答案。