質問編集履歴
2
ソースコードに明確な区切りを設定しました
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
サンプリング周波数8192Hzのcsv形式波形ファイルをpythonで読み込みFFT分析を行い、横軸周波数 片振幅の伝達関数グラフの作成
|
2
|
+
初めての質問です。サンプリング周波数8192Hzのcsv形式波形ファイルをpythonで読み込みFFT分析を行い、横軸周波数 片振幅の伝達関数グラフの作成をしたいです。
|
3
3
|
|
4
4
|
### 発生している問題・エラーメッセージ
|
5
5
|
csvファイルにはがあり、それをコード内の条件で周波数分析を試みているのですが、クラスについての理解が疎いのか上手くコードが動作しません。以下のようなグラフが表示されてしまいます。
|
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
### 該当のソースコード
|
10
10
|
|
11
|
-
python
|
11
|
+
```python
|
12
12
|
import numpy as np
|
13
13
|
import matplotlib.pyplot as plt!
|
14
14
|
import csv
|
@@ -120,8 +120,10 @@
|
|
120
120
|
if __name__ == '__main__':
|
121
121
|
proc = TestFFT()
|
122
122
|
proc.process()
|
123
|
-
|
123
|
+
```
|
124
124
|
### 試したこと
|
125
125
|
ネットでサンプルコードをもとにpythonの実行順番 デバッグなどを試み、クラス selfなどは一通り独学で学習し、実際に試したりもしました。
|
126
126
|
|
127
|
-
### 補足情報(FW/ツールのバージョンなど)
|
127
|
+
### 補足情報(FW/ツールのバージョンなど)
|
128
|
+
初めての質問でまだ使い勝手がよく分かっておらずソースコードなど見にくいと思いますがご容赦ください。
|
129
|
+
お手数ではございますが、teratailさんにコードを記述する際のアドバイス等一言だけでもございましたら、書いていただけると嬉しいです。本筋とは離れた要求であることは承知しておりますがどうかよろしくお願い致します。
|
1
コードの書式を改善
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
### 前提・実現したいこと
|
2
|
-
csvファイルをpythonで読み込みFFT分析を行い、横軸周波数 片振幅の伝達関数グラフの作成
|
2
|
+
サンプリング周波数8192Hzのcsv形式波形ファイルをpythonで読み込みFFT分析を行い、横軸周波数 片振幅の伝達関数グラフの作成
|
3
3
|
|
4
4
|
### 発生している問題・エラーメッセージ
|
5
|
-
csvファイルには
|
5
|
+
csvファイルにはがあり、それをコード内の条件で周波数分析を試みているのですが、クラスについての理解が疎いのか上手くコードが動作しません。以下のようなグラフが表示されてしまいます。
|
6
6
|
上から順に時刻歴波形 窓関数 伝達関数(デシベル表示)
|
7
7
|
[](eeeeba845b819f838f646638e4f44ced.png)
|
8
8
|
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
def __init__(self):
|
26
26
|
self.msg = 'Wave_Fs8192_01.csv'
|
27
|
-
|
27
|
+
設定値
|
28
28
|
self.fs = 8192 # サンプリング周波数
|
29
29
|
self.N=4096 #サンプル数(フレームサイズ)
|
30
30
|
self.fmax=8192/2.56 #最大周波数
|
@@ -34,7 +34,7 @@
|
|
34
34
|
self.period = 1/self.fs # 抽出期間
|
35
35
|
|
36
36
|
|
37
|
-
|
37
|
+
オーバーラップの関数
|
38
38
|
def ov(self, F_s, Fc, overlap):
|
39
39
|
overlap=50
|
40
40
|
Ts = len(F_s) / self.fs #データ長
|
@@ -58,7 +58,7 @@
|
|
58
58
|
end=int(self.start_time + self.period)*self.fs
|
59
59
|
y=F_s[start:end]
|
60
60
|
x=t[start:end]
|
61
|
-
|
61
|
+
|
62
62
|
fft(y,self.fs)
|
63
63
|
|
64
64
|
|
@@ -66,40 +66,38 @@
|
|
66
66
|
|
67
67
|
def fft(array, fs, ylabel_name='Data', xlabel_name='Time'):
|
68
68
|
|
69
|
-
|
69
|
+
窓関数で波形を切り出す
|
70
70
|
L = len(F_s)
|
71
|
-
|
71
|
+
|
72
|
-
#window=np.boxcar(L) #レクタンギュラ窓
|
73
|
-
#window = np.hanning(L) # ハン窓
|
74
72
|
window=signal.boxcar(L)
|
75
73
|
array_window = F_s * window
|
76
74
|
|
77
|
-
|
75
|
+
FFT計算
|
78
|
-
|
76
|
+
|
79
|
-
NFFT = 2**nextpow2(L)
|
77
|
+
NFFT = 2**nextpow2(L)
|
80
|
-
fft_amp = fftpack.fft(array_window, NFFT)
|
78
|
+
fft_amp = fftpack.fft(array_window, NFFT)
|
81
|
-
fft_fq = fftpack.fftfreq(NFFT, d=1.0/fs)
|
79
|
+
fft_fq = fftpack.fftfreq(NFFT, d=1.0/fs)
|
82
|
-
|
80
|
+
|
83
81
|
fft_amp = fft_amp[0: int(len(fft_amp)/2)]
|
84
82
|
fft_fq = fft_fq[0: int(len(fft_fq)/2)]
|
85
|
-
fft_amp = db(abs(fft_amp))
|
83
|
+
fft_amp = db(abs(fft_amp))
|
86
84
|
|
87
|
-
|
85
|
+
|
88
86
|
plt.figure(figsize=(8, 6*1.5))
|
89
|
-
plt.subplots_adjust(hspace=0.4)
|
87
|
+
plt.subplots_adjust(hspace=0.4)
|
90
|
-
|
88
|
+
|
91
89
|
plt.subplot(3, 1, 1)
|
92
90
|
plt.plot(F_s)
|
93
91
|
plt.ylabel(ylabel_name)
|
94
92
|
plt.grid()
|
95
|
-
|
93
|
+
|
96
94
|
plt.subplot(3, 1, 2)
|
97
95
|
plt.plot(array_window)
|
98
96
|
plt.xlabel(xlabel_name)
|
99
|
-
|
97
|
+
|
100
98
|
plt.ylabel('Data*hann')
|
101
99
|
plt.grid()
|
102
|
-
|
100
|
+
|
103
101
|
plt.subplot(3, 1, 3)
|
104
102
|
plt.plot(fft_fq, fft_amp)
|
105
103
|
plt.xlim(0, fs/2)
|
@@ -107,13 +105,13 @@
|
|
107
105
|
plt.ylabel('Amplitude [dB]') # |X(omega)|
|
108
106
|
plt.grid()
|
109
107
|
|
110
|
-
|
108
|
+
|
111
109
|
def nextpow2(n):
|
112
110
|
m_f = np.log2(n)
|
113
111
|
m_i = np.ceil(m_f)
|
114
112
|
return int(np.log2(2**m_i))
|
115
113
|
|
116
|
-
|
114
|
+
|
117
115
|
def db(x, dBref=1):
|
118
116
|
y = 20 * np.log10(x / dBref)
|
119
117
|
return y
|