我很难找到使用python / scipy / numpy实现带通或高通滤波器的文档。

我可以轻松创建和应用低通滤波器,因此我问:

对信号进行低通滤波,然后从原始信号中减去结果,以获得仅高频的信号在概念上是否正确?

此外,如果有人在Python中有一个简单的朴素带通滤波器示例(最好使用numpy和scipy库),我将非常感激。

我要找的东西是这样的:

filtered_signal = band_pass(original_signal, rate, low=20, high=500)


任何帮助! br />
import numpy, scipy.signal

def firfilt(interval, freq, sampling_rate):
    nfreq = freq/(0.5*sampling_rate)
    taps =  sampling_rate + 1
    a = 1
    b = scipy.signal.firwin(taps, cutoff=nfreq)
    firstpass = scipy.signal.lfilter(b, a, interval)
    ## second pass to compensate phase delay
    secondpass = scipy.signal.lfilter(b, a, firstpass[::-1])[::-1]
    return secondpass


评论

scipy.signal.firwin的文档介绍了如何制作低通,高通,带通,带阻和多频带滤波器。您是否尝试过firwin(taps,cutoff = nfreq,pass_zero = False)?

有关在扬声器中使用此技术的信息,请参见sound.whsites.net/articles/derived-xovers.htm

#1 楼

从理论上讲,您可以执行此操作,但实际上操作起来很困难,因为时间和相位对齐必须很不错才能起作用。如果对准良好,则会得到您正在寻找的破坏性干扰。如果不是,您将受到一些建设性的干扰。更糟糕的是,它们是相消还是相长干扰都将取决于频率,即您可以同时获得相长和相消干扰。但是,如果您仅滤除相当低的频率,它就可以工作,因为它们的时序要求是最宽松的,因为它们变化太慢。通常只做一个高通滤波器是有意义的。

创建带通滤波器的一种相对直接的方法是创建一个低通滤波器,然后通过乘以将其调制到所需的中心频率它具有该频率的正弦波。

评论


$ \ begingroup $
我倾向于使滤波器通过两次,其中之一反向,以补偿相移。
$ \ endgroup $
– heltonbiker
2012年8月23日在13:33

$ \ begingroup $
@heltonbiker然后,如果您正确地安排了时序,并确保低通滤波器增益为1,那么您应该可以这样做。
$ \ endgroup $
– Jim Clay
2012年8月23日15:19

#2 楼

您可以使用scipy.signal函数直接设计不同的滤波器类型。
通过scipy.signal
软件包,可以使用以下三个主要函数来创建
有限冲激响应滤波器。


signal.remez
signal.firwin
signal.firwin2

remez函数作为自变量使用抽头数
+1),“频段”和“所需”增益。
“频段”以Hz为单位。此功能有点奇怪,因为
“ Hz”参数定义了以Hz为单位的采样率。一个例子
是: br />使图看起来更好一点(仅对可视化点进行插值了)。

低通和高通示例:

br /> firwin函数再次将抽头数和截止值
作为参数。截止值可以是多个值,作为定义带通和阻带滤波器的列表。截止的默认单位是归一化的频率,其中奈奎斯特截止为1,采样率将为2。这可以通过设置/ nyq /进行修改。在上例中,firwin将被称为:

from scipy import signal
b = signal.remez(64, [0, 80, 100, 200, 220, 500], [0, 1, 0], Hz=1000)
plot(20*log10(abs(fft.fft(b, 4096).)))


firwin2更接近于remez函数。但是,不是在频带上传递增益,而是在截止点传递增益。

bl = signal.remez(64, [0, 248, 252, 500], [1, 0], Hz=1000) #lowpass
bh = signal.remez(64, [0, 248, 252, 500], [0, 1], Hz=1000) #highpass


更多示例可在此处

评论


$ \ begingroup $
firwin及其包裹的黄油是我现在正在使用的。谢谢!
$ \ endgroup $
– heltonbiker
2012年8月28日在16:57

$ \ begingroup $
黄油不是firwin的包装材料。黄油是一种IIR滤波器设计方法。 iirdesign函数是通用的IIR滤波器设计工具。黄油,cheby等是Matlab的功能。有关IIR滤波器功能的更多信息,请参见bit.ly/JPS4Zs
$ \ endgroup $
–克里斯托弗·费尔顿(Christopher Felton)
2012年8月28日在17:05



$ \ begingroup $
我想我误会了我在做什么。要检查一下,谢谢(因为我绝对想要FIR滤波器)。
$ \ endgroup $
– heltonbiker
2012年8月28日在17:34

#3 楼

您指出无法确定如何设计合适的高通滤波器。一种方法是首先设计一个低通滤波器原型,然后应用将滤波器响应扭曲到另一种类型的滤波器(例如高通或带通滤波器)中的变换。这可以通过将$ z ^ {-1} $的表达式替换为原型低通滤波器的传递函数来完成。以下是一些有关该主题的信息的链接:


http://www.mathworks.com/help/toolbox/dsp/ug/bsva1v1.html
http:/ /www.ingelec.uns.edu.ar/pds2803/Materiales/Articulos/Constantinides.pdf
http://cnx.org/content/m12759/latest/

专门用于从低通到高通转换,可以应用以下替换:

$$
z ^ {-1} = \ frac {\ alpha + z ^ {-1}} {1 + \ alpha z ^ {-1}},
$$$
$$
\ alpha = \ frac {\ cos \ left(\ frac {1} {2} \ left(\ omega_c-\ omega_c'\ right)\ right)}
{\ cos \ left(\ frac {1} {2} \ left(\ omega_c + \ omega_c'\ right)\ right)}
$$

其中$ \ omega_c $是低通滤波器原型的截止频率,$ \ omega_c'$是变换后的高通滤波器的合成截止频率。第一个链接中显示的MATLAB文档中提供了一些示例。 SciPy中可能有类似的功能。话虽如此,该库中的许多滤波器设计函数都紧跟MATLAB的示例,并且能够轻松设计所有主要类型(低通,高通等)的滤波器。

评论


$ \ begingroup $
感谢您的关注,但是我不得不承认我没有足够的背景来消化您发布的过分的技术/数学信息,我来自生物科学领域,希望得到一个更直接的答案。如果创建高通的工作量相对较小,是否可以发布一些小的工作代码或链接到示例?
$ \ endgroup $
– heltonbiker
2012年8月23日的1:32

$ \ begingroup $
您使用过哪些类型的过滤器?您是否使用SciPy库函数设计它们?
$ \ endgroup $
–Jason R
2012年8月23日在2:19

$ \ begingroup $
我将使用低通编辑问题
$ \ endgroup $
– heltonbiker
2012年8月23日12:21在

$ \ begingroup $
请参阅上面有关您的问题的Endolith的评论。正如他指出的那样,您用来制作滤波器的功能似乎也可以设计高通滤波器。
$ \ endgroup $
–Jason R
2012年8月24日下午3:39