Python 从wav文件提取频率

Python 从wav文件提取频率,python,numpy,audio,Python,Numpy,Audio,我对python很熟悉,但对numpy还不熟悉,所以如果我错了,请原谅 我正在尝试读取一个具有多个频率的.wav文件(以静音分隔)。到目前为止,我已经能够读取值并找到文件中有声音的各个部分。然后,我试图找到离散余弦变换并从中计算频率(参考:) 但是,我得到了一个错误: 索引46392超出大小为25的轴0的界限 这是我的密码: import wave import struct import numpy as np def isSilence(windowPosition): sumVa

我对python很熟悉,但对numpy还不熟悉,所以如果我错了,请原谅

我正在尝试读取一个具有多个频率的.wav文件(以静音分隔)。到目前为止,我已经能够读取值并找到文件中有声音的各个部分。然后,我试图找到离散余弦变换并从中计算频率(参考:)

但是,我得到了一个错误:

索引46392超出大小为25的轴0的界限

这是我的密码:

import wave
import struct
import numpy as np

def isSilence(windowPosition):
    sumVal = sum( [ x*x for x in sound[windowPosition:windowPosition+windowSize+1] ] )
    avg = sumVal/(windowSize)
    if avg <= 0.0001:
        return True
    else:
        return False

#read from wav file
sound_file = wave.open('test.wav', 'r')
file_length = sound_file.getnframes()
data = sound_file.readframes(file_length)
sound_file.close()
#data = struct.unpack("<h", data)
data = struct.unpack('{n}h'.format(n=file_length), data)
sound = np.array(data)
#sound is now a list of values

#detect silence and notes
i=0
windowSize = 2205
windowPosition = 0
listOfLists = []
listOfLists.append([])
maxVal = len(sound) - windowSize
while True:
    if windowPosition >= maxVal:
        break
    if not isSilence(windowPosition):
        while not isSilence(windowPosition):
            listOfLists[i].append(sound[windowPosition:windowPosition+ windowSize+1])
            windowPosition += windowSize
        listOfLists.append([]) #empty list
        i += 1
    windowPosition += windowSize

frequencies = []
#Calculating the frequency of each detected note by using DFT
for signal in listOfLists:
    if not signal:
        break
    w = np.fft.fft(signal)
    freqs = np.fft.fftfreq(len(w))
    l = len(signal)

    #imax = index of first peak in w
    imax = np.argmax(np.abs(w))
    fs = freqs[imax]

    freq = imax*fs/l
    frequencies.append(freq)

print frequencies
导入波
导入结构
将numpy作为np导入
def isSilence(窗口位置):
sumVal=sum([x*x代表声音中的x[windowPosition:windowPosition+WindowsSize+1]]))
平均值=sumVal/(窗口大小)
如果平均值=最大值:
打破
如果不允许(窗口位置):
虽然不允许(窗口位置):
列表[i].append(声音[windowPosition:windowPosition+WindowsSize+1])
windowPosition+=WindowsSize
listOfLists.append([])#空列表
i+=1
windowPosition+=WindowsSize
频率=[]
#使用DFT计算每个检测到的音符的频率
对于列表中的信号:
如果没有信号:
打破
w=np.fft.fft(信号)
freqs=np.fft.fftfreq(len(w))
l=透镜(信号)
#imax=第一个峰值的指数,单位为w
imax=np.argmax(np.abs(w))
fs=频率[imax]
频率=imax*fs/l
频率。附加(频率)
打印频率
编辑:以下是回溯:

Traceback (most recent call last):
  File "final.py", line 61, in <module>
    fs = freqs[imax]
IndexError: index 46392 is out of bounds for axis 0 with size 21
回溯(最近一次呼叫最后一次):
文件“final.py”,第61行,在
fs=频率[imax]
索引器:索引46392超出大小为21的轴0的界限

问题是我假设
列表实际上是一个列表列表,但实际上它是一个列表列表。该行:

        listOfLists[i].append(sound[windowPosition:windowPosition+ windowSize+1])
每次都会附加一个列表,但我假设它会将元素附加到现有列表中

例如,如果列表是:

[ [1,2,3] ]
然后,列表[0].append([4,5,6])将给出:

[ [ [1,2,3],[4,5,6] ] ]
但我期待着:

[ [1,2,3,4,5,6] ]
用下面的代码替换有问题的行对我很有效:

for v in sound[windowPosition:windowPosition+windowSize+1]:
            listOfLists[i].append(v)

“我收到一个错误:…”始终在问题中包含完整的错误消息(即完整的回溯)。回溯显示哪一行触发了错误。@WarrenWeckesser OK。导致错误的行是fs=freqs[imax]
。在我上面提供的链接中,傅里叶变换是一维的。但我的测试文件给出了一个多维列表。可能是多声道(立体声)?如果是这样的话,通过取两个通道的平均值来减少到单声道。