您的评论说该代码假定为大端字节序。
从技术上讲,您 实际上是 在输出Little-endian,但这并不重要,因为通过幸运的怪癖,您的最高有效字节始终为0。
编辑:进一步解释-当您的值最大为127时,您应该正在编写(0x00,0x7f),但是代码的实际输出为(0x7f,0x00),即32512。这恰好在附近适当的
16位 最大值32767,但低8位全为零。最好始终使用32767作为最大值,然后根据需要舍弃低8位。
这意味着即使您正在输出16位数据,有效分辨率也仅为8位。这似乎是造成音质不足的原因。
我制作了一个代码版本,将原始数据转储到文件中,并且由于移位本身而看不到其他任何错误。没有符号或丢失位的意外变化,但是嗡嗡声与8位采样质量一致。
另外,如果您根据采样数计算波动方程,然后分别担心字节偏移,那么数学上的值会变得容易多了:
int samples = 2 << 19;byte audioBuffer[] = new byte[samples * channels * sampleSizeInBytes];for ( int i = 0, j = 0; i < samples; ++i ){ int wave = (int)(32767.0 * Math.sin(2.0 * Math.PI * frequency * i / sampleRate)); byte msb = (byte)(wave >>> 8); byte lsb = (byte) wave; for (int c = 0; c < channels; ++c) { audioBuffer[j++] = msb; if (sampleSizeInBytes > 1) { audioBuffer[j++] = lsb; } } }


