teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

説明の追記

2021/07/21 09:30

投稿

jbpb0
jbpb0

スコア7658

answer CHANGED
@@ -281,6 +281,6 @@
281
281
  start_No_3 = 3.6E-6
282
282
  end_No_3 = 4.6E-6
283
283
  ```
284
- のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅はピッタリ狙い通りになります
284
+ のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅ピークはピッタリ狙い通りになります
285
285
  ![f特](465c47bfe9bf7a707573f5950f4e6076.png)
286
286
  あくまでも、今回の質問のデータのようなきれいなデータの場合はそうできる、というだけですが、ご参考までに

2

説明の追加

2021/07/21 09:30

投稿

jbpb0
jbpb0

スコア7658

answer CHANGED
@@ -268,4 +268,19 @@
268
268
  0埋めがなくなり、データがあるところと0埋めしてるところの段差が無くなるので、f特のたくさんあった細かい振動は無くなります
269
269
  3回の切り出しの内で、1, 2回目はデータの両端が不連続なので、f特振幅ピークが狙いと合わなくなります
270
270
  (35MHzだけじゃなく、10MHzも)
271
- ![f特](aea770c82a93fbaf7717e6274ee8524a.png)
271
+ ![f特](aea770c82a93fbaf7717e6274ee8524a.png)
272
+
273
+ 今回の質問のデータの場合は、周波数が10, 35MHzと整数MHzしかないので、「f」の切り出し長さを
274
+ ```python
275
+ start_No_1 = 1.3E-6 #us
276
+ #end_No_1 = 2.35E-6 #us
277
+ end_No_1 = 2.3E-6 #us
278
+ #start_No_2 = 2.56E-6
279
+ start_No_2 = 2.5E-6
280
+ end_No_2 = 3.5E-6
281
+ start_No_3 = 3.6E-6
282
+ end_No_3 = 4.6E-6
283
+ ```
284
+ のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅はピッタリ狙い通りになります
285
+ ![f特](465c47bfe9bf7a707573f5950f4e6076.png)
286
+ あくまでも、今回の質問のデータのようなきれいなデータの場合はそうできる、というだけですが、ご参考までに

1

コード追加

2021/07/21 09:26

投稿

jbpb0
jbpb0

スコア7658

answer CHANGED
@@ -129,4 +129,143 @@
129
129
  ![信号](82bd0040b0a9de2309632512d9ec973d.png)
130
130
  f特振幅ピークは、ほぼ狙い通りです
131
131
  ![f特](86c57940cebc412c29bbfca4924cacb7.png)
132
- CSVファイルのデータが正しくできてれば、こうなるはず
132
+ CSVファイルのデータが正しくできてれば、こうなるはず
133
+
134
+ 次に、「f」を、必要な部分のみ切り出して他は捨てる(0埋めではなく)ようにコードを変えます
135
+ その場合は、3回の「f」の長さが違うと周波数が合わないので、平均はしません
136
+ ```python
137
+ import pandas as pd
138
+ import numpy as np
139
+ import matplotlib.pyplot as plt
140
+
141
+ # # データの読み込み
142
+ ##csvファイル用正弦波関数:Amp * SIN(2.0 * PI() * f * t)
143
+ ###df = pd.read_csv('C:/ホットプレート電気炉焼成16コ比較/16csv/C1_00000test.csv', header=4) #ヘッダーは0から数える
144
+ ###t = np.array(df['Time'])
145
+ ###volt = np.array(df['Ampl'])
146
+ ###use_index = np.where(t > 0) #0以上のtを取得
147
+ ###t = t[use_index]
148
+ ###volt = volt[use_index]
149
+ ##
150
+ dt0 = 1 / 2500000000 # データ間隔
151
+ at0 = 7.314 * 10**-6 # 全データ長
152
+ f10 = 10 * 10**6 # 周波数1
153
+ f20 = 35 * 10**6 # 周波数2
154
+ a10 = 2 # 周波数1の振幅
155
+ a20 = 5 # 周波数2の振幅
156
+ ##
157
+ t = np.arange(0, at0, dt0) # arange(開始, 終了の次, 間隔)
158
+ volt = a10 * np.sin(2 * np.pi * f10 * t) + a20 * np.sin(2 * np.pi * f20 * t)
159
+ ##
160
+ src_fs = 1 / (t[1] - t[0]) #サンプリング周波数
161
+ src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数))
162
+ src_wav_time_length = src_wav_data_length / src_fs #全波形当たりの時間
163
+ aux_line_length = max(abs(volt)) / 2
164
+ all_arr = np.zeros((5, src_wav_data_length)) #平均処理のための行列
165
+ N = src_wav_data_length
166
+
167
+
168
+ ##切り出し範囲指定
169
+ ################C1_00000.csv##################
170
+ start_No_1 = 1.3E-6 #us
171
+ end_No_1 = 2.35E-6 #us
172
+ start_No_2 = 2.56E-6
173
+ end_No_2 = 3.5E-6
174
+ start_No_3 = 3.6E-6
175
+ end_No_3 = 4.6E-6
176
+
177
+ ######グラフ作成########
178
+ fig1 = plt.figure()
179
+ wav_data_length_us = src_wav_data_length
180
+ target_arr = np.array([start_No_1, end_No_1, start_No_2, end_No_2, start_No_3, end_No_3])
181
+
182
+ ###################時間軸データ1###################
183
+ ax1 = fig1.add_subplot(2, 1, 1)
184
+ plt.plot(t * 1000000, volt, linewidth=1)
185
+ plt.vlines([start_No_1*1E6, start_No_1*1E6, end_No_1*1E6], -aux_line_length, aux_line_length, color = "blue")
186
+ plt.vlines([start_No_2*1E6, end_No_2*1E6], -aux_line_length, aux_line_length, color = "green")
187
+ plt.vlines([start_No_3*1E6, end_No_3*1E6], -aux_line_length, aux_line_length, color = "red")
188
+ plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
189
+ plt.xlabel("time [us]")
190
+ plt.ylabel("amplitude [V]")
191
+ plt.grid()
192
+
193
+ ###################時間軸データ2###################
194
+ ax2 = fig1.add_subplot(2, 1, 2)
195
+ plt.plot(t * 1000000, volt, linewidth=1)
196
+ plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
197
+ plt.xlabel("time [us]")
198
+ plt.ylabel("amplitude [V]")
199
+ plt.grid()
200
+ plt.tight_layout()
201
+
202
+ plt.show()
203
+
204
+ print(src_fs)
205
+
206
+ fig, ax = plt.subplots() # figure と axes を定義
207
+ ###################周波数軸データ1~3###################
208
+ for a in range(0, 5, 2):
209
+ target_gate = np.zeros(wav_data_length_us, dtype='float32')
210
+ target_gate[int(target_arr[a]*src_fs):int(target_arr[a+1]*src_fs)] = 1.0
211
+ target_wav = np.zeros([wav_data_length_us], dtype='float32')
212
+ target_wav = volt * target_gate
213
+ target_wav = np.roll(target_wav, -1*int(target_arr[a]*src_fs))
214
+
215
+ # 信号の作成
216
+ # src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
217
+ dt = 1 / src_fs
218
+ freq = src_fs # 周波数(10Hz) =>正弦波の周期0.1sec
219
+ t = np.arange(0, N*dt, dt) # 時間軸
220
+ #M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs) + 1
221
+ M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs)
222
+ #f = target_wav # 信号(周波数10、振幅1の正弦波)
223
+ f = target_wav[:M]
224
+ F = np.fft.fft(f)
225
+ F_abs = np.abs(F)# FFTの複素数結果を絶対に変換
226
+ # 振幅をもとの信号に揃える
227
+ F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
228
+ F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分は2倍不要
229
+
230
+ #fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
231
+ fq = np.linspace(0, 1.0/dt, M) # 周波数軸 linspace(開始,終了,分割数)
232
+
233
+
234
+ if a == 0:
235
+ ax.set_xlabel("freqency[Hz]")
236
+ ax.set_xlim(0, 10E6)
237
+ ax.set_ylabel("amplitude[arb.unit]")
238
+ #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='1st-Wave_FrequencyResponse', color="blue") # ナイキスト定数まで表示
239
+ ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='1st-Wave_FrequencyResponse', color="blue", marker="o") # ナイキスト定数まで表示
240
+ ax.legend()
241
+ ax.grid()
242
+ ax.axis("tight") #すべてのデータが見えるように最大・最小を変更する
243
+ ax.set_xlim(0, 4.0E7)
244
+ ax.set_ylim(-0.2, 5.2)
245
+
246
+
247
+ elif a == 2:
248
+ #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='2nd-Wave_FrequencyResponse', color="green") # ナイキスト定数まで表示
249
+ ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='2nd-Wave_FrequencyResponse', color="green", marker="o") # ナイキスト定数まで表示
250
+ ax.legend()
251
+
252
+ else :
253
+ #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='3rd-Wave_FrequencyResponse', color="red") # ナイキスト定数まで表示
254
+ ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='3rd-Wave_FrequencyResponse', color="red", marker="o") # ナイキスト定数まで表示
255
+ ax.legend()
256
+
257
+ #for i in range(N):
258
+ # all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
259
+
260
+
261
+ ###################周波数軸データ平均###################
262
+ #all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
263
+ #ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
264
+ #ax.legend()
265
+
266
+ plt.show()
267
+ ```
268
+ 0埋めがなくなり、データがあるところと0埋めしてるところの段差が無くなるので、f特のたくさんあった細かい振動は無くなります
269
+ 3回の切り出しの内で、1, 2回目はデータの両端が不連続なので、f特振幅ピークが狙いと合わなくなります
270
+ (35MHzだけじゃなく、10MHzも)
271
+ ![f特](aea770c82a93fbaf7717e6274ee8524a.png)