前提・実現したいこと
初めての質問です。サンプリング周波数8192Hzのcsv形式波形ファイルをpythonで読み込みFFT分析を行い、横軸周波数 片振幅の伝達関数グラフの作成をしたいです。
発生している問題・エラーメッセージ
csvファイルにはがあり、それをコード内の条件で周波数分析を試みているのですが、クラスについての理解が疎いのか上手くコードが動作しません。以下のようなグラフが表示されてしまいます。
上から順に時刻歴波形 窓関数 伝達関数(デシベル表示)
該当のソースコード
python
1import numpy as np 2import matplotlib.pyplot as plt! 3import csv 4from scipy import fftpack 5from scipy import signal 6F_s=[] 7path="Wave_Fs8192_01.csv" 8with open (path) as f: 9 for row in csv.reader(f, quoting=csv.QUOTE_NONNUMERIC): 10 F_s.append(float(row[0])) 11 12class TestFFT(): 13 14 def __init__(self): 15 self.msg = 'Wave_Fs8192_01.csv' 16 設定値 17 self.fs = 8192 # サンプリング周波数 18 self.N=4096 #サンプル数(フレームサイズ) 19 self.fmax=8192/2.56 #最大周波数 20 self.line=400#ライン数 21 self.sec = self.line/self.fmax # 時間 22 self.start_time = 2.25 # 抽出開始時間 23 self.period = 1/self.fs # 抽出期間 24 25 26 オーバーラップの関数 27 def ov(self, F_s, Fc, overlap): 28 overlap=50 29 Ts = len(F_s) / self.fs #データ長 30 Fc = self.N / self.fs#フレーム周期 31 x_ol = self.fs * (1 - (overlap/100)) 32 N_ave = int((Ts - (Fc * (overlap/100))) / (Fc * (1-(overlap/100)))) 33 34 array = [] 35 36 for i in range(N_ave): 37 ps = int(x_ol * i) 38 array.append(F_s[ps:ps+self.fs:1]) 39 return array, N_ave 40 41 def process(self): 42 43 print(self.msg) 44 t=np.arange(0,self.sec,self.period) 45 46 start=int(self.start_time*self.fs) 47 end=int(self.start_time + self.period)*self.fs 48 y=F_s[start:end] 49 x=t[start:end] 50 51 fft(y,self.fs) 52 53 54 plt.show() 55 56def fft(array, fs, ylabel_name='Data', xlabel_name='Time'): 57 58 窓関数で波形を切り出す 59 L = len(F_s) 60 61 window=signal.boxcar(L) 62 array_window = F_s * window 63 64 FFT計算 65 66 NFFT = 2**nextpow2(L) 67 fft_amp = fftpack.fft(array_window, NFFT) 68 fft_fq = fftpack.fftfreq(NFFT, d=1.0/fs) 69 70 fft_amp = fft_amp[0: int(len(fft_amp)/2)] 71 fft_fq = fft_fq[0: int(len(fft_fq)/2)] 72 fft_amp = db(abs(fft_amp)) 73 74 75 plt.figure(figsize=(8, 6*1.5)) 76 plt.subplots_adjust(hspace=0.4) 77 78 plt.subplot(3, 1, 1) 79 plt.plot(F_s) 80 plt.ylabel(ylabel_name) 81 plt.grid() 82 83 plt.subplot(3, 1, 2) 84 plt.plot(array_window) 85 plt.xlabel(xlabel_name) 86 87 plt.ylabel('Data*hann') 88 plt.grid() 89 90 plt.subplot(3, 1, 3) 91 plt.plot(fft_fq, fft_amp) 92 plt.xlim(0, fs/2) 93 plt.xlabel('Frequency [Hz]') 94 plt.ylabel('Amplitude [dB]') # |X(omega)| 95 plt.grid() 96 97 98def nextpow2(n): 99 m_f = np.log2(n) 100 m_i = np.ceil(m_f) 101 return int(np.log2(2**m_i)) 102 103 104def db(x, dBref=1): 105 y = 20 * np.log10(x / dBref) 106 return y 107 108 109if __name__ == '__main__': 110 proc = TestFFT() 111 proc.process()
試したこと
ネットでサンプルコードをもとにpythonの実行順番 デバッグなどを試み、クラス selfなどは一通り独学で学習し、実際に試したりもしました。
補足情報(FW/ツールのバージョンなど)
初めての質問でまだ使い勝手がよく分かっておらずソースコードなど見にくいと思いますがご容赦ください。
お手数ではございますが、teratailさんにコードを記述する際のアドバイス等一言だけでもございましたら、書いていただけると嬉しいです。本筋とは離れた要求であることは承知しておりますがどうかよろしくお願い致します。
