我是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的尖峰(比如仅在信号[质数]处出现尖峰),我仍然能够以正确的幅度正确地过滤它吗?
答案 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)
绘制这个快速结果给出了:
根据您的具体应用,您可以简单地调整增益以恢复2.0和0.5幅度。希望这可以帮助。祝你好运!
答案 1 :(得分:0)
答案很可能没有。
这个直言不讳的答案背后的原因是你的尖峰(值为2)站在信号的顶部。如果你过滤掉任何东西,你的信号幅度可能会在尖峰处发生变化。
如果你可以改变这个:
signal[::120] = 2
到
signal[::120] += 2
然后可以构建这样的过滤器。你想过滤掉什么?低于.0011赫兹的任何东西?