Python实现数字带阻巴特沃斯滤波器


带阻滤波器是一种滤波器,它拒绝或阻挡一定频率范围内的所有频率,并通过该范围外的频率。巴特沃斯滤波器是一种旨在在通带内尽可能平坦地滤波频率的滤波器类型。以下是数字带阻巴特沃斯滤波器的主要特点。

  • 滤波器的采样率约为12kHz。

  • 通带边缘频率范围为2100Hz至4500Hz。

  • 阻带边缘频率范围为2700Hz至3900Hz。

  • 通带的纹波点为0.6分贝。

  • 阻带的最小衰减为45分贝。

实现带阻巴特沃斯滤波器

带阻巴特沃斯滤波器与带通巴特沃斯滤波器的功能相反。实现数字带阻巴特沃斯滤波器需要遵循以下几个步骤。让我们一一来看。

步骤1 - 首先,我们必须定义给定输入信号的采样频率fs,以及下限截止频率f1、上限截止频率f2和滤波器的阶数。为了避免陡峭的滚降导致相位失真,我们必须将滤波器的阶数确定为尽可能低的数值。

步骤2 - 在这一步中,我们将使用以下公式计算已定义的下限截止频率f1和上限截止频率f2的归一化频率wn1和wn2。

wn = 2 ∗ fn / fs

步骤3 - 在python中,我们有scipy库,它有一个名为scipy.signal.butter()的函数,该函数用于设计具有已定义阶数和归一化频率的巴特沃斯滤波器,并将btype参数作为bandstop传递。

步骤4 - 现在,我们将使用scipy.signal.filtfilt()函数对给定的输入信号应用滤波器,以执行零相位滤波。

示例

在下面的示例中,我们将使用python中提供的函数和上述步骤来实现带阻巴特沃斯滤波器。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import butter, filtfilt
def butter_bandstop(lowcut, highcut, fs, order=5):
   nyq = 0.5 * fs
   low = lowcut / nyq
   high = highcut / nyq
   b, a = butter(order, [low, high], btype='bandstop')
   return b, a
def butter_bandstop_filter(data, lowcut, highcut, fs, order=5):
   b, a = butter_bandstop(lowcut, highcut, fs, order=order)
   y = filtfilt(b, a, data)
   return y
t = np.linspace(0, 1, 1000, endpoint=False)
data = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*100*t)
fs = 1000 
lowcut = 45  
highcut = 55 
order = 4
filtered_data = butter_bandstop_filter(data, lowcut, highcut, fs, order)
print("The length of the filtered_data:",len(filtered_data))
print("The first 60 frequencies output of the bandstop filter:",filtered_data[:60])
plt.plot(t, data, 'b-', label='data')
plt.plot(t, filtered_data, '.', linewidth=0.75, label='filtered data', c = ("orange"))
plt.xlabel('Time [sec]')
plt.grid()
plt.legend()
plt.show()

输出

The length of the filtered_data: 1000
The first 60 frequencies output of the bandstop filter: [ 0.0538999   0.68581044  1.08999445  1.12963747  0.80670599  0.26172752
 -0.27940415 -0.59133519 -0.53509911 -0.11114146  0.54072315  1.19441551
  1.62350117  1.68713138  1.38324023  0.8487329   0.30664654 -0.01948728
  0.00866697  0.3912569   0.99019459  1.58206033  1.94372501  1.9379504
  1.56622785  0.96862788  0.37067549 -0.00249295 -0.01192794  0.34213815
  0.9203407   1.49727013  1.8473413   1.83067626  1.44623031  0.83190402
  0.21163048 -0.19032582 -0.23510605  0.07772592  0.61013477  1.13854044
  1.43948479  1.37529278  0.94698224  0.29418691 -0.35789988 -0.78431234
 -0.84607258 -0.54316965 -0.01451725  0.51510369  0.82086563  0.76371439
  0.34342535 -0.30135441 -0.94608162 -1.36606715 -1.42224433 -1.11419611]

更新于:2023年11月2日

浏览量:253

启动您的职业生涯

完成课程获得认证

开始学习
广告