Pythonを使ってWavデータからピッチを取得する関数を描いているのですが、以下の関数の最後に出る p とゆう変数にWavデータを解析した結果が出る予定だったのですが、該当する値が出てきません。
試しに100Hzを鳴らした音声を検索した際の結果は10163.6634004となってしまいました。
アドバイスいただけたらと思います。
#coding:utf-8 import wave import numpy as np import matplotlib as mpl mpl.use('Agg') import matplotlib.pyplot as plt wf = wave.open("./100hz.wav" , "r" ) fs = wf.getframerate() # サンプリング周波数 x = wf.readframes(wf.getnframes()) x = np.frombuffer(x, dtype= "int16") / 32768.0 # -1 - +1に正規化 wf.close() start = 0 # サンプリングする開始位置 N = 512 # FFTのサンプル数 SHIFT = 128 # 窓関数をずらすサンプル数 hammingWindow = np.hamming(N) freqList = np.fft.fftfreq(N, d=1.0/fs) # 周波数軸の値を計算:Hz x値 def get_hz(x): maxV = 0 maxN = 0 i = 0 for v in x: if v > maxV: if v < 1: maxV = v maxN = i i+=1 return maxN def search(): global start windowedData = hammingWindow * x[start:start+N] # 切り出した波形データ(窓関数あり) X = np.fft.fft(windowedData) # FFT amplitudeSpectrum = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in X] # 振幅スペクトル:Y値 time=start+N#Time:t値 hznum = 0 hznum = get_hz(amplitudeSpectrum) tmp = freqList[hznum] if tmp < 0: tmp += tmp tmp *= -1 freq = tmp if hznum > 0: if hznum < len(amplitudeSpectrum)-1: tmp1 = freqList[hznum - 1] tmp2 = freqList[hznum + 1] tmp3 = freqList[hznum] if tmp1 < 0: tmp1 += tmp1 tmp1 *= -1 if tmp2 < 0: tmp2 += tmp2 tmp2 *= -1 if tmp3 < 0: tmp3 += tmp3 tmp3 *= -1 dL = tmp1 / tmp3 dR = tmp2 / tmp3 freq += 0.5 * (dR * dR - dL * dL) p = freq * (len(amplitudeSpectrum)/2) / len(amplitudeSpectrum) start += SHIFT # 窓関数をかける範囲をずらす if start + N > len(x): () else: () search()
コードをまだ読んでないですが、librosaを使ったら楽をできるかもしれません。 https://librosa.github.io/librosa/index.html 取り急ぎ参考情報までに。
librosaについても検討したのですが、描画処理はすぐれていますが情報を取得するにはあまりむいていませんでした。
回答1件
あなたの回答
tips
プレビュー