10

我正在尝试读取一个 wav 文件,然后逐个示例地操作其内容

这是我到目前为止所拥有的:

import scipy.io.wavfile
import math

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

for i in range(len(data)):
    data[i][0] = math.sin(data[i][0])
    print data[i][0]

我得到的结果是:

0
0
0
0
0
0

ETC

它正在正确读取,因为如果我print data[i]改为写入,我通常会得到大小为 2 的非零数组。

4

1 回答 1

16

data返回的数组wavfile.read是一个整数数据类型的 numpy 数组。numpy 数组的数据类型不能原地改变,所以这一行:

data[i][0] = math.sin(data[i][0])

将结果转换math.sin为整数,该整数始终为 0。

代替该行,创建一个新的浮点数组来存储您的计算结果。

或用于numpy.sin一次计算数组中所有元素的正弦值:

import numpy as np
import scipy.io.wavfile

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

sin_data = np.sin(data)

print sin_data

从您的附加评论中,您似乎想要获取每个值的正弦并将结果写为新的 wav 文件。

这是一个(我认为)做你想做的事的例子。我将从这里使用文件“M1F1-int16-AFsp.wav”:http ://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples.html 。该函数show_info只是一种方便的方式来说明每个步骤的结果。如果您使用的是交互式 shell,则可以使用它来检查变量及其属性。

import numpy as np
from scipy.io import wavfile

def show_info(aname, a):
    print "Array", aname
    print "shape:", a.shape
    print "dtype:", a.dtype
    print "min, max:", a.min(), a.max()
    print

rate, data = wavfile.read('M1F1-int16-AFsp.wav')

show_info("data", data)

# Take the sine of each element in `data`.
# The np.sin function is "vectorized", so there is no need
# for a Python loop here.
sindata = np.sin(data)

show_info("sindata", sindata)

# Scale up the values to 16 bit integer range and round
# the value.
scaled = np.round(32767*sindata)

show_info("scaled", scaled)

# Cast `scaled` to an array with a 16 bit signed integer data type.
newdata = scaled.astype(np.int16)

show_info("newdata", newdata)

# Write the data to 'newname.wav'
wavfile.write('newname.wav', rate, newdata)

这是输出。(最初的警告意味着文件中可能存在一些无法理解的元数据scipy.io.wavfile.read。)

<snip>/scipy/io/wavfile.py:147: WavFileWarning: Chunk (non-data) not understood, skipping it.
  WavFileWarning)
Array 'data'
shape: (23493, 2)
dtype: int16
min, max: -7125 14325

Array 'sindata'
shape: (23493, 2)
dtype: float32
min, max: -0.999992 0.999991

Array 'scaled'
shape: (23493, 2)
dtype: float32
min, max: -32767.0 32767.0

Array 'newdata'
shape: (23493, 2)
dtype: int16
min, max: -32767 32767

新文件“newname.wav”包含两个带符号的 16 位值通道。

于 2013-09-05T19:31:24.327 回答