Python scipy.signal.remez高通滤波器设计产生奇怪的传递函数。

3

我正在使用Python的scipy.signal.remez函数设计等波纹高通滤波器。然而,结果的传输函数看起来对我来说非常奇怪,在通带中具有约15 dB的峰值,只有6 dB的阻带衰减。相应的低通滤波器设计看起来还不错(通带波动约为0.1 dB,阻带衰减约为40 dB):

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# Minimum working example for remez (equiripple) filter designs:
from __future__ import division, print_function
import numpy as np
import scipy.signal as sig
import matplotlib.pyplot as plt
F_PB = 0.1  # corner frequency of pass band
F_SB = 0.15 # corner frequency of stop band
W_PB = 1    # weight factor for pass band 
W_SB = 1    # weight factor for stop band
L = 40 # filter order
#b = sig.remez(L, [0, F_PB, F_SB, 0.5], [1, 0], [W_PB, W_SB], Hz = 1) # low pass
b = sig.remez(L, [0, F_PB, F_SB, 0.5], [0, 1], [W_PB, W_SB], Hz = 1) # high pass
# Calculate H(w), w = 0 ... pi, 1024 Pts.
[w, H] = sig.freqz(b, worN = 1024)
# Translate w to normalized frequencies F = 0 ... 0.5:                   
F = w / (2 * np.pi)   
plt.figure(1)
plt.plot(F, 20 * np.log10(abs(H)))
plt.title(r'Magnitude transfer function in dB')
plt.show()

有人能向我解释一下发生了什么吗?

谢谢,Christian

1个回答

6
对于使用默认 remez 参数 type='bandpass' 的高通滤波器,使用奇数个点。如果使用偶数个点,则 remez 创建一个类型 II 过滤器,在 Nyquist 频率处有一个零点。该算法难以创建具有这种约束条件的高通滤波器。
这是当 L = 41 时增益的绘图:

Remez result, L=41

或者使用偶数次筛选,并且type='hilbert'。以下是使用L=40type='hilbert'得到的结果:

Remez result, L=40, type='hilbert'

请注意,然而在这种情况下,FIR滤波器是第四型--滤波器系数具有奇对称性。

哎呀,我应该知道的……这就解释了为什么偶数阶带阻滤波器也会失败……非常感谢你精确的回答!不幸的是,我不能给你点赞。 - Chipmuenk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接