2016-12-06 1 views
1

저는 파이썬에 익숙하지만 numpy에 익숙하지 않으므로 잘못 되었다면 용서해주십시오.wav 파일에서 주파수 추출하기 python

여러 주파수 (묵음으로 구분)가있는 .wav 파일을 읽으려고합니다. 지금까지 필자는 값을 읽고 소리가있는 파일에서 다양한 부분을 찾을 수있었습니다. 그럼, 이산 코사인 변환하고 여기에서 주파수를 계산 찾기 위해 노력하고있다 (참조 : how to extract frequency associated with fft values in python) 그러나

, 나는 오류 받고 있어요 :

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 
: 여기

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

은 내 코드입니다

편집 : 문제는 내가 0,123,282 가정 것을

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]'라인이 에러의 원인이되었습니다. 위에 제공된 링크에서 푸리에 변환은 1 차원이었습니다. 그러나 나의 테스트 파일은 다차원적인리스트를 주었다. –

+0

아마 멀티 채널 (스테레오)일까요? 그렇다면 두 채널의 평균을 취하여 모노로 줄이십시오. –

답변

0

: 여기에 역 추적입니다은 실제로 목록의 목록 이었지만 실제로는 목록의 목록이었습니다. 줄 :

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

때마다 목록을 추가하고 있지만 기존 목록에 요소를 추가한다고 가정했습니다. 예를 들어

, listOfLists가 된 경우 :

[ [ [1,2,3],[4,5,6] ] ] 

을하지만 기다리고 있었다 :

[ [1,2,3] ] 

그런 다음, listOfLists [0]으로 .Append ([4,5,6]을) 줄 것이다 : 코드에 문제가있는 라인을 교체

[ [1,2,3,4,5,6] ] 

아래 나를 위해 일한 :

,
for v in sound[windowPosition:windowPosition+windowSize+1]: 
      listOfLists[i].append(v) 
관련 문제