如何解决实时高通滤波器
Hi 在 this 之后实现了高通滤波器。但是,我的数据不是预定义的,而且都是实时的。我不确定这是否正确。
def sine_generator(fs,sinefreq,duration):
T = duration
nsamples = int(fs * T)
w = 2. * np.pi * sinefreq
t_sine = np.linspace(0,T,nsamples,endpoint=False)
y_sine = np.sin(w * t_sine)
result = pd.DataFrame({
'sine' : y_sine},index=t_sine)
return result
def butter_highpass(cutoff,fs,order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
print("Filter order is ={},normalized cutoff ={}".format(order,normal_cutoff))
b,a = signal.butter(order,normal_cutoff,btype='high',analog=False)
print(b,a)
return b,a
# signal generation
sampling_freq = int(1e5)
cutoff_freq = 100/2*np.pi
duration = .01
data = sine_generator(sampling_freq,10,duration)
data['sine'] = 0.1*data['sine'] + 0.2*sine_generator(sampling_freq,int(1e3),duration)['sine'] + 0.2
t = 7 # signal.filtfilt requires atleast t values to filter. t increases as the order increases
b,a = butter_highpass(cutoff_freq,sampling_freq,order=1)
for i in range(np.shape(data.sine.values)[0]-t):
d = data.sine.values[i:i+t+1]
y = signal.filtfilt(b,a,d)
print(y)
我认为这不是正确的方法。
解决方法
如果您想过滤即将到来的数据,您必须使用过去和现在的样本应用带有过滤系数的差分方程。
查看详情:https://www.dsprelated.com/freebooks/filters/Difference_Equation_I.html
但是如果您已经将这些保存的数据保存到缓冲区数组中,那么您只需在 python 中使用 signal.lfilter(b,a,input_data) 即可。
,我们来看看数据。在这里,我绘制了整个正弦波数据集以及高通滤波的结果:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
def sine_generator(fs,sinefreq,duration):
T = duration
nsamples = int(fs * T)
w = 2. * np.pi * sinefreq
t_sine = np.linspace(0,T,nsamples,endpoint=False)
y_sine = np.sin(w * t_sine)
return y_sine
def butter_highpass(cutoff,fs,order=5):
nyq = 0.5 * fs
normal_cutoff = cutoff / nyq
print("Filter order is ={},Normalized cutoff ={}".format(order,normal_cutoff))
b,a = signal.butter(order,normal_cutoff,btype='high',analog=False)
print(b,a)
return b,a
# signal generation
sampling_freq = int(1e5)
cutoff_freq = 100/2*np.pi
duration = .01
data = sine_generator(sampling_freq,10,duration)
data = 0.1*data + 0.2*sine_generator(sampling_freq,int(1e3),duration) + 0.2
plt.plot(data)
t = 7 # signal.filtfilt requires atleast t values to filter. t increases as the order increases
b,a = butter_highpass(cutoff_freq,sampling_freq,order=1)
result = signal.filtfilt( b,data )
plt.plot(result)
plt.show()
这是结果,原来的蓝色,过滤了黄色,表明DC被过滤掉了。您只需要提供足够的样本即可使过滤生效:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。