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);
}
}
[アップデート]
問題は 18kHz で始まります。現在、最良の説明は次のとおりです。
Mac にはかなりアグレッシブなアンチエイリアシング フィルターがいくつかあり、ドッグ パーク ソフトウェア アプリは PCM バッファリングを使用してサウンドを生成していない可能性があります。可能であれば、より高いサンプリング周波数を試してみます。Blockquote - (Robert によるコメント) しかし、これが正確かどうかは 100% 確信が持てません。
別の解決策の 1 つは、外部スピーカーを接続することです (コンピューターの音量が最大に設定されていることを確認し、スピーカーで調整します)。