19

我有这个代码:

import numpy as np
import scipy.io.wavfile
import math

rate, data = scipy.io.wavfile.read('xenencounter_23.wav')

data2 = []

for i in range(len(data)):
    data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])

data2 = np.asarray(data2)

print data2

scipy.io.wavfile.write('xenencounter_23sin3.wav',rate,data2)

这打印(截断):

[[-2524  2728]
 [ -423 -2270]
 [ 2270   423]
 ..., 
 [-2524     0]
 [ 2524 -2728]
 [-2270   838]]

wav 文件在 Windows Media Player 中打开并播放,因此至少格式正确。但是,当用 Audacity 打开它并查看单个样本时,它们都是 0,并且一致地,该文件根本没有声音。

我不明白的是上面列出的 numpy 数组是如何变成全 0 的。它应该低于样本的最大值(或高于,如果它是负数)。

4

3 回答 3

17

我发现 scipy.io.wavfile.write() 以 16 位整数写入,这解释了在尝试使用 32 位整数(默认值)时文件大小较大。虽然我找不到在 wavfile.write 中更改它的方法,但我确实通过更改找到了:

data2 = np.asarray(data2)

data2 = np.asarray(data2, dtype=np.int16)

我可以写一个工作文件。

于 2013-09-06T09:11:48.120 回答
2

在通过 scipy.io.wavfile.write() 创建 wav 文件时,我发现幅度非常重要。如果您创建一个幅度为 150 的正弦波,在 VLC 中播放时听起来像是无声的。如果幅度为 100,它听起来像一个失真的正弦波,如果你把它设为 80,它开始听起来像一个正常的文件。

在创建波形文件时绝对必须小心幅度,但我现在还不清楚在开始削波或消失之前最大电平是多少。

于 2014-04-15T23:12:55.003 回答
1

正如您通过在不同点打印输出并重新保存最初加载的内容所发现的那样,该行data2.append([int(round(math.sin(data[i][0])*3000)), int(round(math.sin(data[i][1])*3000))])是问题的根源。

我怀疑 3000 幅度太大。试试 1。

于 2013-09-05T20:59:30.070 回答