【发布时间】:2016-01-05 11:54:47
【问题描述】:
我正在尝试使用 Java 产生哔声。我在 SO 上找到了this 的答案。
我正在使用该答案中的代码来产生哔哔声。代码是:
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);
}
}
在main 方法中,我使用Sound.tone(15000,1000); 产生频率15000 Hz 播放1000 ms
但是,如果我把它改成这样,我就能听到声音:
-
Sound.tone(1,1000);,. Sound.tone(19999,1000);
从科学上讲,这是不可能的。
- 在第一种情况下,声音应该是次声波,我应该无法感知。
- 在第二种情况下,我应该还是听不到声音,因为随着年龄的增长,听力会下降,我这个年龄的人应该只能听到大约16000 赫兹。
此外,我听不见:
-
Sound.tone(0,1000);(有点符合预期) Sound.tone(20000,1000);
那么,我怎样才能产生某些特定频率的声音?
我在互联网上搜索,但找不到任何相关信息。
在此编辑之前给出的答案解释了它发生的原因,但没有给出我想要的答案。
【问题讨论】:
-
但我当然听不到次声,根据这个程序我显然可以。
-
@SureshAtta 我建议用耳朵代替眼睛。
-
@Arc676 我猜你误解了我的问题。如果计算机不是为产生次声/超声波而制造的,那么我怎么能用这个程序听到它。我的意思是说如果我写
Sound.tone(10,1000);,我可以听到声音,这应该是次声波。 -
您的硬件可能无法产生如此低或高的频率并且不会引发任何异常,而是尝试尽可能接近您传递给硬件的值.这些值可能是人类可以听到的。
-
如何使用麦克风并对录制的声音进行频率分析。如果您手头有智能手机,那么您最喜欢的应用商店中应该有一个可用的应用。