0

我正在尝试使用 python 中的 scipy 库创建一个带阻巴特沃斯滤波器,你能告诉我我做错了什么吗?fc11750fc24100fs30000ft150。我已经定义了它们(fc是截止频率区间之外的所有内容的并集,并且fc1是时间频率,并且是通带和阻带波纹,是幅度,和是归一化频率)。fc2ftrprsawp(passband)ws(stopband)wn

我的错误:

ValueError: Wn must specify start and stop frequencies for bandpass or bandstop filter.

这就是我到目前为止所拥有的代码: fs = 33000 r = 55 ft = 150 rp = 0.3 rs = 55 order = 3 a=1 fc1 = 1750 fc2 = 4100 fc=np.union1d(np.array([1, 1750]),([4100,10000])) wp = (fc1-ft/2) *2/fs

ws = (fc2 + ft/2) *2/fs

N, wn = sp.buttord(wp, ws, rp, rs)

b, a = sp.butter(N, wn , btype = "bandstop")

w,h = sp.freqz(b, a,  worN=512, plot=None)

f=(fs/2)*w/(np.pi)

plt.figure()

plt.plot(f,abs(h))
4

1 回答 1

0

请考虑改进您的问题,因为fc它的朋友可能是任何东西,因此不清楚您要达到什么目标。
从语法和信号处理的角度来看,需要定义一个带通/带阻滤波器,您应该指定 4 个点,因为该滤波器具有钟形形状。请参考对接参数

wp, ws: 浮动
带阻: wp = [0.1, 0.6],ws = [0.2, 0.5]

所以wp并且ws应该具有 (2,) 的形状。
要使示例中的语法正确,请更改

wp = (fc1-ft/2) *2/fs
ws = (fc2 + ft/2) *2/fs

wp = [(fc1-ft/2) *2/fs, (fc2 + ft) *2/fs]
ws = [(fc1+ft) *2/fs, (fc2 + ft/2) *2/fs]

当然,频率是任意选择的,但请记住,它必须 wp_low < ws_low < ws_high < wp_high使通过范围完全包括停止范围。

于 2020-05-09T08:52:54.473 回答