回答編集履歴
3
説明の追記
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
説明の追加
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
コード追加
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)
|