Полосовой фильтр Баттуорта - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь создать полосовой фильтр Баттуорта, используя библиотеку scipy в python, вы можете сказать мне, что я делаю не так? fc1 - это 1750, fc2 - 4100, fs - 30000 и ft - 150. Я определил их (fc - это объединение всего, что находится за пределами интервала частот среза, fc1 и fc2, ft - это временная частота, rp и rs - это полоса пропускания и пульсации полосы задерживания, a - амплитуда, wp(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))

1 Ответ

0 голосов
/ 09 мая 2020

Пожалуйста, подумайте об улучшении вашего вопроса, поскольку fc и его друзья могут быть кем угодно, и поэтому неясно, чего вы пытаетесь достичь.
С точки зрения синтаксиса и обработки сигналов необходимо определить bandpass / bandstop filter вы должны указать 4 точки, потому что фильтр имеет форму колокола. См. параметры батторда :

wp, ws: float
bandstop: 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, поэтому диапазон пропускания полностью включает диапазон останова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...