Java声音频率合成

时间:2012-06-06 02:05:59

标签: java audio synthesize

我正在尝试在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发表评论)   但如果这是准确的话,我们并不是百分之百确定。

另一种解决方案是插入外部扬声器(确保计算机音量设置为最大,并在扬声器上进行调节)。

0 个答案:

没有答案