PythonでCSVデータにハイパスフィルタをかけたいが適用されない
解決したいこと
PythonでCSVデータにハイパスフィルタをかけてノイズを除去したい
例)
PythonでCSVデータを解析しています。データを用いてスペクトログラムを作ったところノイズを除去する必要があると考えました。そこで500Hz以下を通さないハイパスフィルタをかけたいと考えてプログラムしたのですが上手くいきません。ですのでご教授いただければと思います。
発生している問題・エラー
エラーは出ておりませんがそもそものデータにフィルタが適用されずデータが生み出されません。
例)
NameError (uninitialized constant World)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2916351/15c4936a-0b94-1ff0-a2ae-fd0bce148826.png)
上記の画像のように下側の画像にはフィルタをかけたものが出てくるはずなのですが出てきていません。
下記のサイトを参考にしました。
https://watlab-blog.com/2021/08/05/csv-digital-filter/
### 該当するソースコード
Python
ソースコードを入力
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()
# ---------------------------------------------------
### 自分で試したこと
1