実現したいこと
python初心者です。
def integral から始まる関数の結果(LF_HF)を表示させたいです。
関数の中身を表示させるために何をしていいか分かりません。
該当のソースコード
python
1#入力された時系列データ(t, x)とサンプリングレート(dt)を元にFFTを行って、 2#それを時系列とともにplotする。 3############################### 4import numpy as np 5import scipy 6from scipy import integrate 7import matplotlib.pyplot as plt 8from sympy import * 9 10def FFT_main(t, x, dt, split_t_r, overlap, window_F, output_FN, y_label, y_unit): 11 12 #データをオーバーラップして分割する。 13 split_data = data_split(t, x, split_t_r, overlap) 14 15 #FFTを行う。 16 FFT_result_list = [] 17 for split_data_cont in split_data: 18 FFT_result_cont = FFT(split_data_cont, dt, window_F) 19 FFT_result_list.append(FFT_result_cont) 20 21 """ 22 #各フレームのグラフ化 23 IDN = 0 24 for split_data_cont, FFT_result_cont in zip(split_data, FFT_result_list): 25 IDN = IDN+1 26 plot_FFT(split_data_cont[0], split_data_cont[1], FFT_result_cont[0], FFT_result_cont[1], output_FN, IDN, 0, y_label, y_unit) 27 """ 28 29 #平均化 30 fq_ave = FFT_result_list[0][0] 31 F_abs_amp_ave = np.zeros(len(fq_ave)) 32 for i in range(len(FFT_result_list)): 33 F_abs_amp_ave = F_abs_amp_ave + FFT_result_list[i][1] 34 F_abs_amp_ave = F_abs_amp_ave/(i+1) 35 36 plot_FFT(t, x, fq_ave, F_abs_amp_ave, output_FN, "ave", 1, y_label, y_unit) 37 38 return fq_ave, F_abs_amp_ave 39 40def plot_FFT(t, x, fq, F_abs_amp, output_FN, IDN, final_graph, y_label, y_unit): 41 fig = plt.figure(figsize=(12, 4)) 42 ax2 = fig.add_subplot(121) 43 title1 = "time_" + output_FN[:-4] 44 plt.plot(t, x) 45 plt.xlabel("time [s]") 46 plt.ylabel(y_label+"["+y_unit+"]") 47 #plt.title(title1) 48 plt.title(f'Ryosuke {i*60+1}-{(i+1)*60} pupil ') 49 50 ax2 = fig.add_subplot(122) 51 title2 = "freq_" + output_FN[:-4] 52 plt.xlabel('freqency(Hz)') 53 plt.ylabel(y_label+"["+y_unit+"/rtHz]") 54 plt.xscale("log") 55 plt.yscale("log") 56 plt.plot(fq, F_abs_amp) 57 #plt.title(title2) 58 plt.title(f'Ryosuke {i*60+1}-{(i+1)*60} pupil amplitude spectrum') 59 60 if final_graph == 0: 61 plt.savefig(output_FN[:-4]+"_"+str(IDN)+"_FFTtemp"+output_FN[-4:], dpi=300) 62 elif final_graph == 1: 63 plt.savefig(output_FN, dpi=300) 64 65 return 0 66 67def integrate(vlf,lf,hf,F_abs_amp,fq): 68 69 70 LF= scipy.integrate.quad(F_abs_amp, (fq,vlf,lf)) 71 HF= scipy.integrate.quad(F_abs_amp, (fq,vlf,lf)) 72 LF_HF = float(LF) / HF 73 print(LF_HF) 74 75 return LF_HF 76 77 78 79def FFT(data_input, dt, window_F): 80 81 N = len(data_input[0]) 82 83 #窓の用意 84 if window_F == "hanning": 85 window = np.hanning(N) # ハニング窓 86 elif window_F == "hamming": 87 window = np.hamming(N) # ハミング窓 88 elif window_F == "blackman": 89 window = np.blackman(N) # ブラックマン窓 90 else: 91 print("Error: input window function name is not sapported. Your input: ", window_F) 92 print("Hanning window function is used.") 93 hanning = np.hanning(N) # ハニング窓 94 95 #窓関数後の信号 96 x_windowed = data_input[1]*window 97 98 #FFT計算 99 F = np.fft.fft(x_windowed) 100 F_abs = np.abs(F) 101 F_abs_amp = F_abs / N * 2 102 fq = np.linspace(0, 1.0/dt, N) 103 104 #窓補正 105 acf=1/(sum(window)/N) 106 F_abs_amp = acf*F_abs_amp 107 108 #ナイキスト定数まで抽出 109 fq_out = fq[:int(N/2)+1] 110 F_abs_amp_out = F_abs_amp[:int(N/2)+1] 111 112 return [fq_out, F_abs_amp_out] 113 114def data_split(t, x, split_t_r, overlap): 115 116 split_data = [] 117 one_frame_N = int(len(t)*split_t_r) #1フレームのサンプル数 118 overlap_N = int(one_frame_N*overlap) #オーバーラップするサンプル数 119 start_S = 0 120 end_S = start_S + one_frame_N 121 122 while True: 123 t_cont = t[start_S:end_S] 124 x_cont = x[start_S:end_S] 125 split_data.append([t_cont, x_cont]) 126 127 start_S = start_S + (one_frame_N - overlap_N) 128 end_S = start_S + one_frame_N 129 130 if end_S > len(t): 131 break 132 133 134 return np.array(split_data) 135 136if __name__ == "__main__": 137 for i,dff in enumerate(dfs): 138 t = dff['timestamp'] 139 x = f_sci(dff['timestamp']) 140 dt = 0.025 #This value should be correct as real. 141 output_FN = "test.png" 142 split_t_r = 0.6 #1つの枠で全体のどの割合のデータを分析するか。 143 overlap = 0.5 #オーバーラップ率 144 window_F = "hanning" #窓関数選択: hanning, hamming, blackman 145 y_label = "amplitude" 146 y_unit = "V" 147 vlf = 0.04 148 lf = 0.15 149 hf = 0.4 150 151 FFT_main(t, x, dt, split_t_r, overlap, window_F,output_FN, y_label, y_unit)
単にprint(LF_HF)なりするのではダメなのでしょうか。
あるいは「関数の結果」「中身」を表示させたいと記載ありますが、どちらでしょうか?
より具体的に詳しく実現したいことを説明すると回答得られやすくなると思います。
私もそう思い、returnの前とif __name__ == "__main__":の中に
print(LF_HF)をいれましたが、結果が表示されません。
print(integrat)も入れてみましたが、<function integrate at 0x0000017974914DC0>と表示されるだけです。
関数の使い方も曖昧なのですが、FFTを行った波形F_abs_ampに対してvlf,lh,hfの範囲で積分を行っているつもりです。

回答1件
あなたの回答
tips
プレビュー