巴特沃斯滤波器——python实现

butter()函数是求Butterworth数字滤波器的系数向量,在求出系数后对信号进行滤波时需要用scipy.signal.filtfilt()。
需要安装scipy包。

函数butter()

设计滤波器就是设计滤波器系数[B,A]。
[b,a]=butter(n,Wn),根据阶数n和归一化截止频率Wn计算ButterWorth滤波器分子分母系数(b为分子系数的矢量形式,a为分母系数的矢量形式)。

[B,A] = BUTTER(N,Wn,‘high’) 高通滤波器
[B,A] = BUTTER(N,Wn,‘low’) 低通滤波器
[B,A] = BUTTER(N,Wn,‘stop’) 带阻滤波器 Wn = [W1 W2].
[B,A] = BUTTER(N,Wn) 带通滤波器
带通滤波器:它允许一定频段的信号通过,抑制低于或高于该频段的信号、干扰和噪声;
带阻滤波器:它抑制一定频段内的信号,允许该频段以外的信号通过。

其中Wn是归一化频率,具体计算方法是(2*截止频率)/采样频率(也就是除以fs/2)。
当设计低通和高通时,Wn是一个值,表示截止频率;
当设计带通和带阻时,Wn是一个二个元素的数组,表示通带或阻带的上下截止频率。频率的归一化是对fs/2进行归一。
对于原始信号x。
比如说你的采样频率fs=1000Hz,设计一个8阶、通带为fc1=100,fc2=200Hz的带通滤波器:
[b,a]=butter(8,[0.2 0.4])=butter(8,fc1/fa fc2/fa])
这里fa=fs/2,fa是分析频率
得到滤波器系数后,就可以直接用了。
y=filter(B,A,x)

scipy.signal.butter(N, Wn, btype=‘low’, analog=False, output=‘ba’)

输入参数:
N:滤波器的阶数
Wn:归一化截止频率
。计算公式Wn=2*截止频率/采样频率。(注意:根据采样定理,采样频率要大于两倍的信号本身最大的频率,才能还原信号。截止频率一定小于信号本身最大的频率,所以Wn一定在0和1之间)。当构造带通滤波器或者带阻滤波器时,Wn为长度为2的列表。

btype : 滤波器类型{‘lowpass’, ‘highpass’, ‘bandpass’, ‘bandstop’},

output : 输出类型{‘ba’, ‘zpk’, ‘sos’},

输出参数:

b,a: IIR滤波器的分子(b)和分母(a)多项式系数向量。output=‘ba’

z,p,k: IIR滤波器传递函数的零点、极点和系统增益. output= ‘zpk’

sos: IIR滤波器的二阶截面表示。output= ‘sos’

函数scipy.signal.filtfilt()

scipy.signal.filtfilt(b, a, x, axis=-1, padtype=‘odd’, padlen=None, method=‘pad’, irlen=None**)**

输入参数:
b: 滤波器的分子系数向量
a: 滤波器的分母系数向量
x: 要过滤的数据数组。(array型)

(以下参数可以省略)
axis: 指定要过滤的数据数组x的轴

padtype: 必须是“奇数”、“偶数”、“常数”或“无”。这决定了用于过滤器应用的填充信号的扩展类型。{‘odd’, ‘even’, ‘constant’, None}

padlen:在应用滤波器之前在轴两端延伸X的元素数目。此值必须小于要滤波元素个数- 1。(int型或None)

method:确定处理信号边缘的方法。当method为“pad”时,填充信号;填充类型padtype和padlen决定,irlen被忽略。当method为“gust”时,使用古斯塔夫森方法,而忽略padtype和padlen。{“pad” ,“gust”}

irlen:当method为“gust”时,irlen指定滤波器的脉冲响应的长度。如果irlen是None,则脉冲响应的任何部分都被忽略。对于长信号,指定irlen可以显著改善滤波器的性能。(int型或None)

输出参数:
y:滤波后的数据数组

带通滤波代码:

import numpy as np
from scipy.signal import butter, filtfilt


def butter_bandpass_filter(data, lowcut, highcut, fs, order=5):
    fa = 0.5 * fs
    low = lowcut / fa
    high = highcut / fa
    b, a = butter(order, [low, high], btype='band')
    y = filtfilt(b, a, data)
    return y


# 生成噪声信号
fs = 1000  # 采样率
t = np.arange(0, 1, 1/fs)  # 时间序列

x = 5*np.sin(2*np.pi*50*t) + 2*np.sin(2*np.pi*120*t) + 0.5*np.sin(2*np.pi*200*t)
noise = 0.5*np.random.randn(len(t))
y = x + noise

