teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

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

2021/07/20 16:25

投稿

ma2_718
ma2_718

スコア2

title CHANGED
File without changes
body CHANGED
@@ -175,4 +175,9 @@
175
175
 
176
176
 
177
177
  csvファイルでは以下のように正弦波を作成しています.(csvファイルは,保存してもいったんファイルを閉じてしまうと数値しか保存されていておらず定義した数式が保存されなかったので(保存方法が分かりませんでした),以下にはファイルではなくスクショ画面を載せておきます)印をつけた部分の値を,上のグラフで定義した周波数に変更してそれぞれプログラムに通してみました.
178
- ![イメージ説明](20d104d879437968269acb09a0d29c4d.jpeg)
178
+ ![イメージ説明](20d104d879437968269acb09a0d29c4d.jpeg)
179
+
180
+
181
+ ・実際に処理したいデータ
182
+ ![イメージ説明](ca559b2655de591b8d0e07e9e292a948.png)
183
+ ![イメージ説明](e5d9866cd154748049e6ef965bb8c29e.png)

2

周波数変更追加

2021/07/20 16:25

投稿

ma2_718
ma2_718

スコア2

title CHANGED
File without changes
body CHANGED
@@ -134,4 +134,45 @@
134
134
 
135
135
  ### 試したこと
136
136
  以下のリンクを始めとする分かりやすいページで,FFT処理した後の正規化や交流成分2 倍を調べました.ですが,上のプログラムで,周波数特性のグラフで10MHzのところに振幅の値2(こちらの方は解決いたしました,ありがとうございました),35MHzのところに振幅の値5が出ませんでした.webにあげられているものを組み合わさせていただきながらいろいろ書き替えたため非常に分かりにくいプログラムとなっていますが,上記のプログラムの問題点が分かられる方ご回答よろしくお願いします.
137
- https://org-technology.com/posts/fft-03.html
137
+ https://org-technology.com/posts/fft-03.html
138
+
139
+ 以下に単体の正弦波の周波数を変えてプログラムに通した結果を示します.(振幅は2で試しています)
140
+ .10MHzの場合の時間軸グラフと周波数軸グラフ
141
+ ![イメージ説明](501257b18ae2e3936a23f4af3f108e61.png)
142
+ ![イメージ説明](ed844ef5c30d6105d2267169c39ecec7.png)
143
+
144
+ .15MHzの場合の時間軸グラフと周波数軸グラフ
145
+ ![イメージ説明](3f0accffbc7346cf1549417aab4f472d.png)
146
+ ![イメージ説明](f2306e5af1a39e26da8ae4c14b9824c1.png)
147
+
148
+ .20MHzの場合の時間軸グラフと周波数軸グラフ
149
+ ![イメージ説明](657cb048f68f9975a9494c1a7e4b832e.png)
150
+ ![イメージ説明](9abae253cb32a72971cca05b4a37723e.png)
151
+
152
+ .30MHzの場合の時間軸グラフと周波数軸グラフ
153
+ ![イメージ説明](6d3122da21dd437065662ec1d2e20297.png)
154
+ ![イメージ説明](d627e5be65bda36f357fb6d8dae9000e.png)
155
+
156
+ .31MHzの場合の時間軸グラフと周波数軸グラフ
157
+ ![イメージ説明](fcb7f4e99ec0766e7c519bcfc3d2cd4b.png)
158
+ ![イメージ説明](c299735a10d27795c8b559fafb7db379.png)
159
+
160
+ .32MHzの場合の時間軸グラフと周波数軸グラフ
161
+ ![イメージ説明](97b4e2fe967af9725d8cdfea36c26d37.png)
162
+ ![イメージ説明](173abc3ef435241fbbb0fa2fd752255f.png)
163
+
164
+ .33MHzの場合の時間軸グラフと周波数軸グラフ
165
+ ![イメージ説明](dc93f8c051d2912d2b7950fb0aa3c426.png)
166
+ ![イメージ説明](62607d832d8875dfe585314e3d1b0d85.png)
167
+
168
+ .34MHzの場合の時間軸グラフと周波数軸グラフ
169
+ ![イメージ説明](1d611de96156bff5f1dad42126ae3bed.png)
170
+ ![イメージ説明](21881f8265cf3e7e68ca1bfa6b5e3a3b.png)
171
+
172
+ .35MHzの場合の時間軸グラフと周波数軸グラフ
173
+ ![イメージ説明](641d330b3af4e8fe24391ea0fcaf376e.png)
174
+ ![イメージ説明](0d719ed37fff7c3691a7cfe3f707a344.png)
175
+
176
+
177
+ csvファイルでは以下のように正弦波を作成しています.(csvファイルは,保存してもいったんファイルを閉じてしまうと数値しか保存されていておらず定義した数式が保存されなかったので(保存方法が分かりませんでした),以下にはファイルではなくスクショ画面を載せておきます)印をつけた部分の値を,上のグラフで定義した周波数に変更してそれぞれプログラムに通してみました.
178
+ ![イメージ説明](20d104d879437968269acb09a0d29c4d.jpeg)

