質問編集履歴
3
「実際に処理したいデータ」追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -353,3 +353,13 @@
|
|
353
353
|
csvファイルでは以下のように正弦波を作成しています.(csvファイルは,保存してもいったんファイルを閉じてしまうと数値しか保存されていておらず定義した数式が保存されなかったので(保存方法が分かりませんでした),以下にはファイルではなくスクショ画面を載せておきます)印をつけた部分の値を,上のグラフで定義した周波数に変更してそれぞれプログラムに通してみました.
|
354
354
|
|
355
355
|
![イメージ説明](20d104d879437968269acb09a0d29c4d.jpeg)
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
・実際に処理したいデータ
|
362
|
+
|
363
|
+
![イメージ説明](ca559b2655de591b8d0e07e9e292a948.png)
|
364
|
+
|
365
|
+
![イメージ説明](e5d9866cd154748049e6ef965bb8c29e.png)
|
2
周波数変更追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -271,3 +271,85 @@
|
|
271
271
|
以下のリンクを始めとする分かりやすいページで,FFT処理した後の正規化や交流成分2 倍を調べました.ですが,上のプログラムで,周波数特性のグラフで10MHzのところに振幅の値2(こちらの方は解決いたしました,ありがとうございました),35MHzのところに振幅の値5が出ませんでした.webにあげられているものを組み合わさせていただきながらいろいろ書き替えたため非常に分かりにくいプログラムとなっていますが,上記のプログラムの問題点が分かられる方ご回答よろしくお願いします.
|
272
272
|
|
273
273
|
https://org-technology.com/posts/fft-03.html
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
以下に単体の正弦波の周波数を変えてプログラムに通した結果を示します.(振幅は2で試しています)
|
278
|
+
|
279
|
+
.10MHzの場合の時間軸グラフと周波数軸グラフ
|
280
|
+
|
281
|
+
![イメージ説明](501257b18ae2e3936a23f4af3f108e61.png)
|
282
|
+
|
283
|
+
![イメージ説明](ed844ef5c30d6105d2267169c39ecec7.png)
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
.15MHzの場合の時間軸グラフと周波数軸グラフ
|
288
|
+
|
289
|
+
![イメージ説明](3f0accffbc7346cf1549417aab4f472d.png)
|
290
|
+
|
291
|
+
![イメージ説明](f2306e5af1a39e26da8ae4c14b9824c1.png)
|
292
|
+
|
293
|
+
|
294
|
+
|
295
|
+
.20MHzの場合の時間軸グラフと周波数軸グラフ
|
296
|
+
|
297
|
+
![イメージ説明](657cb048f68f9975a9494c1a7e4b832e.png)
|
298
|
+
|
299
|
+
![イメージ説明](9abae253cb32a72971cca05b4a37723e.png)
|
300
|
+
|
301
|
+
|
302
|
+
|
303
|
+
.30MHzの場合の時間軸グラフと周波数軸グラフ
|
304
|
+
|
305
|
+
![イメージ説明](6d3122da21dd437065662ec1d2e20297.png)
|
306
|
+
|
307
|
+
![イメージ説明](d627e5be65bda36f357fb6d8dae9000e.png)
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
.31MHzの場合の時間軸グラフと周波数軸グラフ
|
312
|
+
|
313
|
+
![イメージ説明](fcb7f4e99ec0766e7c519bcfc3d2cd4b.png)
|
314
|
+
|
315
|
+
![イメージ説明](c299735a10d27795c8b559fafb7db379.png)
|
316
|
+
|
317
|
+
|
318
|
+
|
319
|
+
.32MHzの場合の時間軸グラフと周波数軸グラフ
|
320
|
+
|
321
|
+
![イメージ説明](97b4e2fe967af9725d8cdfea36c26d37.png)
|
322
|
+
|
323
|
+
![イメージ説明](173abc3ef435241fbbb0fa2fd752255f.png)
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
.33MHzの場合の時間軸グラフと周波数軸グラフ
|
328
|
+
|
329
|
+
![イメージ説明](dc93f8c051d2912d2b7950fb0aa3c426.png)
|
330
|
+
|
331
|
+
![イメージ説明](62607d832d8875dfe585314e3d1b0d85.png)
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
.34MHzの場合の時間軸グラフと周波数軸グラフ
|
336
|
+
|
337
|
+
![イメージ説明](1d611de96156bff5f1dad42126ae3bed.png)
|
338
|
+
|
339
|
+
![イメージ説明](21881f8265cf3e7e68ca1bfa6b5e3a3b.png)
|
340
|
+
|
341
|
+
|
342
|
+
|
343
|
+
.35MHzの場合の時間軸グラフと周波数軸グラフ
|
344
|
+
|
345
|
+
![イメージ説明](641d330b3af4e8fe24391ea0fcaf376e.png)
|
346
|
+
|
347
|
+
![イメージ説明](0d719ed37fff7c3691a7cfe3f707a344.png)
|
348
|
+
|
349
|
+
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
csvファイルでは以下のように正弦波を作成しています.(csvファイルは,保存してもいったんファイルを閉じてしまうと数値しか保存されていておらず定義した数式が保存されなかったので(保存方法が分かりませんでした),以下にはファイルではなくスクショ画面を載せておきます)印をつけた部分の値を,上のグラフで定義した周波数に変更してそれぞれプログラムに通してみました.
|
354
|
+
|
355
|
+
![イメージ説明](20d104d879437968269acb09a0d29c4d.jpeg)
|
1
正規化する際のデータ数を f → M に変更しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
2
|
|
3
|
-
csvファイルで,2*SIN(2 * PI() * 10^7 * A7)+5*SIN(2 * PI() * 3.5*10^7 * A7)のような正弦波を入力し(A列には時間を定義しています),pythonで読み込みをしました.表示・FFT処理を行ったところ,ピーク時の周波数は10MHz,35MHzと意図する周波数になったのですが,振幅の方が思ったようになりませんでした.上の関数は2と5の振幅の正弦波の組み合わせなので,以下のコードのように正規化( 1/
|
3
|
+
csvファイルで,2*SIN(2 * PI() * 10^7 * A7)+5*SIN(2 * PI() * 3.5*10^7 * A7)のような正弦波を入力し(A列には時間を定義しています),pythonで読み込みをしました.表示・FFT処理を行ったところ,ピーク時の周波数は10MHz,35MHzと意図する周波数になったのですが,振幅の方が思ったようになりませんでした.上の関数は2と5の振幅の正弦波の組み合わせなので,以下のコードのように正規化( 1/(データ数)を掛ける),交流成分2 倍を行ったら,周波数特性のグラフで10MHzのところに振幅の値2,35MHzのところに振幅の値5のピークが出るはずなのではないでしょうか?
|
4
4
|
|
5
5
|
(ちなみに以下のプログラムは超音波パルスエコーの切り出し処理を前提に書いたもののため,時間軸で3か所の切り出しを行い3つそれぞれの周波数特性を求めAverageWaveとして表示させているのでグラフがいくつも出てしまっています.ご了承ください.)
|
6
6
|
|
7
|
-
![![
|
7
|
+
![![時間軸切り出し](a5427cec8296c0057082e4da3959d92a.png)
|
8
8
|
|
9
9
|
*拡大バージョン
|
10
10
|
|
11
|
-
![
|
11
|
+
![時間軸切り出し](808e9bff8f7f3e1cb20becbc84842940.png)
|
12
|
-
|
12
|
+
|
13
|
-
![
|
13
|
+
![周波数特性](20a8039548dc48a86f4394579c3c82ed.png)
|
14
14
|
|
15
15
|
### 実行プログラム
|
16
16
|
|
@@ -22,6 +22,12 @@
|
|
22
22
|
|
23
23
|
import matplotlib.pyplot as plt
|
24
24
|
|
25
|
+
|
26
|
+
|
27
|
+
# # データの読み込み
|
28
|
+
|
29
|
+
##csvファイル用正弦波関数:Amp * SIN(2.0 * PI() * f * t)
|
30
|
+
|
25
31
|
df = pd.read_csv('C:/ホットプレート電気炉焼成16コ比較/16csv/C1_00000test.csv', header=4) #ヘッダーは0から数える
|
26
32
|
|
27
33
|
t = np.array(df['Time'])
|
@@ -48,6 +54,12 @@
|
|
48
54
|
|
49
55
|
|
50
56
|
|
57
|
+
|
58
|
+
|
59
|
+
##切り出し範囲指定
|
60
|
+
|
61
|
+
################C1_00000.csv##################
|
62
|
+
|
51
63
|
start_No_1 = 1.3E-6 #us
|
52
64
|
|
53
65
|
end_No_1 = 2.35E-6 #us
|
@@ -62,6 +74,8 @@
|
|
62
74
|
|
63
75
|
|
64
76
|
|
77
|
+
######グラフ作成########
|
78
|
+
|
65
79
|
fig1 = plt.figure()
|
66
80
|
|
67
81
|
wav_data_length_us = src_wav_data_length
|
@@ -70,6 +84,8 @@
|
|
70
84
|
|
71
85
|
|
72
86
|
|
87
|
+
###################時間軸データ1###################
|
88
|
+
|
73
89
|
ax1 = fig1.add_subplot(2, 1, 1)
|
74
90
|
|
75
91
|
plt.plot(t * 1000000, volt, linewidth=1)
|
@@ -90,6 +106,8 @@
|
|
90
106
|
|
91
107
|
|
92
108
|
|
109
|
+
###################時間軸データ2###################
|
110
|
+
|
93
111
|
ax2 = fig1.add_subplot(2, 1, 2)
|
94
112
|
|
95
113
|
plt.plot(t * 1000000, volt, linewidth=1)
|
@@ -110,11 +128,13 @@
|
|
110
128
|
|
111
129
|
|
112
130
|
|
131
|
+
print(src_fs)
|
132
|
+
|
113
133
|
|
114
134
|
|
115
135
|
fig, ax = plt.subplots() # figure と axes を定義
|
116
136
|
|
117
|
-
|
137
|
+
###################周波数軸データ1~3###################
|
118
138
|
|
119
139
|
for a in range(0, 5, 2):
|
120
140
|
|
@@ -130,7 +150,9 @@
|
|
130
150
|
|
131
151
|
|
132
152
|
|
153
|
+
# 信号の作成
|
154
|
+
|
133
|
-
src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
|
155
|
+
# src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
|
134
156
|
|
135
157
|
dt = 1 / src_fs
|
136
158
|
|
@@ -144,98 +166,108 @@
|
|
144
166
|
|
145
167
|
F_abs = np.abs(F)# FFTの複素数結果を絶対に変換
|
146
168
|
|
169
|
+
M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs) + 1
|
170
|
+
|
171
|
+
# 振幅をもとの信号に揃える
|
172
|
+
|
147
|
-
F_abs_amp = F_abs /
|
173
|
+
F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
|
174
|
+
|
175
|
+
F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分は2倍不要
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
if a == 0:
|
186
|
+
|
187
|
+
ax.set_xlabel("freqency[Hz]")
|
188
|
+
|
189
|
+
ax.set_xlim(0, 10E6)
|
190
|
+
|
191
|
+
ax.set_ylabel("amplitude[arb.unit]")
|
192
|
+
|
193
|
+
ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='1st-Wave_FrequencyResponse', color="blue") # ナイキスト定数まで表示
|
194
|
+
|
195
|
+
ax.legend()
|
196
|
+
|
197
|
+
ax.grid()
|
198
|
+
|
199
|
+
ax.axis("tight") #すべてのデータが見えるように最大・最小を変更する
|
200
|
+
|
201
|
+
ax.set_xlim(0, 4.0E7)
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
elif a == 2:
|
208
|
+
|
209
|
+
ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='2nd-Wave_FrequencyResponse', color="green") # ナイキスト定数まで表示
|
210
|
+
|
211
|
+
ax.legend()
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
else :
|
216
|
+
|
217
|
+
ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='3rd-Wave_FrequencyResponse', color="red") # ナイキスト定数まで表示
|
218
|
+
|
219
|
+
ax.legend()
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
for i in range(N):
|
224
|
+
|
225
|
+
all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
|
226
|
+
|
227
|
+
|
228
|
+
|
229
|
+
|
230
|
+
|
231
|
+
###################周波数軸データ平均###################
|
232
|
+
|
233
|
+
all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
|
234
|
+
|
235
|
+
ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
|
236
|
+
|
237
|
+
ax.legend()
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
plt.show()
|
242
|
+
|
243
|
+
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
```
|
248
|
+
|
249
|
+
|
250
|
+
|
251
|
+
### 該当のソースコード
|
252
|
+
|
253
|
+
```ここに言語を入力
|
254
|
+
|
255
|
+
# 振幅をもとの信号に揃える
|
256
|
+
|
257
|
+
F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
|
148
258
|
|
149
259
|
F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要
|
150
260
|
|
151
261
|
|
152
262
|
|
153
|
-
fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
if a == 0:
|
160
|
-
|
161
|
-
ax.set_xlabel("freqency[Hz]")
|
162
|
-
|
163
|
-
ax.set_xlim(0, 10E6)
|
164
|
-
|
165
|
-
ax.set_ylabel("amplitude[arb.unit]")
|
166
|
-
|
167
|
-
ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='1st-Wave_FrequencyResponse', color="blue") # ナイキスト定数まで表示
|
168
|
-
|
169
|
-
ax.legend()
|
170
|
-
|
171
|
-
ax.grid()
|
172
|
-
|
173
|
-
ax.axis("tight") #すべてのデータが見えるように最大・最小を変更する
|
174
|
-
|
175
|
-
ax.set_xlim(0, 4.0E7)
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
elif a == 2:
|
182
|
-
|
183
|
-
ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='2nd-Wave_FrequencyResponse', color="green") # ナイキスト定数まで表示
|
184
|
-
|
185
|
-
ax.legend()
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
else :
|
190
|
-
|
191
|
-
ax.plot(fq[:int(N/2)+1], F_abs_amp[:int(N/2)+1], label='3rd-Wave_FrequencyResponse', color="red") # ナイキスト定数まで表示
|
192
|
-
|
193
|
-
ax.legend()
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
for i in range(N):
|
198
|
-
|
199
|
-
all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
|
204
|
-
|
205
|
-
ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
|
206
|
-
|
207
|
-
ax.legend()
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
plt.show()
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
263
|
```
|
218
264
|
|
219
265
|
|
220
266
|
|
221
|
-
### 該当のソースコード
|
222
|
-
|
223
|
-
```ここに言語を入力
|
224
|
-
|
225
|
-
F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍
|
226
|
-
|
227
|
-
F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
```
|
232
|
-
|
233
|
-
|
234
|
-
|
235
267
|
|
236
268
|
|
237
269
|
### 試したこと
|
238
270
|
|
239
|
-
以下のリンクを始めとする分かりやすいページで,FFT処理した後の正規化や交流成分2 倍を調べました.ですが,上のプログラムで,周波数特性のグラフで10MHzのところに振幅の値2,35MHzのところに振幅の値5が出ませんでした.いろいろ書き替えたため非常に分かりにくいプログラムとなっていますが,よろしくお願いします.
|
271
|
+
以下のリンクを始めとする分かりやすいページで,FFT処理した後の正規化や交流成分2 倍を調べました.ですが,上のプログラムで,周波数特性のグラフで10MHzのところに振幅の値2(こちらの方は解決いたしました,ありがとうございました),35MHzのところに振幅の値5が出ませんでした.webにあげられているものを組み合わさせていただきながらいろいろ書き替えたため非常に分かりにくいプログラムとなっていますが,上記のプログラムの問題点が分かられる方ご回答よろしくお願いします.
|
240
272
|
|
241
273
|
https://org-technology.com/posts/fft-03.html
|