閲覧いただきありがとうございます.
PythonでFIRフィルタを設計しようとしています.
# coding: utf-8 import csv import numpy as np from scipy import signal import matplotlib.pyplot as plt import pandas as pd #csvファイルの読み込み data = pd.read_csv('out3.csv') #csvファイルの読み込み # サンプルデータ n = len(data) # データ数 dt = 0.05 # サンプリング間隔 fn = 1/(2*dt) # ナイキスト周波数 t = data.iloc[:,0] t1 = np.array(t) y = data.iloc[:,2] z = np.array(y) # パラメータ設定 fp = 2 # 通過域端周波数[Hz] fs = 3 # 阻止域端周波数[Hz] gpass = 1 # 通過域最大損失量[dB] gstop = 40 # 阻止域最小減衰量[dB] # 正規化 Wp = fp/fn Ws = fs/fn # ローパスフィルタで波形整形 # バターワースフィルタ N, Wn = signal.buttord(Wp, Ws, gpass, gstop) b1, a1 = signal.butter(N, Wn, "low") y1 = signal.filtfilt(b1, a1, z) # FIR フィルタ a2 = 1 numtaps = n b2 = signal.firwin(numtaps, Wp, window="hann") y2 = signal.lfilter(b2, a2, z) delay = (numtaps-1)/2*dt # プロット plt.figure() plt.plot(t1, z, "b") plt.plot(t1, y1, "r", linewidth=2, label="butter") plt.plot(t1-delay, y2, "g", linewidth=2, label="fir") plt.xlim(0, 25) plt.legend(loc="upper right") plt.xlabel("Time [s]") t.ylabel("Amplitude") # plt.show()
このプログラムを実行すると図のようにFIRフィルタの時間がずれてしまいます.これを修正するにはどうしたらよいでしょうか?
よろしくお願いします.
(私はFIRフィルタの原理等は一切わかりません。ので、的外れでしたらすみません。) 直感ですが、plt.plot(t1-delay, y2, "g", linewidth=2, label="fir")の中の-delayによって範囲が変更されているのが原因だと考えられます。そもそもこれは意図した結果という可能性はないのでしょうか?(つまり、本来ずれるべきところを、「ずれている」と認識しているのではないか?という意味です。) そのあたり(ほしい結果はどういうものかなど)を明記していただけると幸いです。 近似曲線等があるならば話は別ですが、読み込んだデータならばそれ以上どうしようもない気がします。
ご指摘ありがとうございます.緑のfirも赤色のbutterの曲線になるような結果がほしいです.(曲線がほぼ重なり合う)恐らくフィルタの原理をあまり理解していないかもしれません.自分でも,もう少し考えてみたいと思います.
そもそもなぜdelay入れているんですか?