2016-12-06 21 views
1

私はpythonに精通していますがnumpyには慣れていますので、私が間違っていると私を許してください。wavファイルから周波数を抽出するpython

複数の周波数を持つ.wavファイルを読み込もうとしています(無音で区切られています)。これまでは、値を読み込んで、サウンドのあるファイル内のさまざまな部分を見つけることができました。しかし、私はエラーを取得しています

を:その後、私は(how to extract frequency associated with fft values in python参照):離散コサイン変換は、それからの周波数を変換して計算見つけようとしています

index 46392 is out of bounds for axis 0 with size 25

は、ここに私のコードです:

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 

編集:ここではトレースバックです:

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 
+2

*「エラーが発生しています:...」*完全な*エラーメッセージあなたの質問に完全なトレースバック)。トレースバックは、エラーをトリガした行を示します。 –

+0

@WarrenWeckesser大丈夫です。 'fs = freqs [imax]'行はエラーの原因となっていました。上記で提供されたリンクでは、フーリエ変換は一次元であった。しかし、私のテストファイルは、多次元のリストを与えました。 –

+0

マルチチャンネル(ステレオ)ですか?その場合は、2つのチャンネルの平均をとってモノラルに減らしてください。 –

答えて

0

問題は、私はを想定していることでしたは実際にリストのリストでしたが、実際にはリストのリストでした。

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

は、毎回リストを追加していましたが、要素を既存のリストに追加していると仮定しました。例えば

、listOfListsであった場合:次に

[ [1,2,3] ] 

listOfLists [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) 
関連する問題