如何用Python实现FIR高通滤波器?

2024-05-08

首先,我在 Stack Exchange 中问了这个问题,我只得到与概念相关的答案,而不是面向实现的答案。所以,我的问题是我正在尝试创建高通滤波器并使用 Python 实现。

from numpy import cos, sin, pi, absolute, arange
from scipy.signal import kaiserord, lfilter, firwin, freqz, firwin2
from pylab import figure, clf, plot, xlabel, ylabel, xlim, ylim, title, grid, axes, show

# Nyquist rate.
nyq_rate = 48000 / 2
# Width of the roll-off region.
width = 500 / nyq_rate
# Attenuation in the stop band.
ripple_db = 12.0
num_of_taps, beta = kaiserord(ripple_db, width)
# Cut-off frequency.
cutoff_hz = 5000.0
# Estimate the filter coefficients.
if num_of_taps % 2 == 0:
    num_of_taps = num_of_taps + 1
taps = firwin(num_of_taps, cutoff_hz/nyq_rate, window=('kaiser', beta), pass_zero='highpass')
w, h = freqz(taps, worN=1024)
plot((w/pi)*nyq_rate, absolute(h), linewidth=2)
xlabel('Frequency (Hz)')
ylabel('Gain')
title('Frequency Response')
ylim(-0.05, 1.05)
grid(True)
show()

通过查看频率响应,我没有得到预期的阻带衰减。我想要 12dB 的衰减,但我没有得到。我究竟做错了什么?


改变pass_zero的论证firwin to False。该参数必须是布尔值(即 True 或 False)。通过将其设置为 False,您将选择滤波器的行为作为高通滤波器(即滤波器不not通过信号的 0 频率)。

这是您的脚本的变体。我添加了水平虚线,显示阻带(青色)中所需的衰减和通带(红色)中所需的纹波范围,具体取决于您的选择ripple_db。我还绘制了垂直虚线(绿色)来指示从阻带到通带的过渡区域。

import numpy as np
from scipy.signal import kaiserord, lfilter, firwin, freqz, firwin2
import matplotlib.pyplot as plt

# Nyquist rate.
nyq_rate = 48000 / 2

# Width of the roll-off region.
width = 500 / nyq_rate

# Attenuation in the stop band.
ripple_db = 12.0

num_of_taps, beta = kaiserord(ripple_db, width)
if num_of_taps % 2 == 0:
    num_of_taps = num_of_taps + 1

# Cut-off frequency.
cutoff_hz = 5000.0

# Estimate the filter coefficients.
taps = firwin(num_of_taps, cutoff_hz/nyq_rate, window=('kaiser', beta), pass_zero=False)

w, h = freqz(taps, worN=4000)

plt.plot((w/np.pi)*nyq_rate, 20*np.log10(np.abs(h)), linewidth=2)

plt.axvline(cutoff_hz + width*nyq_rate, linestyle='--', linewidth=1, color='g')
plt.axvline(cutoff_hz - width*nyq_rate, linestyle='--', linewidth=1, color='g')
plt.axhline(-ripple_db, linestyle='--', linewidth=1, color='c')
delta = 10**(-ripple_db/20)
plt.axhline(20*np.log10(1 + delta), linestyle='--', linewidth=1, color='r')
plt.axhline(20*np.log10(1 - delta), linestyle='--', linewidth=1, color='r')

plt.xlabel('Frequency (Hz)')
plt.ylabel('Gain (dB)')
plt.title('Frequency Response')
plt.ylim(-40, 5)
plt.grid(True)
plt.show()

这是它生成的图。 如果仔细观察,您会发现频率响应接近定义滤波器所需行为的区域的角落。

