gpt4 book ai didi

java - writeShort in little Endian : hex shows big, 但打开只适用于 le

转载 作者:搜寻专家 更新时间:2023-11-01 03:25:12 25 4
gpt4 key购买 nike

我对我所做的有点困惑..据我所知,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,这是大端。

我再次打开 audacity,使用相同的配置,我听到了提示音。明确地说我配置了小端!

我将文件复制到 Windows(我在 Mac 上工作)并在 Cool Edit 2000 中打开文件,再次选择 16khz、16 位无符号 pcm 和小端(16 位 LSB、MSB)。我又听到了提示音,选择 big endian nothing。

我的失败在哪里?有些事情让我感到困惑,因为这不应该像我描述的那样工作..

生成音调:

// 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 编辑:我正在四处阅读,假设我理解的某些东西是失败的,我在维基百科上找到了以下图片:

read access

在下一篇文章中查看问题的答案。

最佳答案

好的伙计们和所有对这个问题感兴趣的人:

失败与小端或大端无关。我从 LE 和 BE 了解到的一切都是正确的。 (但不是最后关于读取权限的假设,这在我搜索任何解释时欺骗了我的思想..)

失败与信号的幅度有关。

如果振幅太低 - 音量本身(通过振幅产生)太低。所以什么也听不见。将写入的大端文件解释为小端使得文件中的每个短样本都变得更大(回到 zch 的评论:00 02 被解释为小端时是 512)。

这在当时产生了较高的采样值,导致我听到了一个东西。

通过设置更高的振幅正确地将字节交换为小字节序,我可以再次听到声音。所以主要的失败与字节序无关。

zch 的评论让我一遍又一遍地沉思,导致在 Windows 上读取一些值并看到本地 LE 解释与 zch 所说的相同。这让我找到了振幅点,现在我找到了问题所在。希望没有其他人会犯这种愚蠢的错误,或者将来会找到这篇文章并知道 :-)

关于java - writeShort in little Endian : hex shows big, 但打开只适用于 le,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15760938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com