1

正規化する際のデータ数を f → M に変更しました

2021/07/20 15:07

投稿

ma2_718
ma2_718

スコア2

title CHANGED
File without changes
body CHANGED
@@ -1,15 +1,18 @@
1
1
  ### 前提・実現したいこと
2
- 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のピークが出るはずなのではないでしょうか?
2
+ 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のピークが出るはずなのではないでしょうか?
3
3
  (ちなみに以下のプログラムは超音波パルスエコーの切り出し処理を前提に書いたもののため,時間軸で3か所の切り出しを行い3つそれぞれの周波数特性を求めAverageWaveとして表示させているのでグラフがいくつも出てしまっています.ご了承ください.)
4
- ![![イメージ説明](a5427cec8296c0057082e4da3959d92a.png)]
4
+ ![![時間軸切り出し](a5427cec8296c0057082e4da3959d92a.png)
5
5
  *拡大バージョン
6
- ![イメージ説明](808e9bff8f7f3e1cb20becbc84842940.png)
6
+ ![時間軸切り出し](808e9bff8f7f3e1cb20becbc84842940.png)
7
- ![イメージ説明](b1d726368fd4c11b15364dd1d0fe81e1.png)
7
+ ![周波数特性](20a8039548dc48a86f4394579c3c82ed.png)
8
8
  ### 実行プログラム
9
9
  ```ここに言語を入力
10
10
  import pandas as pd
11
11
  import numpy as np
12
12
  import matplotlib.pyplot as plt
13
+
14
+ # # データの読み込み
15
+ ##csvファイル用正弦波関数:Amp * SIN(2.0 * PI() * f * t)
13
16
  df = pd.read_csv('C:/ホットプレート電気炉焼成16コ比較/16csv/C1_00000test.csv', header=4) #ヘッダーは0から数える
14
17
  t = np.array(df['Time'])
15
18
  volt = np.array(df['Ampl'])
@@ -23,6 +26,9 @@
23
26
  all_arr = np.zeros((5, src_wav_data_length)) #平均処理のための行列
24
27
  N = src_wav_data_length
25
28
 
29
+
30
+ ##切り出し範囲指定
31
+ ################C1_00000.csv##################
26
32
  start_No_1 = 1.3E-6 #us
27
33
  end_No_1 = 2.35E-6 #us
28
34
  start_No_2 = 2.56E-6
@@ -30,10 +36,12 @@
30
36
  start_No_3 = 3.6E-6
31
37
  end_No_3 = 4.6E-6
32
38
 
39
+ ######グラフ作成########
33
40
  fig1 = plt.figure()
34
41
  wav_data_length_us = src_wav_data_length
35
42
  target_arr = np.array([start_No_1, end_No_1, start_No_2, end_No_2, start_No_3, end_No_3])
36
43
 
44
+ ###################時間軸データ1###################
37
45
  ax1 = fig1.add_subplot(2, 1, 1)
38
46
  plt.plot(t * 1000000, volt, linewidth=1)
39
47
  plt.vlines([start_No_1*1E6, start_No_1*1E6, end_No_1*1E6], -aux_line_length, aux_line_length, color = "blue")
@@ -44,6 +52,7 @@
44
52
  plt.ylabel("amplitude [V]")
45
53
  plt.grid()
46
54
 
55
+ ###################時間軸データ2###################
47
56
  ax2 = fig1.add_subplot(2, 1, 2)
48
57
  plt.plot(t * 1000000, volt, linewidth=1)
49
58
  plt.axis("tight") #すべてのデータが見えるように最大・最小を変更する
@@ -54,9 +63,10 @@
54
63
 
55
64
  plt.show()
56
65
 
66
+ print(src_fs)
57
67
 
58
68
  fig, ax = plt.subplots() # figure と axes を定義
59
-
69
+ ###################周波数軸データ1~3###################
60
70
  for a in range(0, 5, 2):
61
71
  target_gate = np.zeros(wav_data_length_us, dtype='float32')
62
72
  target_gate[int(target_arr[a]*src_fs):int(target_arr[a+1]*src_fs)] = 1.0
@@ -64,15 +74,18 @@
64
74
  target_wav = volt * target_gate
65
75
  target_wav = np.roll(target_wav, -1*int(target_arr[a]*src_fs))
66
76
 
77
+ # 信号の作成
67
- src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
78
+ # src_wav_data_length = t.shape[0] #全波形データ長(〇.shapeで〇の行と列の数が取り出せる(今回は行の数)
68
79
  dt = 1 / src_fs
69
80
  freq = src_fs # 周波数(10Hz) =>正弦波の周期0.1sec
70
81
  t = np.arange(0, N*dt, dt) # 時間軸
71
82
  f = target_wav # 信号(周波数10、振幅1の正弦波)
72
83
  F = np.fft.fft(f)
73
84
  F_abs = np.abs(F)# FFTの複素数結果を絶対に変換
85
+ M = int(target_arr[a+1]*src_fs) - int(target_arr[a]*src_fs) + 1
86
+ # 振幅をもとの信号に揃える
74
- F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍
87
+ F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
75
- F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回扱わないけど)は2倍不要
88
+ F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分は2倍不要
76
89
 
77
90
  fq = np.linspace(0, 1.0/dt, N) # 周波数軸 linspace(開始,終了,分割数)
78
91
 
@@ -99,6 +112,8 @@
99
112
  for i in range(N):
100
113
  all_arr[a][i] = all_arr[a][i] + F_abs_amp[i]
101
114
 
115
+
116
+ ###################周波数軸データ平均###################
102
117
  all_ave = (all_arr[0][0:N] + all_arr[2][0:N] + all_arr[4][0:N]) / 3
103
118
  ax.plot(fq[:int(N/2)+1], all_ave[:int(N/2)+1], label='AverageWave', color = "orange") # ナイキスト定数まで表示
104
119
  ax.legend()
@@ -110,12 +125,13 @@
110
125
 
111
126
  ### 該当のソースコード
112
127
  ```ここに言語を入力
128
+ # 振幅をもとの信号に揃える
113
- F_abs_amp = F_abs / N * 2 # 交流成分はデータ数で割って2倍
129
+ F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
114
- F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要
130
+ F_abs_amp[0] = F_abs_amp[0] / 2 # 直流成分(今回は扱わないけど)は2倍不要
115
131
 
116
132
  ```
117
133
 
118
134
 
119
135
  ### 試したこと
120
- 以下のリンクを始めとする分かりやすいページで,FFT処理した後の正規化や交流成分2 倍を調べました.ですが,上のプログラムで,周波数特性のグラフで10MHzのところに振幅の値2,35MHzのところに振幅の値5が出ませんでした.いろいろ書き替えたため非常に分かりにくいプログラムとなっていますが,よろしくお願いします.
136
+ 以下のリンクを始めとする分かりやすいページで,FFT処理した後の正規化や交流成分2 倍を調べました.ですが,上のプログラムで,周波数特性のグラフで10MHzのところに振幅の値2(こちらの方は解決いたしましたありがとうございました),35MHzのところに振幅の値5が出ませんでした.webにあげられてるものを組み合わさせていただきながらいろいろ書き替えたため非常に分かりにくいプログラムとなっていますが,上記のプログラムの問題点が分かられる方ご回答よろしくお願いします.
121
137
  https://org-technology.com/posts/fft-03.html