首页 > 百科杂谈 > 滤波器分类代码(滤波器分析与实现)

滤波器分类代码(滤波器分析与实现)

滤波器分析与实现

滤波器,也称为滤波器,是一种能够对信号进行滤波处理的电子器件。该器件可以消除噪声、滤除不必要的波动、滤掉高/低频信号等,常常应用于各类通信、音频、图像处理等领域中。滤波器的分类方法有很多,下面我们将结合代码为大家介绍一些常用的滤波器及其分类方法。

一、根据工作原理的分类

根据工作原理来看,可将滤波器分为以下几类:低通滤波器、高通滤波器、带通滤波器和带阻滤波器,这几类滤波器基本上能够应对大部分滤波问题。

下面,我们先来看看低通滤波器(Low Pass Filter,LPF)的代码实现,Python语言的Scipy库提供了丰富的信号处理函数,其中就包括了低通滤波器的设计和实现代码,示例代码如下:

``` from scipy.signal import butter, filtfilt import numpy as np # 定义滤波函数 def lowpass_filter(data, cutoff, fs, order): nyq = 0.5 * fs # 计算采样频率一半 normal_cutoff = cutoff / nyq # 计算归一化截止频率 b, a = butter(order, normal_cutoff, btype='low', analog=False) # 计算低通滤波器系数 y = filtfilt(b, a, data) # 对信号进行低通滤波 return y # 生成测试数据 t = np.linspace(0, 10, 1000) x = np.sin(2*np.pi*5*t) + np.sin(2*np.pi*10*t) # 对信号进行低通滤波 y = lowpass_filter(x, 2, 100, 4) ```

这段代码中使用了Scipy库的butter函数和filtfilt函数实现了一个低通滤波器。其中,butter函数用于计算滤波器系数,filtfilt函数用于对数据进行滤波操作。在测试数据中,我们生成了两个频率分别为5Hz和10Hz的正弦信号并将它们相加,然后我们对这个信号进行了低通滤波,将截止频率设置为2Hz,采样频率设置为100Hz,滤波器阶数设置为4,最后得到的滤波后的信号存储在变量y中。

对于高通滤波器(High Pass Filter,HPF)、带通滤波器(Band Pass Filter,BPF)和带阻滤波器(Band Stop Filter,BSF),它们的代码实现与低通滤波器的代码实现类似,只需要根据需要调整滤波器类型(btype参数)和截止频率即可。例如,我们将上面的代码中的btype参数从low改为high,则可获得一个高通滤波器。

二、根据级联方式的分类

根据级联方式进行分类,可将滤波器分为递归型滤波器(Recursive Filter)和非递归型滤波器(Non-recursive Filter),递归型滤波器是一种具有反馈回路的滤波器,其输出将作为输入的一部分再次参与运算,因此这类滤波器可以实现无限阶滤波。相比之下,非递归型滤波器则不存在反馈回路,其输出只与当前时刻的输入有关。两种滤波器的代码实现具有很大的区别。

我们先来看看递归型滤波器的代码实现,在Python中,递归型滤波器设定一个滤波器状态变量,记录上一次处理后的输出和输入值。最常见的递归型滤波器包括IIR低通滤波器和IIR高通滤波器。以下是一个IIR低通滤波器的代码实现:

``` import numpy as np from scipy import signal # 定义IIR低通滤波器系数 b, a = signal.iirfilter(4, 5, btype='lowpass', analog=False, ftype='butter', fs=100) # 获取滤波器状态变量 zi = signal.lfilter_zi(b, a) # 模拟输入数据 x = np.random.randn(100) # 滤波 y, zf = signal.lfilter(b, a, x, zi=zi) # 将状态变量存储下来,以便下一次使用 zi = zf ```

