Pythonでの列の差分・変化率を取得について。
Pythonを用いた周波数解析についてプログラムを作成しています。
解析で得られたスペクトルをcsvに保存(Hz,dBの2列)し、最終的に得られたデータから変化量の大きいところを自動検出させることを目指しています。
例を挙げると、列の成分[dB]が20.24.18....と続いてるところに60とくると、それまでより40近く差分があるので自動検出するという流れです。
diffを用いたらできると思い、作成していますがDataFrame?との兼ね合いがいまだによくわかっていません。試行錯誤的にやっているため、間違っているところなどを教えていただけますでしょうか。
Python
1def dft (n0, N, g): 2 G = [0.0] * N 3 for k in range(N): 4 for n in range(N): 5 real = np.cos(2 * np.pi * k * n / N) 6 imag = - np.sin(2 * np.pi * k * n / N) 7 G[k] += g[n0 + n] * complex(real, imag) 8 return G 9 10def main(): 11 wf = wave.open("test.wav", "r") 12 fs = wf.getframerate() # サンプリング周波数 13 g = wf.readframes(wf.getnframes()) 14 g = np.frombuffer(g, dtype="int16") / 32768.0 # -1~1に正規化 15 wf.close() 16 n0 = 0 # サンプリング開始位置 17 N = 4410 # サンプル数 18 G = np.fft.fft(g[n0:n0 + N]) # 高速フーリエ変換 19 amp = [np.sqrt(c.real ** 2 + c.imag ** 2) for c in G] # 振幅スペクトル 20 flist = np.fft.fftfreq(N, d=1.0 / fs) # 周波数リスト 21 22 # CSVファイルを作成書き込み 23 with open('test2.csv', 'wb') as csv_file: 24 fieldnames = ['Hz', 'dB'] 25 writer = csv.DictWriter(csv_file, fieldnames=fieldnames) 26 writer.writeheader() 27 for f, a in zip(flist, amp): 28 writer.writerow({'Hz': f, 'dB': a}) 29 30 # CSVファイルを読み込む 31 with open('test2.csv', 'r') as csv_file: 32 reader = csv.DictReader(csv_file) 33 for row in reader: 34 print(row['Hz'], row['dB']) 35 36 df = pd.DataFrame({row['Hz'], row['dB']}) 37 print(df.diff()) 38 39 40if __name__ == '__main__': 41 main()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/31 03:52
2019/01/31 04:24
2019/01/31 11:05