質問編集履歴

3

「実際に処理したいデータ」追加

2021/07/20 16:25

投稿

ma2_718
ma2_718

スコア2

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

周波数変更追加

2021/07/20 16:25

投稿

ma2_718
ma2_718

スコア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 に変更しました

2021/07/20 15:07

投稿

ma2_718
ma2_718

スコア2

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/N を掛ける),交流成分2 倍を行ったら,周波数特性のグラフで10MHzのところに振幅の値2,35MHzのところに振幅の値5のピークが出るはずなのではないでしょうか?
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
- ![![イメージ説明](a5427cec8296c0057082e4da3959d92a.png)]
7
+ ![![時間軸切り出し](a5427cec8296c0057082e4da3959d92a.png)
8
8
 
9
9
  *拡大バージョン
10
10
 
11
- ![イメージ説明](808e9bff8f7f3e1cb20becbc84842940.png)
11
+ ![時間軸切り出し](808e9bff8f7f3e1cb20becbc84842940.png)
12
-
12
+
13
- ![イメージ説明](b1d726368fd4c11b15364dd1d0fe81e1.png)
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 / N * 2 # 交流成分はデータ数で割って2倍
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