在这段代码中,我们使用了Scipy库的iirfilter函数计算IIR低通滤波器的系数。这里的参数4表示滤波器的阶数,5表示截止频率,btype则指定了滤波器类型,这里我们设置为lowpass代表低通滤波器。在数据处理前,我们使用lfilter_zi函数获取一个长度为4的滤波器状态变量,然后使用lfilter函数对输入数据进行滤波。

非递归型滤波器较为简单,对于低通滤波器而言,其可使用FIR(Finite Impulse Response)滤波器实现,FIR滤波器是一种只有前向通道的滤波器,输出仅由输入值线性加权处理而来,不存在反馈回路。

以下是一个低通FIR滤波器的代码实现:

``` import numpy as np from scipy import signal # 定义FIR低通滤波器系数 b = signal.firwin(30, cutoff=0.25, window='hamming', pass_zero=True) # 模拟输入数据 x = np.random.randn(100) # 滤波 y = signal.convolve(x, b, mode='same') ```

这段代码中,我们使用Scipy库的firwin函数计算一个长度为30的hamming窗口低通滤波器系数,然后使用convolve函数将系数应用到输入数据上,对数据进行低通滤波。需要注意的是,FIR滤波器的输出信号长度会比输入信号长度多出滤波器系数长度的点数,如果需要输出等长的信号,则需要通过设置mode参数为same来实现。

三、根据滤波器结构的分类

根据滤波器的结构,可将滤波器分为直接形式I(DFI)、直接形式II(DFII)、级联形式(Cascade Form)和共轭传输形式(Transpose Form)。这些结构基本上覆盖了所有数字信号处理器的应用场景,下面我们将演示一些常用滤波器结构的代码实现。

首先是直接形式I(DFI)滤波器,其流程就是先将输入与滤波器系数做点积运算,再对结果进行加减操作得到输出。以下是一个多通道DFI低通滤波器的代码实现:

``` from scipy.signal import lfilter # 定义一些参数 n_channels = 3 fs = 100 cutoff = 10 order = 4 # 计算低通滤波器系数 b, a = butter(order, cutoff/(fs/2), btype='low', analog=False) # 模拟多通道输入数据 x = np.random.randn(n_channels, 1000) # 对输入数据进行低通滤波器操作 y = np.zeros_like(x) for i in range(n_channels): y[i, :] = lfilter(b, a, x[i, :]) ```

这段代码中,我们先使用butter函数计算低通滤波器的系数,然后使用lfilter函数对多通道输入数据进行滤波操作,其中,lfilter函数的第二个参数代表滤波器的系数。需要注意的是,对于多通道数据,我们需要分别处理每一个通道。

接下来是直接形式II(DFII)滤波器,该滤波器的输出可以直接作为输入传递到下一个DFII滤波器进行处理。以下是一个两级DFII低通滤波器的代码实现:

``` from scipy.signal import iirdesign, lfilter # 定义一些参数 order = 4 fs = 100 f = 10 # 模拟输入信号 t = np.linspace(0, 1, 100) # 时间序列 x = np.sin(2*np.pi*t*f) + np.sin(2*np.pi*5*t) # 两个正弦波信号 # 生成两级DFII低通滤波器系数 b, a = iirdesign([f/(fs/2), (f+20)/(fs/2)], [f/(fs/2)-0.05, (f+20)/(fs/2)+0.05], gpass=0.1, gstop=15, ftype='butter', output='ba') # 第一级过滤 x1 = lfilter(b[:3], a[:3], x) # 第二级过滤 x2 = lfilter(b[3:], a[3:], x1) y = x2 ```

代码中,我们使用iirdesign函数生成了两级DFII低通滤波器的系数,然后对输入信号进行两次滤波操作,最终输出处理后的结果。需要注意的是,在DFII滤波器中,每一级的系数都分别存放在b和a变量中,由此我们可以分别处理每一级信号。

以上是几种常见滤波器的分类和简单实现方法,实际使用中还需根据具体需求选择合适的滤波器结构和设计方法。滤波器不仅可以用来处理数字信号,也可以用于图像处理、音频处理等领域,应用十分广泛。