1

我使用 Audacity 创建了两个波形文件。两者都有 44100hz 采样率,32 位浮点采样,保存为 WAV (Microsoft) 16 位签名并包含 1s 的静音(根据 Audacity)。不同之处在于一个文件包含一个通道,而另一个文件包含两个(立体声)。读取一个通道文件时,我得到这样的帧:

0x00 0x00  
...  ...  

正如预期的那样,但是在阅读第二个文件时,我得到了:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

这对我来说似乎是一个随机模式。它与频道在波形文件中的存储方式有关吗?不应该是这样的:

0x00 0x00 0x00 0x00  
...  ...  ...  ...  

?

PS:我使用python内置模块'wave'来读取文件。

4

5 回答 5

3

数据不是随机的

看着它,我似乎看到每行有 2 个 int 值,每 2 个字节为 little-endian:

0x00 0x00 0x00 0x00  
0x01 0x00 0xff 0xff  
0x00 0x00 0x00 0x00  
0x00 0x00 0x01 0x00  
0xff 0xff 0x01 0x00  
0xfe 0xff 0x03 0x00  

解码为:

 0  0
 1 -1
 0  0
 0  1
-1  1
-2  3

因此,正如其他人所建议的那样,您会看到那些非常接近 0 的数字(几乎是无声的),看起来像抖动。

于 2010-12-15T03:54:43.343 回答
1

据我所知,通道应该是交替的,因此 44.1 khz 的 1 秒将是 88,200 k 样本的流,左右交替或规范所说的任何内容。

Audacity 也不应该让 float -> int 转换错误,反之亦然。尝试从整数样本而不是浮点数开始。或者让一个通道具有已知值(即 Ox8f8f)而另一个通道为 0,这可能更容易弄清楚。

于 2010-06-04T19:59:50.330 回答
1

预期静音的极低电平信号可能是由从 32 位到 16 位的转换中使用的抖动引起的。

于 2010-06-04T20:57:31.590 回答
0

已删除代码和上一篇文章。

沉默:“真正的”沉默必须为零。否则,它通常被称为“房间”寂静,如果您不使用噪音门,它会随处可见的非常小的噪音。(记录)这只是一个想法:请记住,使用有符号值将导致 1 位用于有符号/无符号标记。也许(我不知道)这是您在使用 audacity 将其转换为签名的波形文件后所看到的。对不起,但我没有时间测试这个。

Wave 文件:我不知道您对声音文件了解多少,但是:如果您只想添加静音,请尝试以下方式:每个样本的大小为 X 位:因此一个样本需要 X/8 字节。您知道采样率-因此您可以将原始原始字节数组复制到一个大小 (silence_length_in_samples bytes_per_frame)+(original)+(silence_length_in_samples bytes_per_frame) 中,然后使用我希望可以的 python 工具将其写回声音文件做这个。

2个通道:原始字节组织在: [sample1(channel1_bytes, channel2bytes)][sample2(channel1_bytes,channel2_bytes).... 我希望我的意思很清楚:)

于 2010-06-04T19:38:16.423 回答
0

您可以使用以下代码查看这些数字:

import struct
struct.unpack("f", struct.pack("I", 0xfeff0300))
(-1.6948435790786458e+38,)

它们看起来都非常小,可以说是沉默的数字。我生成了静音并将其保存为 32 位浮点 WAV,并且没有得到小数字。我的文件包含零,不包括标题。

可以像这样生成 0.2 秒的静默 2 通道浮点数据:

import array
silence = array.array("f", [0] * int(44100 * 2 * 0.2))
于 2010-06-04T20:45:04.510 回答