正弦波在Java中交替出现失真

Bil*_*ici 3 java math signals trigonometry

我正在尝试生成正弦波并将其添加到字节数组.我搜索并找到了.但是,我总是像附件一样得到扭曲的波形.

请告诉我你为什么会这样.谢谢.

我的代码在这里

private byte[] getData(int freq) {   // taking pitch data
    double pha = Math.PI/2;          // defining phase
    final int LENGTH = 44100 * 10;   // defining length of sine wave, byte array
    final byte[] arr = new byte[LENGTH];
    for(int i = 0; i < arr.length; i++) {
        double angle = (2.0 * Math.PI * i*freq+pha) / (44100); 
        arr[i] = (byte) (Math.cos(angle) *127* 0.3);    // 0.3 is amplitude scale        
    }
    return arr;
}
Run Code Online (Sandbox Code Playgroud)

扭曲波形示例图片

在此输入图像描述

NPE*_*NPE 5

代码看起来很好.我怀疑它是可视化器将两个补码符号值解释为无符号(-1成为255,-2成为254等等).

我写了一个wav文件并用SonicVisualiser绘制它

根据WAVE PCM声音文件格式:

8位采样存储为无符号字节,范围从0到255. 16位采样存储为2的补码有符号整数,范围从-32768到32767.

看起来您需要将正弦波向上移动128(使其完全适合0-255范围内),或者转向使用16位采样.