我对自己的所作所为有点困惑。据我所知,java,尤其是 DataOutputStream 以 Big endian 写入值。
我正在编写一个小信号发生器,并且必须以小端存储文件。到目前为止没问题,只需交换字节即可。
writeShort()
也说“先写高字节”。
因此,例如十进制“2”通常会存储为:
00 02 (big endian)
02 00 (little endian) is what I need.
所以我交换字节:
public static short swap (short value)
{
int b1 = value & 0xff;
int b2 = (value >> 8) & 0xff;
return (short) (b1 << 8 | b2 << 0);
}
并写出简短的:
dos.writeShort(swap(x[t]));
十六进制编辑器以应为的格式向我显示文件:02 00
当我现在尝试打开生成的音频文件时,我什么也听不见。(大胆的原始数据导入和采样率等设置都正确)。
我删除了字节交换,得到一个文件:00 02
这是大端。
我再次打开大胆,以相同的配置,我听到了语气。确实我配置了小端!
我将文件复制到 Windows(我正在使用 Mac)并在 Cool Edit 2000 中打开文件,再次选择 16khz、16 位无符号 pcm 和小端(16 位 LSB、MSB)。又听到了语气,什么都选大端。
我的失败在哪里?有些事情让我感到困惑,因为这不应该像我描述的那样工作..
生成音调:
// x(t) = A*cos (2*pi * f * t + phi)
//
if(null != dos)
{
double sampPeriod = 1.0/16000;
short x[] = new short[16000]; // 16k samples for 1 second
for(int t=0; t < x.length; t++)
{
double time = t * sampPeriod;
x[t] = (short) (amplitude * Math.sin(2.0*Math.PI*frequenz*time+phase));
}
for(int t=0; t < x.length; t++)
{
try {
dos.writeShort(x[t]);
} catch (IOException e) {
e.printStackTrace();
}
}
}
于 2013 年 2 月 4 日下午 2:16 编辑:我正在阅读,假设我的理解是失败,我在维基百科上找到了以下图片:
在下一篇文章中查看问题的答案。