微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实时高通滤波器

如何解决实时高通滤波器

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被过滤掉了。您只需要提供足够的样本即可使过滤生效:

enter image description here 这里使用 lfilter 而不是 filtfiltenter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。