如何过滤非周期性函数

时间:2014-06-20 14:51:15

标签: python numpy filtering

我是Python编程的新手,我想知道是否有办法为周期函数创建一个高通滤波器,如下所示:

import numpy as np
from scipy.signal import lfilter, firwin, butter
from pylab import figure, plot, show
sample_rate = .0167
nsamples = 480

F_1Hz = 1.38e-4
A_1Hz = 1.0

F_15Hz = .0011
A_15Hz = .5

t = np.arange(nsamples) / sample_rate
signal = A_1Hz * np.sin(2*np.pi*F_1Hz*t) + A_15Hz*np.sin(2*np.pi*F_15Hz*t)
signal[::120] = 2
figure(1)
plot(t,signal,'b')
show()

我希望在某些位置保持较高的频率(.0011 Hz)以及2的尖峰,但是.0011 Hz的幅度需要保持在.5并且尖峰需要保持在幅度2,所以正常化不是一种选择。此外,如果我使该函数以非周期性间隔具有2的尖峰(比如仅在信号[质数]处出现尖峰),我仍然能够以正确的幅度正确地过滤它吗?

2 个答案:

答案 0 :(得分:1)

一种可能性是使用自定义高通滤波器。制作高通滤波​​器的一种简单方法是从低通滤波器开始:

def lp_win_sinc(tw, fc, n):
    m = int(np.ceil( 2./tw) * 2) 
    samps = np.arange(m+1)

    shift = samps - m/2
    shift[m/2] = 1
    h = np.sin(2 * np.pi * fc * shift)/shift
    h[m/2] = 2 * np.pi * fc
    h = h * np.blackman(m+1)
    h = h / h.sum()
    s = np.zeros(n)
    s[:len(h)] = h
    return np.roll(s, -m/2)

然后构造一个简单的高通

def hp_win_sinc(tw, fc, n):
    hp = -lp_win_sinc(tw, fc, n)
    hp[0] = hp[0] + 1
    return hp

(背后的想法可以在http://www.dspguide.com/pdfbook.htm中找到,请看有关windowed-sinc过滤器的章节。)

注意:这些是各个滤波器的脉冲响应。要将它们应用于您的数据,您可以将脉冲与您的数据进行卷积,或者您可以将数据和脉冲响应归结为其产品的逆fft。在你的情况下,例如

hp = hp_win_sinc(0.2, 0.001, len(signal))
f_hp = np.fft.rfft(hp)
f_d = np.fft.rfft(signal)
filt_sig = np.fft.irfft( f_hp * f_d)

绘制这个快速结果给出了:

filtered data

根据您的具体应用,您可以简单地调整增益以恢复2.0和0.5幅度。希望这可以帮助。祝你好运!

答案 1 :(得分:0)

答案很可能没有。

这个直言不讳的答案背后的原因是你的尖峰(值为2)站在信号的顶部。如果你过滤掉任何东西,你的信号幅度可能会在尖峰处发生变化。

如果你可以改变这个:

signal[::120] = 2

signal[::120] += 2
然后可以构建这样的过滤器。你想过滤掉什么?低于.0011赫兹的任何东西?