# 设计巴特沃斯滤波器,滤除50 Hz以下和200 Hz以上的信号
filtered_signal = butter_bandpass_filter(x, 50, 200, fs, order=6)





# 绘制原始信号和滤波后的信号的频谱图和波形图
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq

# 频谱图
fig, axs = plt.subplots(2, 1)
axs[0].plot(t, y, 'b', label='raw signal')
axs[0].plot(t, filtered_signal, 'g', linewidth=2, label='filtered signal')
axs[0].set_xlabel('Time [s]')
axs[0].set_ylabel('Amplitude')
axs[0].legend()

n = len(y)
f = fftfreq(n, 1/fs)
Y = fft(y)/n
filtered_Y = fft(filtered_signal)/n
axs[1].semilogy(f[:n//2], np.abs(Y[:n//2]), 'b', label='raw signal')
axs[1].semilogy(f[:n//2], np.abs(filtered_Y[:n//2]), 'g', linewidth=2, label='filtered signal')
axs[1].set_xlabel('Frequency [Hz]')
axs[1].set_ylabel('Amplitude')
axs[1].legend()
plt.show()

# 波形图
plt.plot(t, y, 'b', label='raw signal')
plt.plot(t, filtered_signal, 'g', linewidth=2, label='filtered signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.legend()
plt.show()

低通滤波代码:

from scipy.signal import butter, filtfilt
import pandas as pd
from pylab import *
import mplcursors
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
#显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']


def filter_data(WK):
    N = 4  # Filter order
    Wn = 0.11  # Cutoff frequency
    B, A = butter(N, Wn, output='ba')
    smooth_data = filtfilt(B, A, WK)
    return smooth_data

df = pd.read_csv('PL19-3-E35ST11.csv')

plt.subplot(1, 2, 1)
x = df['PROD_TIME']
y = df['PUMP_CURRENT']
plt.title("滤波前", fontsize=8)
plt.plot(x, y, c="g", label="CURRENT")
plt.ylabel("PUMP_CURRENT")
plt.xlabel("PROD_TIME")

plt.gca().xaxis.set_major_locator(MultipleLocator(df.shape[0]/10))
plt.tick_params(axis='x', rotation=45)
plt.legend()


plt.subplot(1, 2, 2)
x = df['PROD_TIME']
y = df['PUMP_CURRENT']
y2 = filter_data(y)
plt.title("滤波后", fontsize=8)
plt.plot(x, y2, c="r", label="CURRENT")
plt.ylabel("PUMP_CURRENT")
plt.xlabel("PROD_TIME")

plt.gca().xaxis.set_major_locator(MultipleLocator(df.shape[0]/10))
plt.tick_params(axis='x', rotation=45)
plt.legend()


# 放大拖动功能
# enable zooming on both subplots
mplcursors.cursor(hover=True).connect("add", lambda sel: dir(sel))
plt.tight_layout(pad=1.08)
# 显示图像
plt.show()

在这里插入图片描述

  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 巴特沃斯滤波器是一种常用于信号处理的滤波器。它的设计基于巴特沃斯滤波器的数学模型,该模型可以在频域中实现对信号的平滑处理。Python提供了多种方法来实现巴特沃斯滤波器。 在Python中,可以使用第三方库scipy来实现巴特沃斯滤波器。首先,需要导入scipy库的signal模块。然后,可以使用signal.butter函数来设计滤波器。 signal.butter函数的第一个参数是滤波器的阶数,第二个和第三个参数分别是低通和高通滤波器的截止频率,可以用列表或标量进行指定。第四个参数是滤波器类型,可以是'lowpass'、'highpass'、'bandpass'或'bandstop',用于选择滤波器类型。函数的返回值是巴特沃斯滤波器的传递函数系数。 接下来,可以使用signal.filtfilt函数来应用巴特沃斯滤波器。filtfilt函数的第一个参数是巴特沃斯滤波器的传递函数系数,第二个参数是输入信号,可以是一维数组或多维数组。函数的返回值是滤波后的信号。 下面是一个简单的例子,展示了如何在Python实现巴特沃斯滤波器: ```python import numpy as np from scipy import signal # 设计巴特沃斯滤波器 order = 4 # 滤波器阶数 lowcut = 0.2 # 低通滤波器截止频率 highcut = 0.3 # 高通滤波器截止频率 fs = 1.0 # 采样频率 nyquist = 0.5 * fs low = lowcut / nyquist high = highcut / nyquist b, a = signal.butter(order, [low, high], btype='band') # 输入信号 t = np.linspace(0, 1, 1000, endpoint=False) x = np.sin(2*np.pi*0.5*t) + 0.5*np.sin(2*np.pi*2.5*t) # 应用滤波器 filtered_signal = signal.filtfilt(b, a, x) # 打印结果 print(filtered_signal) ``` 上述代码中,我们设计了一个2到3Hz的带通滤波器,并将其应用于一个包含两个频率分量的输入信号。最后,打印出了滤波后的信号。 这就是使用Python实现巴特沃斯滤波器的方法。通过使用scipy库提供的函数,可以轻松地将巴特沃斯滤波器应用于信号处理。 ### 回答2: 巴特沃斯滤波器是一种常用的滤波器,用于将信号中的某些频率成分滤除或增强。它的特点是具有较为平坦的通带,能够实现较为精确的滤波效果。 在Python中,可以使用scipy库中的signal模块来实现巴特沃斯滤波器。主要通过调用`scipy.signal.butter`函数来生成滤波器的系数,然后使用`scipy.signal.lfilter`函数进行滤波处理。 首先,需要导入相应的库: ```python import numpy as np from scipy import signal ``` 接下来,可以定义一个函数来实现巴特沃斯滤波器的滤波过程。假设需要滤波的信号是x,采样率是fs,通过设置截止频率lowcut和highcut来确定通带范围。 ```python def butter_bandpass(lowcut, highcut, fs, order=5): nyquist = 0.5 * fs low = lowcut / nyquist high = highcut / nyquist b, a = signal.butter(order, [low, high], btype='band') return b, a def butter_bandpass_filter(data, lowcut, highcut, fs, order=5): b, a = butter_bandpass(lowcut, highcut, fs, order=order) filtered_data = signal.lfilter(b, a, data) return filtered_data ``` 然后,可以加载需要滤波的信号,并调用`butter_bandpass_filter`函数进行滤波处理。 ```python # 示例:加载信号并滤波 data = np.loadtxt("signal.txt") # 加载信号数据 fs = 1000 # 采样率 lowcut = 10 # 低频截止频率 highcut = 100 # 高频截止频率 filtered_data = butter_bandpass_filter(data, lowcut, highcut, fs) ``` 以上是巴特沃斯滤波器Python中的简要实现步骤,通过调整截止频率和滤波器阶数,可以实现不同的滤波效果。请注意,滤波器的阶数越高,滤波效果越好,但计算复杂度也会增加。 ### 回答3: 巴特沃斯滤波器是一种常见的数字滤波器,用于对信号进行滤波处理。它基于巴特沃斯滤波器设计方法,其特点是在滤波型式和性能指标之间找到了一个最佳的平衡。 在使用Python进行巴特沃斯滤波器设计时,可以使用scipy库中的signal模块来实现。首先,我们需要导入相应的库。 ```python import scipy.signal as signal import numpy as np import matplotlib.pyplot as plt ``` 接下来,我们可以定义巴特沃斯滤波器的一些参数,如采样频率、截止频率等。 ```python fs = 1000.0 # 采样频率 nyquist = 0.5 * fs cutoff = 50.0 # 截止频率 order = 4 # 滤波器阶数 ``` 接下来,可以使用signal.butter函数来设计巴特沃斯滤波器。 ```python b, a = signal.butter(order, cutoff/nyquist, btype='low', analog=False, output='ba') ``` 上述代码中,`b`和`a`分别表示巴特沃斯滤波器的分子和分母多项式的系数,`order`表示滤波器阶数,`cutoff/nyquist`表示截止频率的归一化值,`btype='low'`表示低通滤波器,`analog=False`表示设计数字滤波器,`output='ba'`表示返回的系数表示法是基于分子和分母多项式的。 最后,我们可以应用滤波器来对信号进行滤波。 ```python t = np.linspace(0, 1, 1000, False) # 生成时间序列 x = np.sin(2 * np.pi * 50 * t) # 生成带噪声的信号 # 使用巴特沃斯滤波器对信号进行滤波 filtered_x = signal.lfilter(b, a, x) # 绘制原始信号和滤波后的信号 plt.plot(t, x, label='Original signal') plt.plot(t, filtered_x, label='Filtered signal') plt.xlabel('Time [s]') plt.ylabel('Amplitude') plt.legend(loc='best') plt.grid(True) plt.show() ``` 上述代码中,我们生成了一个带有50Hz正弦信号的时间序列,并给它添加噪声。然后,使用`signal.lfilter`函数将信号输入巴特沃斯滤波器进行滤波。最后,使用matplotlib库来绘制原始信号和滤波后的信号。 这就是使用Python进行巴特沃斯滤波器设计和滤波的基本步骤。当然,巴特沃斯滤波器还有其他类型和参数可供选择,具体可以根据实际应用需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值