这是情节ripple_db改为21:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用Python实现FIR高通滤波器? 的相关文章

  • 伽玛分布拟合误差

    对于分类任务 我想将伽玛分布拟合到两对数据 类内和类之间的距离人口 这是为了确定理论错误接受率和错误拒绝率 The fit Scipy returns puzzles me tough A plot of the data is below
  • “scipy.misc”没有属性“imsave”

    当我尝试使用 Scipy misc imsave path image 保存图像时 我收到此错误 模块 scipy misc 没有属性 我正在使用 Ubuntu 17 10 并且安装了 Pillow 和 scipy 你能帮我吗 scipy
  • 在 MATLAB 中高效地形成动态窗口

    有人可以帮助我提供一种有效的方法 或者帮助我执行提供的代码 以尽可能少的步骤获得相同的结果 我将感激你 我有一个原始数组 A 1 1 1 4 3 4 5 4 4 3 3 1 0 0 2 6 2 6 3 6 6 2 7 4 8 7 2 2 2
  • Numpy:导入错误:无法导入名称测试用例

    我安装了 numpy sudo apt get install numpy 然后在 python2 7 中导入 numpy import numpy 我收到这个错误 Traceback most recent call last File
  • Python 中 scipy/numpy 中的 exp 溢出?

    出现以下错误是什么意思 Warning overflow encountered in exp 在 scipy numpy 中使用 Python 一般意味着什么 我正在计算对数形式的比率 即 log a log b 然后使用 exp 取结果
  • 如何使用 OR 逻辑(而不是 AND)过滤表列

    小提琴示例 http jsfiddle net fks37 我有一个 html 表 A B C D 0 1 0 1 0 1 0 0 1 0 0 1 我要过滤non zero列 使用 jQuery dataTables 不是硬性要求 只是我当
  • 如何使用 Misc.imread 将图像分割为红色、绿色和蓝色通道

    我正在尝试将图像切片为 RGB 但在绘制这些图像时遇到问题 我使用此函数从某个文件夹获取所有图像 def get images path image type image list for filename in glob glob pat
  • Scipy 最小化 fmin - 语法问题

    我有一个函数 它接受多个参数 一个数组和两个浮点数 并返回一个标量 浮点数 现在我想通过改变两个参数来最小化这个函数 两个浮点数 该数组在函数内部 解包 然后使用其内容 数组和浮点数 如何使用 SciPy 的 fmin 函数来完成此操作 我
  • scipy.sparse.hstack(([1], [2])) ->“ValueError:块必须是二维的”。为什么?

    scipy sparse hstack 1 2 and scipy sparse hstack 1 2 工作得很好 但不是scipy sparse hstack 1 2 为什么会这样呢 这是我的系统上发生的情况的痕迹 C Anaconda
  • 在 Django Rest Framework 中过滤多个值

    我有一个模型想要过滤多个值 我的模型 class Product models Model ean models CharField max length 13 unique True product id models CharField
  • 在 Python 中倾斜数组

    我有一个 2D 数组 我将使用它保存为灰度图像scipy misc toimage 在此之前 我想将图像倾斜给定角度 像这样进行插值scipy ndimage interpolation rotate 上图只是为了说明倾斜过程 我知道我必须
  • Elasticsearch 数组必须和must_not

    我的 elasticsearch 数据库中有一个如下所示的文档 tags gt tag 1 tag 2 tag 3 tag A created at gt 2013 07 02 12 42 19 UTC label gt Mon super
  • 约束 3D 表面的 RBF 插值以保持曲率

    我的任务是开发一种算法 给定一组表示现有表面测量值的稀疏点 我们就可以计算表面上任何点的 z 坐标 面临的挑战是找到一种合适的插值方法 该方法可以在仅给定几个点的情况下重新创建 3D 表面 并推断出超出包含初始测量值的范围的值 对于许多插值
  • SciPy 曲线拟合参数的方差到底是多少? (Python)

    我目前正在 Python 中使用 scipy optimize 包的 curve fit 函数 并且知道 如果取从 curve fit 获得的协方差矩阵的对角线条目的平方根 您将获得 curve fit 参数的标准偏差计算出来的 我不确定这
  • NumPy 和 SciPy - .todense() 和 .toarray() 之间的区别

    我想知道使用是否有什么区别 优点 缺点 toarray vs todense 在稀疏 NumPy 数组上 例如 import scipy as sp import numpy as np sparse m sp sparse bsr mat
  • 我可以使用 HTTP 范围标头“有意”加载部分文件吗?

    我正在研究 HTTP 范围标头 specs http www w3 org Protocols rfc2616 rfc2616 sec14 html sec14 16 据我了解 我可以设置文件的字节范围ala 0 199 2000 200
  • 使用时间、日期、时间增量

    我有一个问题 我的工作时间和时差很多 到目前为止 我已经使用许多 if 语句解决了这个问题 但这些语句很容易出错 在寻找更好的解决方案并且无需重新发明轮子的过程中 我遇到了时间 日期和时间增量 但这些对我来说似乎太不灵活了 所以我正在寻找如
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助

随机推荐