前提
エラーメッセージは出ないものの出力された結果の解釈が合っているかを確認したいです。
実現したいこと
6秒間のデータを抽出し,3-8Hz(high band)の周波数帯域におけるパワースペクトルの面積を,0.5-3Hz(low band)の周波数帯域におけるパワースペクトルの面積で除すことで面積比を計算し,1frame毎にずらして解析し,面積比が3を超えるframe数をカウントするプログラムを記載しました。
ただ,出力された結果が意図した結果になっているか判断できずに作業が止まっている状況です…
記載したプログラムが合っているか確認いただき,間違っている場合は修正案をご教示いただけますと幸いです。
なお,resultファイルには,サンプリングレート128Hzの加速度計によって得られた垂直方向の加速度データが参加者10名分格納されております(今回は最初の参加者"pt1"を解析)。
該当のソースコード
python
1import pandas as pd 2import numpy as np 3from scipy import integrate 4 5# データ 6df = pd.read_csv("result.csv") 7 8def area_ratio(fi): 9 # 周波数解析 10 rate = 128 11 han = np.hanning(fi.size) 12 fft_data = np.abs(np.fft.rfft(fi * han)) 13 freqList = np.fft.rfftfreq(fi.size, 1.0 / rate) # 横軸 14 15 # 周波数帯域の指定 16 fft_df = pd.DataFrame(freqList) 17 fft_df['fft'] = pd.DataFrame(fft_data) 18 fft_df.columns=['freq', 'fft'] 19 20 low = fft_df.query("3> freq >= 0.5") 21 high = fft_df.query("8>= freq >= 3") 22 23 # 面積比の算出 24 s1 = integrate.trapz(low["fft"]) 25 s2 = integrate.trapz(high["fft"]) 26 27 return s2/s1 28 29if __name__ == '__main__': 30 # generate data for testing 31 N = df['pt1'].size 32 df_fft = pd.DataFrame({ 33 'frame': range(1, N+1), 34 }) 35 36 # rolling apply 37 window_size = 128*6 38 indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=window_size) 39 df_fft["FFT"] = df['pt1'].rolling(window=indexer).apply(area_ratio).dropna() 40 41count = (df_fft["FFT"] >= 3.0).sum() 42print("frame数:",count)
出力結果
frame数: 3883

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/01/06 14:40