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

|
286
286
|
あくまでも、今回の質問のデータのようなきれいなデータの場合はそうできる、というだけですが、ご参考までに
|
2
説明の追加
answer
CHANGED
@@ -268,4 +268,19 @@
|
|
268
268
|
0埋めがなくなり、データがあるところと0埋めしてるところの段差が無くなるので、f特のたくさんあった細かい振動は無くなります
|
269
269
|
3回の切り出しの内で、1, 2回目はデータの両端が不連続なので、f特振幅ピークが狙いと合わなくなります
|
270
270
|
(35MHzだけじゃなく、10MHzも)
|
271
|
-

|
271
|
+

|
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
|
+

|
286
|
+
あくまでも、今回の質問のデータのようなきれいなデータの場合はそうできる、というだけですが、ご参考までに
|
1
コード追加
answer
CHANGED
@@ -129,4 +129,143 @@
|
|
129
129
|

|
130
130
|
f特振幅ピークは、ほぼ狙い通りです
|
131
131
|

|
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
|
+

|