pythonを使って音声解析をしています。
現在1秒ごとに波形の表示とその波形のフーリエ変換を行っています。
以下のコードが該当するのですが、300ヘルツ以下をカットした状態でプロットしたいです。
ハイパスフィルタというのですがPython初心者でありどのようにコードを変更すればよいのかわかりません。
わかる方がいらっしゃいましたら変えるコードを教えていただきたいです。
何卒宜しくお願い致します。
以下のサイトのコードを参考に実行しようとしたのですが、このコードを実行すると300ヘルツ以下をカットしたいのに300以上がカットされてしまいます。
https://algorithm.joho.info/programming/python/numpy-fast-fourier-transform/#toc3
python
1# -*- coding: utf-8 -*- 2import wave 3 4from matplotlib.colors import same_color 5import numpy as np 6import matplotlib.pyplot as plt 7 8def main(): 9 filename = "04-agarikata-kara-01-p6TAskMJUgg.wav" 10 wf = wave.open(filename, "r" ) 11 12 # WAVファイルの情報を表示 13 print ("オーディオチャンネル数(モノラル: 1 ステレオ:2 ) : ", wf.getnchannels()) 14 print ("サンプルサイズ(バイト数) : ", wf.getsampwidth()) 15 print ("サンプリングレート : ", wf.getframerate()) 16 print ("オーディオフレーム数 : ", wf.getnframes()) 17 print ("圧縮形式 : ", wf.getcomptype()) 18 print ("(圧縮形式) : ", wf.getcompname()) 19 print ("パラメータ : ", wf.getparams()) 20 print ("記録時間(Sec) : ", float(wf.getnframes()) / wf.getframerate() ) 21 22 fs = wf.getframerate() # サンプリング周波数 23 24 fc = 300 # カットオフ周波数 25 26 g = wf.readframes(wf.getnframes()) 27 g = np.frombuffer(g, dtype= "int16")/32768.0 # -1~1に正規化 28 29 mado = 1#s 30 N = mado*fs # サンプル数=窓(1秒)×サンプリング周波数 31 32 freq = np.linspace(0, 1.0/mado, N) 33 34 wf.close() 35 for ki in range(round(wf.getnframes()/fs)-1): 36 n0 = ki # サンプリング開始位置 37 gz = g[::2] # サンプル数片方にわける 38 gg = gz[ki*N:ki*N+N] 39 # print(fs,ki,N,gz,gg) 40 G = np.fft.fft(gg) # 高速フーリエ変換 41 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル 42 phase = [np.arctan2(int(c.imag), int(c.real)) for c in G] # 位相スペクトル 43 flist = np.fft.fftfreq(N, d=1.0/fs) # 周波数リスト 44 flist[(freq < fc)] = 0 45 flist[(freq > 1/(mado*2))] = 0 46 47 # 波形サンプルを描画 48 fig = plt.figure() 49 plt.subplot(211) 50 plt.plot(np.linspace(n0,n0+mado,N),gg) 51 plt.axis([n0, n0+mado, -0.2, 0.2]) 52 plt.xlabel("時間 [sample]",fontname="MS Gothic") 53 plt.ylabel("振幅",fontname="MS Gothic") 54 55 # 振幅スペクトルを描画 56 plt.subplot(212) 57 plt.plot(flist, amp, marker='o', linestyle='-') 58 plt.axis([0, fs/2, 0, int(max(amp))]) 59 plt.xlabel("周波数 [Hz]",fontname="MS Gothic") 60 plt.ylabel("振幅スペクトル",fontname="MS Gothic") 61 output ="C:\Users\hiro2\Desktop\sound\kara" 62 fig.savefig(output+"\"+str(ki)+"_"+str(mado)+".jpg") 63 plt.close() 64 fig = plt.figure() 65 plt.close() 66 67if __name__ == '__main__': 68 main()
回答1件
あなたの回答
tips
プレビュー