当前位置: 首页 > 知识库问答 >
问题:

我怎样才能转换一个。wav文件到浮点数组(编辑浮点数组,例如添加两个信号)并返回到浮点数组。无白噪声的wav文件

孔阎宝
2023-03-14

我正试图通过光线追踪来编程听觉处理。要根据光线跟踪器中的信息编辑样本,我需要转换。wav文件(文件格式:PCM签名,16位,立体声,2字节/帧,小尾端)到浮点数组。

我通过一个audioInputStream和一个DataInputStream转换了音频,我将音频加载到一个字节数组中。

然后我将字节数组转换成如下的浮点数组

byte[] samples;
float[] audio_data = float(samples); 

当我将浮点数组转换回。wav文件,我正在获取原始音频文件的声音。

但是当我添加另一个浮点阵列到原始信号,并通过上述方法将其转换回. wav文件(即使我添加相同的信号),我得到一个白噪声信号,而不是想要的信号(我可以听到白噪声调制下的原始信号,但非常非常安静)。

我以前读过关于这个问题的文章,从浮点数组到字节数组的转换可能会出现问题。这是因为float是一种32位的数据类型,字节(在java中)只有16位,而且不知怎么的,字节混合在一起是错误的,所以结果是白噪声。在处理过程中,有一种数据类型具有带符号的16位整数(名为:“short”),但我不能再修改振幅,因为我需要浮点值,而我不能将其转换为short。

我还试图通过将信号从16位值(-32768/32767)调制为-1/1的值,并在混合(添加)信号后再次返回,来处理浮点数组中的溢出(振幅)。结果给了我白噪音。当我添加了两个以上的信号时,我什么也听不到。

我想解决的具体问题是以浮点数组的形式添加许多信号(1000多个信号,延迟相当大,以产生一种混响)。然后我想把它们组合成一个浮点数组,我想把它保存为一个没有白噪声的音频文件。

我希望你们能帮我。

共有1个答案

杨轶
2023-03-14

如果您有真正的PCM数据点,使用简单加法应该没有问题。唯一的问题是,在极少数情况下(假设你的音频一开始不太热),这些值会超出范围。这往往会造成严重的失真,而不是白噪声。得到白噪声的事实向我表明,对于输出的格式,可能您没有正确地将PCM总和转换回字节。

这是我在AudioCue中使用的一些代码,用于将PCM转换回字节。格式假设为16位、44100 fps、立体声、小端。我将PCM用作标准化浮点数。该算法一次为缓冲区的数据进行转换。

for (int i = 0, n = buffer.length; i < n; i++)
    {
        buffer[i] *= 32767;

        audioBytes[i*2] = (byte) buffer[i];
        audioBytes[i*2 + 1] = (byte)((int)buffer[i] >> 8 );
    }

有时,像数学这样的函数。min(Math.max(audioval,-1),1)或Math。min(Math.max(audioval,-32767),32767)用于将值保持在范围内。更复杂的限制器或压缩算法将根据需要调整音量。但是,如果不处理,结果应该是失真,而不是白噪声。

如果错误发生在另一个阶段,我们需要查看更多的代码。

所有这一切都表明,我祝你好运与1000点回波阵列混响。我没听说过这种方法有效。也许现在有处理器可以处理计算量了?(你是想实时完成这项工作吗?)我在实时混响编码方面唯一的成功是使用施罗德方法,从CCMRA Freeberb中插入结构和值,使用克雷格·林德利(Craig Lindley)现在已经很古老(版权2001)的书《Java数字音频》(Digital Audio with Java)中的代码。这本书的大部分内容都涉及过时的GUI代码(预Swing!),但他给出的全通和梳状滤波器的代码仍然有效。

我记得当我在做这个的时候,我找到了一个更好的混响来尝试和编码,但是我必须做一些真正的挖掘来尝试和找到我的笔记。当时我觉得自己疯了,因为算法是通过框图呈现的,而不是编码细节,甚至是伪代码。不过,我想再做一次,得到一个比施罗德类型更好的混响来工作。舍尔德对于不太撞击的声音还过得去。

获得实时光线追踪的解决方案将是一项有价值的成就。许多应用在虚拟现实和游戏中。

 类似资料:
  • 我有音频数据记录从麦克风这样:(ndarray的浮动) 这是我的代码: 但当我播放音频时,它就坏了,只有噪音。。。如何将其转换为。wav音频文件?

  • 问题内容: 我有一个浮点数数组: 在数组上运行sort()后,我得到了: 请注意,JavaScript(节点)的5.8 …大于49.6…。这是为什么? 如何正确地对这些数字进行排序? 问题答案: 传递排序函数: 结果: 从MDN: 如果未提供compareFunction,则通过将元素转换为字符串并按字典顺序(“字典”或“电话簿”,而非数字)顺序比较字符串来对元素进行排序。

  • 3.2. 浮点数 Go语言提供了两种精度的浮点数,float32和float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8

  • 我有Java应用程序,它集中处理2D浮动数组(float[][]数组),实际上在黑色背景上保存图像。两个维度是相等的(平方)并且是2的幂(通常是256、512、1024),所以靠近边界的区域在大多数情况下都是零。 为了提高性能(有一些FFT)和降低在这些阵列上操作的复杂性(如旋转等),大小等于2的幂。根据我的计算,这个应用程序的内存消耗应该达到2-3Gb,而达到4-5Gb(查看Windows任务管

  • 问题内容: Python Decimal不支持从float构造。它期望您必须先将float转换为字符串。 这非常不方便,因为float的标准字符串格式器要求您指定小数位数而不是有效位数。因此,如果您的数字最多可能有15个小数位,则需要将其格式设置为Decimal(“”%。15f“%my_float),如果您之前还有任何有效数字的话,也会在第15个小数位出现垃圾十进制。 有人可以建议一种在用户输入时

  • 问题内容: 如何转换 至 在NumPy中? 问题答案: 好吧,如果您以列表的形式读取数据,则可以这样做(或等效地,使用列表理解)。(在Python 3,你需要调用的,如果你使用的返回值,因为现在返回一个迭代器)。 但是,如果已经是一串Numpy的字符串,则有更好的方法。使用。