なぜ、このコードは非常にノイズの多い正弦波を生成していますか?

ABAB ABAB:

私はJavaで非常にシンプルなサウンドシンセを書くしようとしています。私が使用しているjavax.sound.sampledパッケージを。ノイズ波と一緒に演奏静かな暖かいのいくつかの種類がありますように作品を以下のコードが、正弦波は非常に騒々しいと音です。

try {
    double sampleRate = 44100;
    //8 bits per sample, so a byte.
    AudioFormat audioFormat = new AudioFormat((float) sampleRate, 8, 1, true, false);
    SourceDataLine line = AudioSystem.getSourceDataLine(audioFormat);

    line.open(audioFormat);
    line.start();

    //A4
    double freq = 440.0;

    byte[] buf = new byte[1];

    //the formula for a sample is amplitude * sin(2.0 * PI * freq * time)
    for (int i = 0; i < sampleRate; i++) {
        double t = (i / (sampleRate - 1));
        double sample = 0.1 * Math.sin(2.0 * Math.PI * freq * t);

        //scaling the sound from -1, 1 to -127, 127
        buf[0] = (byte) (sample * (double) Byte.MAX_VALUE);

        line.write(buf, 0, 1);
    }

    line.drain();
    line.stop();
    line.close();
} catch (Exception e) {
    throw new RuntimeException(e);
}

私は音が実際にうるさい、と確かにあったことを確認するために、EQに発生する音を置きます:

これは私が得たものです

支配的な周波数は440 Hzのですが、存在してはならないいくつかの他の周波数があります。なんでこんなことが起こっているの?どのように私はそれを修正しますか?

そのほかの男:

ここにあなたの正弦波です:

ギザギザの正弦波

あなたは低振幅と組み合わせた低ビット深度を使用しているので、それは非常にぎざぎざです。あなただけの中から選択する25種類のサンプル値を持っています。

あなたは8ビットサンプルの全範囲を使用して、1.0へのあなたの振幅を設定した場合、ここにあなたの正弦波ではなく、です。

正弦波を滑らかに

そして、ここで0.1の振幅を保っていますが、代わりに16ビットのサンプルを使用しました:

均等正弦波を平滑

これらのオプションの両方が明らかにノイズの少ないだろう。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=186026&siteId=1