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

标签 python filter scipy

我正在尝试使用 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()

谁能给我解释一下这是怎么回事吗?

干杯,克里斯蒂安

最佳答案

对于默认为 remez 的高通滤波器参数type='bandpass',使用奇数个抽头。通过偶数个抽头,remez 创建了一个 II 型滤波器,其奈奎斯特频率为零。该算法很难创建具有这样的约束的高通滤波器。

这是当L = 41时的增益图:

Remez result, L=41

使用偶数次点击,并且type='hilbert'。下面显示了使用 L=40type='hilbert' 获得的结果:

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

但请注意,在这种情况下,FIR 滤波器是 IV 型滤波器——滤波器系数具有奇对称性。

关于Python scipy.signal.remez 高通滤波器设计产生奇怪的传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27754979/

相关文章:

python - Django 数字过滤器模板

python - 为什么我的路线不起作用?

python - ReadFromKafka 抛出 ValueError : Unsupported signal: 2

python - django 标记 - 按标记过滤

image - 滑动 Flutter 时应用彩色滤镜图片

python - NumPy ,1 :M joins on Arrays

numpy - 获取numpy数组模式的最快方法是什么

python - 使用 utf-8 以外的编码在 Python 中解析 XML

typescript - 如何在Typescript中按属性过滤对象类型的联合?

python - 在 python 中将 2D 高斯总和拟合到 2d 数据?