実現したいこと
高いサンプルレートでのバンドパスフィルタの実装をしたい
前提
Pythonを使って波形に対して、バンドパスフィルタの実装を試みています。しかし、低いサンプルレート(200000)ではフィルタを実装する関数が値を返し、バンドパスフィルタ実装後のグラフを表示するのですが、高いサンプルレート(1000000)の場合、関数が値を返す際にnanだけの入った値を返し、グラフを表示しません。この原因と解決方法を教えていただけないでしょうか?初めての質問なので質問の構成がおかしい部分もあるかもしれませんがよろしくお願いいたします。
発生している問題・エラーメッセージ
samplerate = 200000 の場合
y = [1.08292973 1.12968327 1.17403911 ... 0.0338634 0.02992575 0.02627729]
samplerate = 1000000 の場合
y = [nan nan nan ... nan nan nan]
該当のソースコード
Python
1import numpy as np 2from scipy import signal 3from matplotlib import pyplot as plt 4 5def bandpass(x, samplerate, fp, fs, gpass, gstop):6 fn = samplerate / 2 #ナイキスト周波数7 wp = fp / fn #ナイキスト周波数で通過域端周波数を正規化8 ws = fs / fn #ナイキスト周波数で阻止域端周波数を正規化9 N, Wn = signal.buttord(wp, ws, gpass, gstop) #オーダーとバターワースの正規化周波数を計算10 b, a = signal.butter(N, Wn, "band") #フィルタ伝達関数の分子と分母を計算11 print("b = "+str(b))12 print("a = "+str(a))13 y = signal.filtfilt(b, a, x) #信号に対してフィルタをかける14 print("y = "+str(y))15 return y 16 17samplerate = 100000018fl=200 # 阻止帯域下側の信号19fh=8000 # 阻止帯域下側の信号20fb=2000 # 通過帯域の信号21 22x = np.arange(0, 262144) / samplerate # 波形生成のための時間軸の作成23data = np.random.normal(loc=0, scale=1, size=len(x)) # ガウシアンノイズを生成24data2= np.sin(2*np.pi*fl*x)+np.sin(2*np.pi*fh*x)+np.sin(2*np.pi*fb*x) # 阻止帯域と通過帯域の信号生成25data3=data+data2 26 27fp = np.array([1000,3000]) # 通過域端周波数[Hz]28fs = np.array([500,6000]) # 阻止域端周波数[Hz]29gpass = 3 # 通過域端最大損失[dB]30gstop = 40# 阻止域端最小損失[dB]31 32# バンドパスをする関数を実行33data_bandfilt = bandpass(data3, samplerate, fp, fs, gpass, gstop)34plt.plot(x,data3)35plt.plot(x,data_bandfilt,'r')36plt.legend(['Raw','Bandpass'])
試したこと
関数が正常に作動していなかったので、どの部分で動きがおかしくなっているかを確かめたところ、yを返す際の配列がおかしくなっていました。下に実行したときの結果を示します。
samplerate = 200000 の場合
b = [ 2.77531981e-08 0.00000000e+00 -1.38765991e-07 0.00000000e+00
2.77531981e-07 0.00000000e+00 -2.77531981e-07 0.00000000e+00
1.38765991e-07 0.00000000e+00 -2.77531981e-08]
a = [ 1. -9.78208064 43.07619829 -112.45070961 192.7165266
-226.55918109 185.03112425 -103.66071203 38.12555533 -8.31261898
0.81589788]
y = [1.08292973 1.12968327 1.17403911 ... 0.0338634 0.02992575 0.02627729]
samplerate = 1000000 の場合
b = [ 9.61887856e-12 0.00000000e+00 -4.80943928e-11 0.00000000e+00
9.61887856e-11 0.00000000e+00 -9.61887856e-11 0.00000000e+00
4.80943928e-11 0.00000000e+00 -9.61887856e-12]
a = [ 1. -9.95872536 44.62996376 -118.52556687 206.57291393
-246.87915392 204.8988339 -116.6122744 43.55368222 -9.63980451
0.96013126]
y = [nan nan nan ... nan nan nan]

0 コメント