質問編集履歴
3
「実際に処理したいデータ」追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -175,4 +175,9 @@
|
|
175
175
|
|
176
176
|
|
177
177
|
csvファイルでは以下のように正弦波を作成しています.(csvファイルは,保存してもいったんファイルを閉じてしまうと数値しか保存されていておらず定義した数式が保存されなかったので(保存方法が分かりませんでした),以下にはファイルではなくスクショ画面を載せておきます)印をつけた部分の値を,上のグラフで定義した周波数に変更してそれぞれプログラムに通してみました.
|
178
|
-

|
178
|
+

|
179
|
+
|
180
|
+
|
181
|
+
・実際に処理したいデータ
|
182
|
+

|
183
|
+

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

|
142
|
+

|
143
|
+
|
144
|
+
.15MHzの場合の時間軸グラフと周波数軸グラフ
|
145
|
+

|
146
|
+

|
147
|
+
|
148
|
+
.20MHzの場合の時間軸グラフと周波数軸グラフ
|
149
|
+

|
150
|
+

|
151
|
+
|
152
|
+
.30MHzの場合の時間軸グラフと周波数軸グラフ
|
153
|
+

|
154
|
+

|
155
|
+
|
156
|
+
.31MHzの場合の時間軸グラフと周波数軸グラフ
|
157
|
+

|
158
|
+

|
159
|
+
|
160
|
+
.32MHzの場合の時間軸グラフと周波数軸グラフ
|
161
|
+

|
162
|
+

|
163
|
+
|
164
|
+
.33MHzの場合の時間軸グラフと周波数軸グラフ
|
165
|
+

|
166
|
+

|
167
|
+
|
168
|
+
.34MHzの場合の時間軸グラフと周波数軸グラフ
|
169
|
+

|
170
|
+

|
171
|
+
|
172
|
+
.35MHzの場合の時間軸グラフと周波数軸グラフ
|
173
|
+

|
174
|
+

|
175
|
+
|
176
|
+
|
177
|
+
csvファイルでは以下のように正弦波を作成しています.(csvファイルは,保存してもいったんファイルを閉じてしまうと数値しか保存されていておらず定義した数式が保存されなかったので(保存方法が分かりませんでした),以下にはファイルではなくスクショ画面を載せておきます)印をつけた部分の値を,上のグラフで定義した周波数に変更してそれぞれプログラムに通してみました.
|
178
|
+

|
1
正規化する際のデータ数を f → M に変更しました
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/
|
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
|
-

|
5
5
|
*拡大バージョン
|
6
|
-

|
7
|
-

|
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 /
|
87
|
+
F_abs_amp = F_abs / M * 2 # 交流成分はデータ数で割って2倍
|
75
|
-
F_abs_amp[0] = F_abs_amp[0] / 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 /
|
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
|