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

質問編集履歴

2

ソースコードに明確な区切りを設定しました

2021/03/02 07:19

投稿

tsuji__
tsuji__

スコア11

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

コードの書式を改善

2021/03/02 07:19

投稿

tsuji__
tsuji__

スコア11

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ファイルにはサンプリング周波数8192Hzの波形ファイルがあり、それをコード内の条件で周波数分析を試みているのですが、クラスについての理解が疎いのか上手くコードが動作しません。以下のようなグラフが表示されてしまいます。
5
+ csvファイルにはがあり、それをコード内の条件で周波数分析を試みているのですが、クラスについての理解が疎いのか上手くコードが動作しません。以下のようなグラフが表示されてしまいます。
6
6
  上から順に時刻歴波形 窓関数 伝達関数(デシベル表示)
7
7
  [![イメージ説明](7df2a02a80f62c56adde4a12ed96bc92.png)](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
- # FFT
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
- #window = np.hamming(L) # ハミング窓
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
- # FFT計算
75
+ FFT計算
78
- # numpy.fftよりscipy.fftpackの方が速い
76
+
79
- NFFT = 2**nextpow2(L) # 計算速度向上のため解析データ数に近い2の乗数を計算
77
+ NFFT = 2**nextpow2(L)
80
- fft_amp = fftpack.fft(array_window, NFFT) # 周波数領域のAmplitude
78
+ fft_amp = fftpack.fft(array_window, NFFT)
81
- fft_fq = fftpack.fftfreq(NFFT, d=1.0/fs) # Amplitudeに対応する周波数
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) # x軸ラベル表示のため余白調整
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
- #plt.ylabel('Data*hamming')
97
+
100
98
  plt.ylabel('Data*hann')
101
99
  plt.grid()
102
- # FFTプロット
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
- # MATLAB関数nextpow2
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