回答編集履歴

3

説明の追記

2021/07/21 09:30

投稿

jbpb0
jbpb0

スコア7651

test CHANGED
@@ -564,7 +564,7 @@
564
564
 
565
565
  ```
566
566
 
567
- のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅はピッタリ狙い通りになります
567
+ のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅ピークはピッタリ狙い通りになります
568
568
 
569
569
  ![f特](465c47bfe9bf7a707573f5950f4e6076.png)
570
570
 

2

説明の追加

2021/07/21 09:30

投稿

jbpb0
jbpb0

スコア7651

test CHANGED
@@ -539,3 +539,33 @@
539
539
  (35MHzだけじゃなく、10MHzも)
540
540
 
541
541
  ![f特](aea770c82a93fbaf7717e6274ee8524a.png)
542
+
543
+
544
+
545
+ 今回の質問のデータの場合は、周波数が10, 35MHzと整数MHzしかないので、「f」の切り出し長さを
546
+
547
+ ```python
548
+
549
+ start_No_1 = 1.3E-6 #us
550
+
551
+ #end_No_1 = 2.35E-6 #us
552
+
553
+ end_No_1 = 2.3E-6 #us
554
+
555
+ #start_No_2 = 2.56E-6
556
+
557
+ start_No_2 = 2.5E-6
558
+
559
+ end_No_2 = 3.5E-6
560
+
561
+ start_No_3 = 3.6E-6
562
+
563
+ end_No_3 = 4.6E-6
564
+
565
+ ```
566
+
567
+ のようにして1μsecの整数倍に合わせればデータの両端が連続になるので、f特の10, 35MHz以外の振幅は消え、振幅はピッタリ狙い通りになります
568
+
569
+ ![f特](465c47bfe9bf7a707573f5950f4e6076.png)
570
+
571
+ あくまでも、今回の質問のデータのようなきれいなデータの場合はそうできる、というだけですが、ご参考までに

1

コード追加

2021/07/21 09:26

投稿

jbpb0
jbpb0

スコア7651

test CHANGED
@@ -261,3 +261,281 @@
261
261
  ![f特](86c57940cebc412c29bbfca4924cacb7.png)
262
262
 
263
263
  CSVファイルのデータが正しくできてれば、こうなるはず
264
+
265
+
266
+
267
+ 次に、「f」を、必要な部分のみ切り出して他は捨てる(0埋めではなく)ようにコードを変えます
268
+
269
+ その場合は、3回の「f」の長さが違うと周波数が合わないので、平均はしません
270
+
271
+ ```python
272
+
273
+ import pandas as pd
274
+
275
+ import numpy as np
276
+
277
+ import matplotlib.pyplot as plt
278
+
279
+
280
+
281
+ # # データの読み込み
282
+
283
+ ##csvファイル用正弦波関数:Amp * SIN(2.0 * PI() * f * t)
284
+
285
+ ###df = pd.read_csv('C:/ホットプレート電気炉焼成16コ比較/16csv/C1_00000test.csv', header=4) #ヘッダーは0から数える
286
+
287
+ ###t = np.array(df['Time'])
288
+
289
+ ###volt = np.array(df['Ampl'])
290
+
291
+ ###use_index = np.where(t > 0) #0以上のtを取得
292
+
293
+ ###t = t[use_index]
294
+
295
+ ###volt = volt[use_index]
296
+
297
+ ##
298
+
299
+ dt0 = 1 / 2500000000 # データ間隔
300
+
301
+ at0 = 7.314 * 10**-6 # 全データ長
302
+
303
+ f10 = 10 * 10**6 # 周波数1
304
+
305
+ f20 = 35 * 10**6 # 周波数2
306
+
307
+ a10 = 2 # 周波数1の振幅
308
+
309
+ a20 = 5 # 周波数2の振幅
310
+
311
+ ##
312
+
313
+ t = np.arange(0, at0, dt0) # arange(開始, 終了の次, 間隔)
314
+
315
+ volt = a10 * np.sin(2 * np.pi * f10 * t) + a20 * np.sin(2 * np.pi * f20 * t)
316
+
317
+ ##
318
+
319
+ src_fs = 1 / (t[1] - t[0]) #サンプリング周波数
320
+
321
+ src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数))
322
+
323
+ src_wav_time_length = src_wav_data_length / src_fs #全波形当たりの時間
324
+
325
+ aux_line_length = max(abs(volt)) / 2
326
+
327
+ all_arr = np.zeros((5, src_wav_data_length)) #平均処理のための行列
328
+
329
+ N = src_wav_data_length
330
+
331
+
332
+
333
+
334
+
335
+ ##切り出し範囲指定
336
+
337
+ ################C1_00000.csv##################
338
+
339
+ start_No_1 = 1.3E-6 #us
340
+
341
+ end_No_1 = 2.35E-6 #us
342
+
343
+ start_No_2 = 2.56E-6
344
+
345
+ end_No_2 = 3.5E-6
346
+
347
+ start_No_3 = 3.6E-6
348
+
349
+ end_No_3 = 4.6E-6
350
+
351
+
352
+
353
+ ######グラフ作成########
354
+
355
+ fig1 = plt.figure()
356
+
357
+ wav_data_length_us = src_wav_data_length
358
+
359
+ target_arr = np.array([start_No_1, end_No_1, start_No_2, end_No_2, start_No_3, end_No_3])
360
+
361
+
362
+
363
+ ###################時間軸データ1###################
364
+
365
+ ax1 = fig1.add_subplot(2, 1, 1)
366
+
367
+ plt.plot(t * 1000000, volt, linewidth=1)
368
+
369
+ plt.vlines([start_No_1*1E6, start_No_1*1E6, end_No_1*1E6], -aux_line_length, aux_line_length, color = "blue")
370
+
371
+ plt.vlines([start_No_2*1E6, end_No_2*1E6], -aux_line_length, aux_line_length, color = "green")
372
+
373
+ plt.vlines([start_No_3*1E6, end_No_3*1E6], -aux_line_length, aux_line_length, color = "red")
374
+
375
+ plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
376
+
377
+ plt.xlabel("time [us]")
378
+
379
+ plt.ylabel("amplitude [V]")
380
+
381
+ plt.grid()
382
+
383
+
384
+
385
+ ###################時間軸データ2###################
386
+
387
+ ax2 = fig1.add_subplot(2, 1, 2)
388
+
389
+ plt.plot(t * 1000000, volt, linewidth=1)
390
+
391
+ plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
392
+
393
+ plt.xlabel("time [us]")
394
+
395
+ plt.ylabel("amplitude [V]")
396
+
397
+ plt.grid()
398
+
399
+ plt.tight_layout()
400
+
401
+
402
+
403
+ plt.show()
404
+
405
+
406
+
407
+ print(src_fs)
408
+
409
+
410
+
411
+ fig, ax = plt.subplots() # figure と axes を定義
412
+
413
+ ###################周波数軸データ1~3###################
414
+
415
+ for a in range(0, 5, 2):
416
+
417
+ target_gate = np.zeros(wav_data_length_us, dtype='float32')
418
+
419
+ target_gate[int(target_arr[a]*src_fs):int(target_arr[a+1]*src_fs)] = 1.0
420
+
421
+ target_wav = np.zeros([wav_data_length_us], dtype='float32')
422
+
423
+ target_wav = volt * target_gate
424
+
425
+ target_wav = np.roll(target_wav, -1*int(target_arr[a]*src_fs))
426
+
427
+
428
+
429
+ # 信号の作成
430
+
431
+ # src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
432
+
433
+ dt = 1 / src_fs
434
+
435
+ freq = src_fs # 周波数(10Hz) =>正弦波の周期0.1sec
436
+
437
+ t = np.arange(0, N*dt, dt) # 時間軸
438
+
439
+ #M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs) + 1
440
+
441
+ M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs)
442
+
443
+ #f = target_wav # 信号(周波数10、振幅1の正弦波)
444
+
445
+ f = target_wav[:M]
446
+
447
+ F = np.fft.fft(f)
448
+
449
+ F_abs = np.abs(F)# FFTの複素数結果を絶対に変換
450
+
451
+ # 振幅をもとの信号に揃える
452
+
453
+ F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
454
+
455
+ F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分は2倍不要
456
+
457
+
458
+
459
+ #fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
460
+
461
+ fq = np.linspace(0, 1.0/dt, M) # 周波数軸 linspace(開始,終了,分割数)
462
+
463
+
464
+
465
+
466
+
467
+ if a == 0:
468
+
469
+ ax.set_xlabel("freqency[Hz]")
470
+
471
+ ax.set_xlim(0, 10E6)
472
+
473
+ ax.set_ylabel("amplitude[arb.unit]")
474
+
475
+ #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='1st-Wave_FrequencyResponse', color="blue") # ナイキスト定数まで表示
476
+
477
+ ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='1st-Wave_FrequencyResponse', color="blue", marker="o") # ナイキスト定数まで表示
478
+
479
+ ax.legend()
480
+
481
+ ax.grid()
482
+
483
+ ax.axis("tight") #すべてのデータが見えるように最大・最小を変更する
484
+
485
+ ax.set_xlim(0, 4.0E7)
486
+
487
+ ax.set_ylim(-0.2, 5.2)
488
+
489
+
490
+
491
+
492
+
493
+ elif a == 2:
494
+
495
+ #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='2nd-Wave_FrequencyResponse', color="green") # ナイキスト定数まで表示
496
+
497
+ ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='2nd-Wave_FrequencyResponse', color="green", marker="o") # ナイキスト定数まで表示
498
+
499
+ ax.legend()
500
+
501
+
502
+
503
+ else :
504
+
505
+ #ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='3rd-Wave_FrequencyResponse', color="red") # ナイキスト定数まで表示
506
+
507
+ ax.plot(fq[:int(M/2)+1], F_abs_amp[:int(M/2)+1], label='3rd-Wave_FrequencyResponse', color="red", marker="o") # ナイキスト定数まで表示
508
+
509
+ ax.legend()
510
+
511
+
512
+
513
+ #for i in range(N):
514
+
515
+ # all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
516
+
517
+
518
+
519
+
520
+
521
+ ###################周波数軸データ平均###################
522
+
523
+ #all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
524
+
525
+ #ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
526
+
527
+ #ax.legend()
528
+
529
+
530
+
531
+ plt.show()
532
+
533
+ ```
534
+
535
+ 0埋めがなくなり、データがあるところと0埋めしてるところの段差が無くなるので、f特のたくさんあった細かい振動は無くなります
536
+
537
+ 3回の切り出しの内で、1, 2回目はデータの両端が不連続なので、f特振幅ピークが狙いと合わなくなります
538
+
539
+ (35MHzだけじゃなく、10MHzも)
540
+
541
+ ![f特](aea770c82a93fbaf7717e6274ee8524a.png)