gpt4 book ai didi

python - wavfile.write : Identical arrays but only one works

转载 作者:行者123 更新时间:2023-12-01 01:53:54 25 4
gpt4 key购买 nike

我有两个相同的数组(按照设计,因为我通过执行 FFT 然后对第一个数组进行逆 FFT 获得了第二个数组)。但是,当我将第一个文件写入 .wav 文件时,我会得到发声文件,而对第二个文件执行相同操作时则不会。我听不到任何声音。这是我的代码:

fs, data = wavfile.read(filename)
a = data.T[0]
c = fft(a)
y2 = fftp.ifft(c)
y2 = np.array([int(round(i)) for i in y2.real])

现在当我尝试时:

sum(y2==a)==len(a)

我得到 True,这意味着两个数组是相同的。唯一的区别是“dtype=int16”:

In [322]: a
Out[322]: array([ 1, 1, 1, ..., 21, 20, 21], dtype=int16)
In [321]: y2
Out[321]: array([ 1, 1, 1, ..., 21, 20, 21])

如何将第二个数组转换为同时生成有效 .wav 文件的格式?

最佳答案

这个“唯一的区别”是一个巨大的区别。

The WAV format默认情况下,将样本存储为有符号小尾数 16 位整数。因此,当您将 int16 值的数组写入为原始数据时,您将获得一个可播放的 WAV 文件(至少在小端系统上)。

但是,当您写入 int32 值的数组时,您会得到无意义的结果 - 每个数字都会变成 2 个样本,其中一个是数据的高位字,下一个是数据的低位字。因此,您将以半速获得原始音频样本,并与有效的随机噪声交织。

<小时/>

或者,您也可以使用非默认 WAV 格式。您没有展示足够的代码来展示如何处理此问题,但您可以以各种不同的格式编写 WAV 文件,从 8 位无符号整数到 32 位 float ,并且 32 位有符号整数是有效的格式。 WAV 文件甚至可以处理压缩(包括 MP3)。

但不太常见的格式实际上可能无法适用于所有工具;许多程序假设 WAV 是 16 位整数,并且不知道如何处理其他内容。

因此,您最好编写 16 位整数。

<小时/>

或者,也许您已经这样做了 - 使用正确的 header 写入 32 位 int 值 - 并且您的播放器可能正在正确处理它们。

但是您正在写入 -32768 和 32767 之间的 32 位 int 值。这意味着您仅使用动态范围的 1/65536,因此一切都会非常安静。如果要写入 32 位 int 值,则需要将它们标准化为 32 位 int 范围,而不是 16 位 int 范围。

<小时/>

解决所有这些问题的最简单的解决方案是:在写入之前将值转换回 int16:

y3 = y2.astype(np.int16)

关于python - wavfile.write : Identical arrays but only one works,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50431296/

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