前提
PythonでCSVデータを解析しています。データを用いてスペクトログラムを作ったところノイズを除去する必要があると考えました。そこで500Hz以下を通さないハイパスフィルタをかけたいと考えてプログラムしたのですが上手くいきません。ですのでご教授いただければと思います。
実現したいこと
PythonでCSVデータにハイパスフィルタをかけてノイズを除去したい
発生している問題・エラーメッセージ
エラーは出ておりませんがそもそものデータにフィルタが適用されずデータが生み出されません。
下記の画像の通り下側の画像にフィルターをかけた生データがプロットされるはずなのですがされておりません。下記のサイトを参考にプログラムしました。
(https://watlab-blog.com/2021/08/05/csv-digital-filter/)
エラーメッセージ import numpy as np from scipy import signal import pandas as pd import matplotlib.pyplot as plt # ハイパスフィルタ def highpass(x, samplerate, fp, fs, gpass, gstop): fn = samplerate / 2 #ナイキスト周波数 wp = fp / fn #ナイキスト周波数で通過域端周波数を正規化 ws = fs / fn #ナイキスト周波数で阻止域端周波数を正規化 N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算 b, a = signal.butter(N, Wn, "high") #フィルタ伝達関数の分子と分母を計算 y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける return y # csvから列方向に順次フィルタ処理を行い保存する関数 def csv_filter(in_file, out_file, type): df = pd.read_csv(in_file, encoding='SHIFT-JIS') # ファイル読み込み dt = df.T.iloc[0,1] # 時間刻み # データフレームを初期化 df_filter = pd.DataFrame() df_filter[df.columns[0]] = df.T.iloc[0] # ハイパスの設定----------------------------------------------------------------------------- fp_hp = 520 # 通過域端周波数[Hz] fs_hp = 500 # 阻止域端周波数[Hz] gpass = 3 # 通過域端最大損失[dB] gstop = 40 # 阻止域端最小損失[dB] # 列方向に順次フィルタ処理をするコード for i in range(len(df.T)-1): data = df.T.iloc[i+1] # フィルタ処理するデータ列を抽出 # フィルタ処理の種類を文字列で読み取って適切な関数を選択する if type == 'hp': # ハイパスフィルタを実行 print('wave=', i, ':Highpass.') data = highpass(x=data, samplerate=1 / dt, fp=fp_hp, fs=fs_hp, gpass=gpass, gstop=gstop) else: # 文字列が当てはまらない時はパス(動作テストでフィルタかけたくない時はNoneとか書いて実行するとよい) pass data = pd.Series(data) # dataをPandasシリーズデータへ変換 df_filter[df.columns[i + 1] + '_filter'] = data # 保存用にデータフレームへdataを追加 df_filter.to_csv(out_file) # フィルタ処理の結果をcsvに保存 return df, df_filter # 関数を実行してcsvファイルをフィルタ処理するだけの関数を実行 # type='lp', 'hp', 'bp', 'bs':LowPass, HighPass, BandPass, BandStop df, df_filter = csv_filter(in_file='csv in/signals.csv', out_file='filter.csv', type='hp') # ここからグラフ描画------------------------------------- # フォントの種類とサイズを設定する。 plt.rcParams['font.size'] = 14 plt.rcParams['font.family'] = 'Times New Roman' # 目盛を内側にする。 plt.rcParams['xtick.direction'] = 'in' plt.rcParams['ytick.direction'] = 'in' # グラフの上下左右に目盛線を付ける。 fig = plt.figure(figsize=(10, 7)) ax1 = fig.add_subplot(211) ax1.yaxis.set_ticks_position('both') ax1.xaxis.set_ticks_position('both') ax2 = fig.add_subplot(212) ax2.yaxis.set_ticks_position('both') ax2.xaxis.set_ticks_position('both') # 軸のラベルを設定する。 ax1.set_xlabel('Time [s]') ax1.set_ylabel('Amplitude_Original') ax2.set_xlabel('Time [s]') ax2.set_ylabel('Amplitude_Filtered') # データプロットの準備とともに、ラベルと線の太さ、凡例の設置を行う。 size = len(df.T)-1 for i in range(size): ax1.plot(df.T.iloc[0], df.T.iloc[i+1], label=df.columns[i+1], lw=1) ax2.plot(df_filter.T.iloc[0], df_filter.T.iloc[i + 1], label=df_filter.columns[i + 1], lw=1) ax1.legend() ax2.legend() # レイアウト設定 fig.tight_layout() # グラフを表示する。 plt.show() plt.close() ### 該当のソースコード ```ここに言語名を入力 Python
試したこと
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答2件
あなたの回答
tips
プレビュー