我正在尝试在java中构建一个频率发生器,但我遇到了一些麻烦。出于某种原因,我在耳机扬声器上得到了我想要的东西,但当我在我的macbook pro 13“扬声器上尝试相同的代码时它只是不起作用。问题只发生在高频率(我试图在19kHz到20kHz之间)。对于较低频率(例如10kHz),我得到了正确的结果。
我使用的是44100的采样率。
以下是播放生成的正弦频率的代码:
AudioFormat af = new AudioFormat(sampleRate, 16, 1, true, true );
DataLine.Info info = new DataLine.Info ( SourceDataLine.class, af );
SourceDataLine source = (SourceDataLine) AudioSystem.getLine( info );
source.open(af);
source.start();
source.write( buf, 0, buf.length );
source.drain();
source.stop();
source.close();
以下是我如何生成缓冲区:
public void play(float seconds, int sampleRate, double frequency){
for (int i = 0; i < numSamples; ++i) {
sample[i] = Math.sin((2 * Math.PI * i / (sampleRate/frequency)));
}
for (final double dVal : sample) {
final short val = (short) ((dVal * 32767));
buf[pos++] = (byte) ((val & 0xff00) >>> 8);
buf[pos++] = (byte) (val & 0x00ff);
}
}
[UPDATE]
问题始于18kHz。 现在最好的解释是:
可能会有一些相当激进的抗锯齿过滤器 Mac,狗公园软件应用程序没有使用PCM缓冲 像你一样生成声音。我会尝试更高的抽样 频率尽可能。 Blockquote - (Robert发表评论) 但如果这是准确的话,我们并不是百分之百确定。
另一种解决方案是插入外部扬声器(确保计算机音量设置为最大,并在扬声器上进行调节)。