Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自适应50Hz滤波器_Python_Numpy_Filter - Fatal编程技术网

Python 自适应50Hz滤波器

Python 自适应50Hz滤波器,python,numpy,filter,Python,Numpy,Filter,我使用以下滤波器消除信号上的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

我使用以下滤波器消除信号上的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)
但我仍然能看到50Hz的信号噪音。噪声幅度明显较低,但仍然不够低。有没有人举过一个例子,如何应用自适应滤波器来消除50Hz的网络噪声?或者是否有人有其他的过滤器,或方法来消除50Hz的噪音


我玩过Q,但效果不够好。

你的信号频率是否高于50 Hz?否则这个巴特沃斯低通滤波器呢


你也许可以使用一个带通滤波器,就像这个

那么,使用一个滤波器,你总是可以在信号失真和去除不需要的频率之间取得折衷。根据滤波器衰减系数的不同,滤波后始终会保留某种信号。如果指定为陷波滤波器,巴特沃斯滤波器可以具有几乎100%的衰减。以下是使用巴特沃斯过滤器的效果:

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

滤波器的频率响应在频域(振幅和相位)中是这样的

因此,尽管相位变化平稳,但巴特沃斯滤波器振幅的“陷波”效应也是平稳的

另一方面,
iirnotch
滤波器可以在感兴趣的频率处有一个抽头,但是为了限制失真,它不能达到100%衰减

这是Q=30的iirnotch滤波器滤波前后的信号

和滤波器频率响应:

改变Q将改变50 Hz时的衰减水平和失真。我认为总体而言,如果您的噪声接近或与感兴趣的信号重叠,则最好使用iirnotch,否则
buttwoth
可能是更好的选择

以下是数字的代码:

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()