当前位置: 首页 > 知识库问答 >
问题:

自适应50Hz滤波器

能翔宇
2023-03-14

我应用以下滤波器来去除信号上的50Hz净噪声:

#python code
def filter_50(signal):
    for i in np.arange(50,500,50):
        fs = 1000.0  # Sample frequency (Hz)
        f0 = i  # Frequency to be removed from signal (Hz)
        w0 = f0 / (fs / 2)  # Normalized Frequency
        Q= 30
        b, a = iirnotch(w0, Q)
        signal = scipy.signal.filtfilt(b, a, signal)
    return(signal)

我用Q玩过,但它不够好。

共有1个答案

汤飞
2023-03-14

嗯,使用滤波器,你总是在信号失真和去除不需要的频率之间折衷。滤波后总会有某种信号剩余,这取决于滤波器衰减系数。如果指定为陷波滤波器,巴特沃思滤波器可以有几乎100%的衰减。下面是使用巴特沃斯滤波器的效果:

这显示的原始信号是50赫兹,目标是如果滤波器足够好,我们应该看不到任何信号滤波后。然而,在使用带宽为15 Hz的二阶巴特沃斯滤波器后,我们确实看到了一些信号,尤其是在信号的开始和结束时,这是由于滤波器失真造成的。

并且滤波器的频率响应在频域(幅度和相位)看起来是这样的。

因此,虽然相位变化平滑,但巴特沃斯滤波器幅度的“陷波”效应也是平滑的。

改变Q将改变50赫兹的衰减水平和失真。我认为总的来说,如果您的噪声接近或重叠感兴趣的信号,使用iirnotch是一个好主意,否则Butterwoth可能是一个更好的选择。

以下是这些数字的代码:

from scipy.signal import filtfilt, iirnotch, freqz, butter
from scipy.fftpack import fft, fftshift, fftfreq
import numpy as np
from matplotlib import pyplot


def do_fft(y, fs):
    Y = fftshift(fft(y, 2 ** 12))
    f = fftshift(fftfreq(2 ** 12, 1 / fs))
    return f, Y


def make_signal(fs, f0, T=250e-3):
    # T is total signal time
    t = np.arange(0, T, 1 / fs)
    y = np.sin(2 * np.pi * f0 * t)
    return t, y


def make_plot():
    fig, ax = pyplot.subplots(1, 2)
    ax[0].plot(t, y)
    ax[0].plot(t, y_filt)
    ax[0].set_title('Time domain')
    ax[0].set_xlabel('time [seconds]')
    ax[1].plot(f, abs(Y))
    ax[1].plot(f, abs(Y_filt))
    ax[1].set_title('Frequency domain')
    ax[1].set_xlabel('Freq [Hz]')

    # filter response
    fig, ax = pyplot.subplots(1, 2)
    ax[0].plot(filt_freq, abs(h))
    ax[0].set_title('Amplitude')
    ax[0].set_xlim([0, 200])
    ax[0].set_xlabel('Freq [Hz]')
    ax[1].plot(filt_freq, np.unwrap(np.angle(h)) * 180 / np.pi)
    ax[1].set_title('Phase')
    ax[1].set_xlim([0, 200])
    ax[1].set_xlabel('Freq [Hz]')

    pyplot.show()


fs = 1000
f0 = 50
t, y = make_signal(fs=fs, f0=f0)
f, Y = do_fft(y, fs=1000)

# Filtering using iirnotch
w0 = f0/(fs/2)
Q = 30
b, a = iirnotch(w0, Q)

# filter response
w, h = freqz(b, a)
filt_freq = w*fs/(2*np.pi)
y_filt = filtfilt(b, a, y)
f, Y_filt = do_fft(y_filt, fs)

make_plot()


w0 = [(f0-15)/(fs/2), (f0+15)/(fs/2)]
b, a = butter(2, w0, btype='bandstop')
w, h = freqz(b, a)
filt_freq = w*fs/(2*np.pi)
y_filt = filtfilt(b, a, y)
f, Y_filt = do_fft(y_filt, fs)
make_plot()
 类似资料:
  • 使用自适应广角滤镜校正由于使用广角镜头而造成的镜头扭曲。您可以快速拉直在全景图或采用鱼眼镜头和广角镜头拍摄的照片中看起来弯曲的线条。例如,建筑物在使用广角镜头拍摄时会看起来向内倾斜。 滤镜可以检测相机和镜头型号,并使用镜头特性拉直图像。您可以添加多个约束,以指示图片的不同部分中的直线。使用有关自适应广角滤镜的此信息,消除扭曲。 您也可以对不包含相机和镜头信息的图像使用此滤镜,但这是额外的工作。 如

  • 我对验证FIR滤波器感兴趣。我已经实现了一个移动平均FIR滤波器,并编写了几个刺激来验证。 第一个刺激是一个正弦波,我希望滤波器按原样通过。档案员有。第二个刺激,我只传递一个冲动,并期望协效出现在输出上。这是我实际看到的。 然而,我觉得有两个问题需要注意。首先,不能依赖于波形形状来判断滤波器是否工作。我必须有可量化的值,并使用它作为一个基础,以得出结论,如果过滤器是工作的。例如。信噪比... 以下

  • 我有个问题。在常见的购物车网站有功能搜索产品与多个过滤器。例如,我正在搜索运动装备与一些过滤器,如: > 制造商 [x]耐克 阿迪达斯 茵宝 选项 尺寸 [x]s [x]M L [x]白色 黄色 红色 [x]蓝色 这是我的地图 部分测试数据 有了这个查询,一切都很好 但是,如果我在选项过滤器中添加更多的条件,我没有得到结果 我不知道我在映射或查询中是否错了,或者您能告诉我在这种情况下创建映射的最佳

  • 我想要一种影响swagger输出留档的方法。问题是询问文档的用户只能对swagger中描述的一些方法拥有权限,所以我想从输出中排除特定方法。我认为最糟糕的方法是通过中间件捕获swagger.json请求,然后检查被请求的用户可以访问哪些方法并排除必要的路径。但是我不太喜欢它,所以可能有内置功能来做到这一点?

  • 因此,我成功地在所有列出的日志中获得了警报日志(由于根已经在INFO中,所以大量的工作都是徒劳的)。但我真正想要的是,现在只在我的新appender上获得来自某个特定类的信息。 我不确定我已经很好地描述了这一点,而且我不了解log4j,所以如果需要,请要求澄清。这个难题与限制我的新appender警告和更大有关,除了我还想要一个特定类的Info。这个类的这些信息也应该发送到父记录器通常记录信息的每