저는 파이썬에 익숙하지만 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
* "오류가 발생했습니다. ..."* 항상 * 오류 메시지가 표시됩니다. 귀하의 질문에 전체 추적). 추적 표시는 오류를 일으킨 행을 표시합니다. –
@WarrenWeckesser 좋습니다. 'fs = freqs [imax]'라인이 에러의 원인이되었습니다. 위에 제공된 링크에서 푸리에 변환은 1 차원이었습니다. 그러나 나의 테스트 파일은 다차원적인리스트를 주었다. –
아마 멀티 채널 (스테레오)일까요? 그렇다면 두 채널의 평균을 취하여 모노로 줄이십시오. –