データをPythonで作るようにしました
データの全長さは適当ですが
python
1import pandas as pd
2import numpy as np
3import matplotlib.pyplot as plt
4
5# # データの読み込み
6##csvファイル用正弦波関数:Amp * SIN(2.0 * PI() * f * t)
7###df = pd.read_csv('C:/ホットプレート電気炉焼成16コ比較/16csv/C1_00000test.csv', header=4) #ヘッダーは0から数える
8###t = np.array(df['Time'])
9###volt = np.array(df['Ampl'])
10###use_index = np.where(t > 0) #0以上のtを取得
11###t = t[use_index]
12###volt = volt[use_index]
13##
14dt0 = 1 / 2500000000 # データ間隔
15at0 = 7.314 * 10**-6 # 全データ長
16f10 = 10 * 10**6 # 周波数1
17f20 = 35 * 10**6 # 周波数2
18a10 = 2 # 周波数1の振幅
19a20 = 5 # 周波数2の振幅
20##
21t = np.arange(0, at0, dt0) # arange(開始, 終了の次, 間隔)
22volt = a10 * np.sin(2 * np.pi * f10 * t) + a20 * np.sin(2 * np.pi * f20 * t)
23##
24src_fs = 1 / (t[1] - t[0]) #サンプリング周波数
25src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数))
26src_wav_time_length = src_wav_data_length / src_fs #全波形当たりの時間
27aux_line_length = max(abs(volt)) / 2
28all_arr = np.zeros((5, src_wav_data_length)) #平均処理のための行列
29N = src_wav_data_length
30
31
32##切り出し範囲指定
33################C1_00000.csv##################
34start_No_1 = 1.3E-6 #us
35end_No_1 = 2.35E-6 #us
36start_No_2 = 2.56E-6
37end_No_2 = 3.5E-6
38start_No_3 = 3.6E-6
39end_No_3 = 4.6E-6
40
41######グラフ作成########
42fig1 = plt.figure()
43wav_data_length_us = src_wav_data_length
44target_arr = np.array([start_No_1, end_No_1, start_No_2, end_No_2, start_No_3, end_No_3])
45
46###################時間軸データ1###################
47ax1 = fig1.add_subplot(2, 1, 1)
48plt.plot(t * 1000000, volt, linewidth=1)
49plt.vlines([start_No_1*1E6, start_No_1*1E6, end_No_1*1E6], -aux_line_length, aux_line_length, color = "blue")
50plt.vlines([start_No_2*1E6, end_No_2*1E6], -aux_line_length, aux_line_length, color = "green")
51plt.vlines([start_No_3*1E6, end_No_3*1E6], -aux_line_length, aux_line_length, color = "red")
52plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
53plt.xlabel("time [us]")
54plt.ylabel("amplitude [V]")
55plt.grid()
56
57###################時間軸データ2###################
58ax2 = fig1.add_subplot(2, 1, 2)
59plt.plot(t * 1000000, volt, linewidth=1)
60plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
61plt.xlabel("time [us]")
62plt.ylabel("amplitude [V]")
63plt.grid()
64plt.tight_layout()
65
66plt.show()
67
68print(src_fs)
69
70fig, ax = plt.subplots() # figure と axes を定義
71###################周波数軸データ1~3###################
72for a in range(0, 5, 2):
73 target_gate = np.zeros(wav_data_length_us, dtype='float32')
74 target_gate[int(target_arr[a]*src_fs):int(target_arr[a+1]*src_fs)] = 1.0
75 target_wav = np.zeros([wav_data_length_us], dtype='float32')
76 target_wav = volt * target_gate
77 target_wav = np.roll(target_wav, -1*int(target_arr[a]*src_fs))
78
79 # 信号の作成
80 # src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
81 dt = 1 / src_fs
82 freq = src_fs # 周波数(10Hz) =>正弦波の周期0.1sec
83 t = np.arange(0, N*dt, dt) # 時間軸
84 f = target_wav # 信号(周波数10、振幅1の正弦波)
85 F = np.fft.fft(f)
86 F_abs = np.abs(F)# FFTの複素数結果を絶対に変換
87 M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs) + 1
88 # 振幅をもとの信号に揃える
89 F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
90 F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分は2倍不要
91
92 fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
93
94
95 if a == 0:
96 ax.set_xlabel("freqency[Hz]")
97 ax.set_xlim(0, 10E6)
98 ax.set_ylabel("amplitude[arb.unit]")
99 ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='1st-Wave_FrequencyResponse', color="blue") # ナイキスト定数まで表示
100 ax.legend()
101 ax.grid()
102 ax.axis("tight") #すべてのデータが見えるように最大・最小を変更する
103 ax.set_xlim(0, 4.0E7)
104
105
106 elif a == 2:
107 ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='2nd-Wave_FrequencyResponse', color="green") # ナイキスト定数まで表示
108 ax.legend()
109
110 else :
111 ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='3rd-Wave_FrequencyResponse', color="red") # ナイキスト定数まで表示
112 ax.legend()
113
114 for i in range(N):
115 all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
116
117
118###################周波数軸データ平均###################
119all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
120ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
121ax.legend()
122
123plt.show()
データ全体で均質です
f特振幅ピークは、ほぼ狙い通りです
CSVファイルのデータが正しくできてれば、こうなるはず
次に、「f」を、必要な部分のみ切り出して他は捨てる(0埋めではなく)ようにコードを変えます
その場合は、3回の「f」の長さが違うと周波数が合わないので、平均はしません
python
1import pandas as pd
2import numpy as np
3import matplotlib.pyplot as plt
4
5# # データの読み込み
6##csvファイル用正弦波関数:Amp * SIN(2.0 * PI() * f * t)
7###df = pd.read_csv('C:/ホットプレート電気炉焼成16コ比較/16csv/C1_00000test.csv', header=4) #ヘッダーは0から数える
8###t = np.array(df['Time'])
9###volt = np.array(df['Ampl'])
10###use_index = np.where(t > 0) #0以上のtを取得
11###t = t[use_index]
12###volt = volt[use_index]
13##
14dt0 = 1 / 2500000000 # データ間隔
15at0 = 7.314 * 10**-6 # 全データ長
16f10 = 10 * 10**6 # 周波数1
17f20 = 35 * 10**6 # 周波数2
18a10 = 2 # 周波数1の振幅
19a20 = 5 # 周波数2の振幅
20##
21t = np.arange(0, at0, dt0) # arange(開始, 終了の次, 間隔)
22volt = a10 * np.sin(2 * np.pi * f10 * t) + a20 * np.sin(2 * np.pi * f20 * t)
23##
24src_fs = 1 / (t[1] - t[0]) #サンプリング周波数
25src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数))
26src_wav_time_length = src_wav_data_length / src_fs #全波形当たりの時間
27aux_line_length = max(abs(volt)) / 2
28all_arr = np.zeros((5, src_wav_data_length)) #平均処理のための行列
29N = src_wav_data_length
30
31
32##切り出し範囲指定
33################C1_00000.csv##################
34start_No_1 = 1.3E-6 #us
35end_No_1 = 2.35E-6 #us
36start_No_2 = 2.56E-6
37end_No_2 = 3.5E-6
38start_No_3 = 3.6E-6
39end_No_3 = 4.6E-6
40
41######グラフ作成########
42fig1 = plt.figure()
43wav_data_length_us = src_wav_data_length
44target_arr = np.array([start_No_1, end_No_1, start_No_2, end_No_2, start_No_3, end_No_3])
45
46###################時間軸データ1###################
47ax1 = fig1.add_subplot(2, 1, 1)
48plt.plot(t * 1000000, volt, linewidth=1)
49plt.vlines([start_No_1*1E6, start_No_1*1E6, end_No_1*1E6], -aux_line_length, aux_line_length, color = "blue")
50plt.vlines([start_No_2*1E6, end_No_2*1E6], -aux_line_length, aux_line_length, color = "green")
51plt.vlines([start_No_3*1E6, end_No_3*1E6], -aux_line_length, aux_line_length, color = "red")
52plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
53plt.xlabel("time [us]")
54plt.ylabel("amplitude [V]")
55plt.grid()
56
57###################時間軸データ2###################
58ax2 = fig1.add_subplot(2, 1, 2)
59plt.plot(t * 1000000, volt, linewidth=1)
60plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
61plt.xlabel("time [us]")
62plt.ylabel("amplitude [V]")
63plt.grid()
64plt.tight_layout()
65
66plt.show()
67
68print(src_fs)
69
70fig, ax = plt.subplots() # figure と axes を定義
71###################周波数軸データ1~3###################
72for a in range(0, 5, 2):
73 target_gate = np.zeros(wav_data_length_us, dtype='float32')
74 target_gate[int(target_arr[a]*src_fs):int(target_arr[a+1]*src_fs)] = 1.0
75 target_wav = np.zeros([wav_data_length_us], dtype='float32')
76 target_wav = volt * target_gate
77 target_wav = np.roll(target_wav, -1*int(target_arr[a]*src_fs))
78
79 # 信号の作成
80 # src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
81 dt = 1 / src_fs
82 freq = src_fs # 周波数(10Hz) =>正弦波の周期0.1sec
83 t = np.arange(0, N*dt, dt) # 時間軸
84 #M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs) + 1
85 M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs)
86 #f = target_wav # 信号(周波数10、振幅1の正弦波)
87 f = target_wav[:M]
88 F = np.fft.fft(f)
89 F_abs = np.abs(F)# FFTの複素数結果を絶対に変換
90 # 振幅をもとの信号に揃える
91 F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
92 F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分は2倍不要
93
94 #fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
95 fq = np.linspace(0, 1.0/dt, M) # 周波数軸 linspace(開始,終了,分割数)
96
97
98 if a == 0:
99 ax.set_xlabel("freqency[Hz]")
100 ax.set_xlim(0, 10E6)
101 ax.set_ylabel("amplitude[arb.unit]")
102 #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='1st-Wave_FrequencyResponse', color="blue") # ナイキスト定数まで表示
103 ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='1st-Wave_FrequencyResponse', color="blue", marker="o") # ナイキスト定数まで表示
104 ax.legend()
105 ax.grid()
106 ax.axis("tight") #すべてのデータが見えるように最大・最小を変更する
107 ax.set_xlim(0, 4.0E7)
108 ax.set_ylim(-0.2, 5.2)
109
110
111 elif a == 2:
112 #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='2nd-Wave_FrequencyResponse', color="green") # ナイキスト定数まで表示
113 ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='2nd-Wave_FrequencyResponse', color="green", marker="o") # ナイキスト定数まで表示
114 ax.legend()
115
116 else :
117 #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='3rd-Wave_FrequencyResponse', color="red") # ナイキスト定数まで表示
118 ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='3rd-Wave_FrequencyResponse', color="red", marker="o") # ナイキスト定数まで表示
119 ax.legend()
120
121 #for i in range(N):
122 # all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
123
124
125###################周波数軸データ平均###################
126#all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
127#ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
128#ax.legend()
129
130plt.show()
0埋めがなくなり、データがあるところと0埋めしてるところの段差が無くなるので、f特のたくさんあった細かい振動は無くなります
3回の切り出しの内で、1, 2回目はデータの両端が不連続なので、f特振幅ピークが狙いと合わなくなります
(35MHzだけじゃなく、10MHzも)
今回の質問のデータの場合は、周波数が10, 35MHzと整数MHzしかないので、「f」の切り出し長さを
python
1start_No_1 = 1.3E-6 #us
2#end_No_1 = 2.35E-6 #us
3end_No_1 = 2.3E-6 #us
4#start_No_2 = 2.56E-6
5start_No_2 = 2.5E-6
6end_No_2 = 3.5E-6
7start_No_3 = 3.6E-6
8end_No_3 = 4.6E-6
のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅ピークはピッタリ狙い通りになります
あくまでも、今回の質問のデータのようなきれいなデータの場合はそうできる、というだけですが、ご参考までに