pythonを用いた周波数スペクトルに関しての質問です。
以下のプログラムが現在作成しているプログラムです。
wavファイルを入力し、スペクトルを得たのち、csvに書き込み、設定した閾値以上の差がある列を抽出
という流れになっています。
こちらを今のような一つのwavファイルでなく2つのwavファイルに対して行いたいと考えています。
(1) 2つのwavファイルのスペクトル(AとBとします)をそれぞれ得たのち、それらのスペクトルの引き算を行った結果(A-B)を得る
(2) csvに書き込み、設定した閾値以上の差がある列を抽出
といった流れを目指しています。(1)の部分において同時にスペクトル計算を行い、最終的に引き算を行う部分がわからず詰まっています。
素人で申し訳ないですが、アドバイスなどをいただければ幸いです。
Python
1import wave 2import pandas as pd 3import numpy as np 4import csv 5 6 7def main(): 8 wf = wave.open("test.wav", "r") 9 fs = wf.getframerate() # サンプリング周波数 10 g = wf.readframes(wf.getnframes()) 11 g = np.frombuffer(g, dtype="int16") / 32768.0 # -1~1に正規化 12 wf.close() 13 n0 = 0 # サンプリング開始位置 14 N = 4410 # サンプル数 15 G = np.fft.fft(g[n0:n0 + N]) # 高速フーリエ変換 16 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル 17 flist = np.fft.fftfreq(N, d=1.0 / fs) # 周波数リスト 18 19 # DataFrame生成 20 df = pd.DataFrame({'Hz': flist, 'dB':amp}) 21 # CSVファイルに書き出しておく 22 df.to_csv('test.csv') 23 24 # DataFrameを表示 25 print(df) 26 27 # dB列の差が閾値以上かどうかを示す 'flag'列を追加 28 threshold = 40 29 df['flag'] = df['dB'].diff().abs() > threshold 30 #'flag'列が True の行のみ表示 31 print( df[df['flag']]) 32 33 34if __name__ == '__main__': 35 main()