Python常规滤波器详解:带通、低通、高通、带阻用法分享

一、滤波器的作用

        滤波器在信号处理中用于移除或减少信号中的噪声,同时保持信号的某些特性。滤波器通常用于音频、视频和图像处理等领域。滤波器根据其 designed for different purposes and can be divided into several types, such as lowpass filters, highpass filters, bandpass filters, and bandstop filters.

        (1)低通滤波器(Lowpass Filters): 低通滤波器用于通过高频信号,去除或减少低频信号,从而减少噪声。

        (2)高通滤波器(Highpass Filters): 高通滤波器用于去除或减少低频信号,通过高频信号,从而减少噪声。

        (3)带通滤波器(Bandpass Filters): 带通滤波器用于通过指定频率范围内的信号,去除或减少其他频率范围内的信号,从而减少噪声。

        (4)带阻滤波器(Bandstop Filters): 带阻滤波器用于去除指定频率范围内的信号,通过其他频率范围内的信号,从而减少噪声。

二、滤波器的设计

        滤波器设计是一种将信号从复杂噪声中提取出有用的信号的过程。滤波器设计通常包括以下几个步骤:

        Step1: 确定滤波器类型:根据信号的类型和应用场景,确定需要设计的滤波器类型。例如,低通滤波器、高通滤波器、带通滤波器等。

        Step2:选择滤波器参数:根据滤波器类型和应用场景,选择合适的滤波器参数,例如滤波器带宽、截止频率等。

        Step3:设计滤波器网络:根据滤波器类型和参数,设计滤波器网络。通常使用线性代数、信号处理和系统理论等知识来设计滤波器网络。

        Step4:测试和优化:使用测试信号对滤波器进行测试,并根据测试结果对滤波器进行优化。

三、Python代码实现

        (1)以下为低通(高通滤波器类似这样设计)滤波器的一个demo:

import numpy as np
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt

def butter_lowpass_filter(data, cutoff, fs, order=4):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='low', analog=False) #高通滤波器btype='high'
    filtered_data = filtfilt(b, a, data)
    return filtered_data

# main
fs = 2000  # 采样频率
dt = 1.0 / fs  # 时间间隔
t = np.arange(0, 1, dt)  # 时间向量
ff = np.linspace(0, fs//2, t.size//2)
n = len(t)  # 信号长度

# 生成一个包含噪声的信号
np.random.seed(0)
noise = 0.1 * np.random.randn(n)
freq = 150  # 信号频率
x = np.sin(2 * np.pi * freq * t) + np.sin(2 * np.pi * 500 * t) + noise  # 带噪声的信号

# 设置滤波器参数
cutoff = 200  # 滤波器截止频率
order = 4  # 滤波器阶数

# 应用滤波器
filtered_data = butter_lowpass_filter(x, cutoff, fs, order)

# 绘制原始信号和滤波后的信号
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(t, x, 'b-', label='Noisy signal')
plt.plot(t, filtered_data, 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()

plt.subplot(2, 1, 2)
plt.plot(ff, np.abs(np.fft.ifft(x))[0:fs//2], 'b-', label='Noisy signal')
plt.plot(ff, np.abs(np.fft.ifft(filtered_data))[0:fs//2], 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('|P1(f)|')
plt.legend()
plt.grid()

plt.show()

        低通滤波器代码运行后的结果如图1所示。

图1

       (2) 以下为带通滤波器的一个demo:

import numpy as np
from scipy.signal import butter, filtfilt
import matplotlib.pyplot as plt

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

# main
fs = 2000  # 采样频率
dt = 1.0 / fs  # 时间间隔
t = np.arange(0, 1, dt)  # 时间向量
ff = np.linspace(0, fs//2, t.size//2)
n = len(t)  # 信号长度

# 生成一个包含噪声的信号
np.random.seed(0)
noise = 0.1 * np.random.randn(n)
freq = 150  # 信号频率
x = np.sin(2 * np.pi * freq * t) + np.sin(2 * np.pi * 500 * t) + noise  # 带噪声的信号

# 设置滤波器参数
lowcut = 400  # 滤波器下限频率
highcut = 600  # 滤波器上限频率
order = 4  # 滤波器阶数

# 应用滤波器
filtered_data = butter_bandpass_filter(x, lowcut, highcut, fs, order)

# 绘制原始信号和滤波后的信号
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(t, x, 'b-', label='Noisy signal')
plt.plot(t, filtered_data, 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Time (seconds)')
plt.ylabel('Amplitude')
plt.legend()
plt.grid()

plt.subplot(2, 1, 2)
plt.plot(ff, np.abs(np.fft.ifft(x))[0:fs//2], 'b-', label='Noisy signal')
plt.plot(ff, np.abs(np.fft.ifft(filtered_data))[0:fs//2], 'r-', linewidth=2, label='Filtered signal')
plt.xlabel('Frequency (Hz)')
plt.ylabel('|P1(f)|')
plt.legend()
plt.grid()

plt.show()

         带通滤波器代码运行后的结果如图2所示。

图2

作者:我不是哆啦A梦

物联沃分享整理
物联沃-IOTWORD物联网 » Python常规滤波器详解:带通、低通、高通、带阻用法分享

发表回复