当我将.wav文件中的数据存储到字节数组中时,这些值代表什么意思? 我读到它们是以两个字节表示的,但这两个字节的确切含义是什么?
abcdefgh
a
和b
组成了第一个16位数字,是第1声道的第一个值;c
和d
则是第2声道的第一个值。e
和f
是第1声道的第二个值,g
和h
是第2声道的第二个值。因为这不足以构成一秒钟的数据,所以你听不到太多东西。
将所有这些信息结合起来,可以计算出您拥有的比特率,也就是录音机每秒生成的信息位数。在我们的示例中,每个采样每个声道会产生2个字节。如果有两个声道,那么就是4个字节。您需要大约44000个每秒的样本来表示人类正常听到的声音。因此,您将得到每秒176000个字节,即1408000个比特。
当然,这里不是2位值,而是两个2字节的值,否则您会得到非常糟糕的质量。
ab
只是一个单独的值,它被存储为“signed int16”。cd
是第二个通道的第一个值。对于8位音频,您的版本是正确的(我的示例与我在https://de.wikipedia.org/wiki/RIFF_WAVE#%E2%80%9EData%E2%80%9C-Abschnitt上阅读的德语维基百科文章一致)。 - kratenkowave
和scipy
下,wav
返回了一个字节字符串,我后来将其转换为16位int
,但是scipy
返回了一个9745238 X 2
的带符号16位int
矩阵(其中1列是通道1数据,2列是通道2数据),当我将其与nparray的wav
输出进行比较时,它的顺序与我在先前评论中告诉你的顺序相反,所以它与你的答案有些矛盾。 - P.hunter通常,前44个字节是标准的RIFF头文件,详情请参考:http://tiny.systems/software/soundProgrammer/WavFormatDocs.pdf和http://www.topherlee.com/software/pcm-tut-wavformat.html
苹果/OSX/macOS/iOS创建的.wav文件可能会在头文件中添加'FLLR'填充块,因此将初始RIFF头的大小从44个字节增加到4k个字节(也许为了更好地对齐原始采样数据的磁盘或存储块)。
剩下的内容往往是以16位线性PCM格式表示的有符号2's补码小端格式,以44100 Hz的速率表示任意缩放的样本。
WAVE (.wav) 文件包含一个头部,其中包含音频文件数据的格式信息。在头部之后是实际的音频原始数据。您可以在下面检查它们的确切含义。
Positions Typical Value Description
1 - 4 "RIFF" Marks the file as a RIFF multimedia file.
Characters are each 1 byte long.
5 - 8 (integer) The overall file size in bytes (32-bit integer)
minus 8 bytes. Typically, you'd fill this in after
file creation is complete.
9 - 12 "WAVE" RIFF file format header. For our purposes, it
always equals "WAVE".
13-16 "fmt " Format sub-chunk marker. Includes trailing null.
17-20 16 Length of the rest of the format sub-chunk below.
21-22 1 Audio format code, a 2 byte (16 bit) integer.
1 = PCM (pulse code modulation).
23-24 2 Number of channels as a 2 byte (16 bit) integer.
1 = mono, 2 = stereo, etc.
25-28 44100 Sample rate as a 4 byte (32 bit) integer. Common
values are 44100 (CD), 48000 (DAT). Sample rate =
number of samples per second, or Hertz.
29-32 176400 (SampleRate * BitsPerSample * Channels) / 8
This is the Byte rate.
33-34 4 (BitsPerSample * Channels) / 8
1 = 8 bit mono, 2 = 8 bit stereo or 16 bit mono, 4
= 16 bit stereo.
35-36 16 Bits per sample.
37-40 "data" Data sub-chunk header. Marks the beginning of the
raw data section.
41-44 (integer) The number of bytes of the data section below this
point. Also equal to (#ofSamples * #ofChannels *
BitsPerSample) / 8
45+ The raw audio data.
我将所有这些内容从http://www.topherlee.com/software/pcm-tut-wavformat.html复制到这里。
现在来回答你的问题:
实际上不可能将整个正弦波写入文件,因为正弦波有无限多的点。相反,我们会固定一个采样率并在这些间隔中开始对波进行采样并记录幅度。(所选取的采样频率是为了使用我们即将采取的样本最小化失真地重建信号。由于样本数量不足导致的重建信号失真称为'aliasing'。)
为避免混叠,采样率被选择为 两倍于正弦波的频率(5kHz)以上 (这被称为 '采样定理',两倍于频率的速率称为 '奈奎斯特速率')。 因此我们决定采用 12kHz 的采样率,这意味着我们将在一秒钟内对我们的正弦波进行 12000 次采样。
一旦我们开始录制,如果我们记录的信号是 5kHz 频率的正弦波,我们将拥有 12000 * 5 个样本(值)。 我们将这些 60000 个值放入一个数组中。 然后我们创建适当的头部来反映我们的元数据,然后将这些样本从十进制转换为它们的十六进制等价值。 这些值随后写入我们的 .wav 文件的数据字节中。
绘制图表使用: http://fooplot.com
两位音频听起来可能不是很好听 :) 在大多数情况下,它们将采样值表示为16位有符号数字,这些数字代表以44.1kHz等频率采样的音频波形。