滤波器设计流程

  1. sos滤波器是什么
  2. 为什么要 zpk2sos
  3. 如何实现零相位滤波,优缺点分别是什么

滤波器的计算流程

滤波器的计算设计流程:

1.输入验证和处理:

2.检查频率范围是否合法,计算归一化的频率。

3.滤波器设计:设计带通 Butterworth 滤波器并转换为 SOS 表示。

4.滤波应用:根据 zerophase 参数决定是否进行双向滤波(正向 + 反向)或仅进行正向滤波。

5.返回结果:返回处理后的滤波数据。

python 复制代码
def bandpass(data, freqmin, freqmax, df, corners=4, zerophase=False):
    """
    Butterworth-Bandpass Filter.

    Filter data from ``freqmin`` to ``freqmax`` using ``corners``
    corners.
    The filter uses :func:`scipy.signal.iirfilter` (for design)
    and :func:`scipy.signal.sosfilt` (for applying the filter).

    :type data: numpy.ndarray
    :param data: Data to filter.
    :param freqmin: Pass band low corner frequency.
    :param freqmax: Pass band high corner frequency.
    :param df: Sampling rate in Hz.
    :param corners: Filter corners / order.
    :param zerophase: If True, apply filter once forwards and once backwards.
        This results in twice the filter order but zero phase shift in
        the resulting filtered trace.
    :return: Filtered data.
    """
    fe = 0.5 * df
    low = freqmin / fe
    high = freqmax / fe
    # raise for some bad scenarios
    if high - 1.0 > -1e-6:
        msg = ("Selected high corner frequency ({}) of bandpass is at or "
               "above Nyquist ({}). Applying a high-pass instead.").format(
            freqmax, fe)
        warnings.warn(msg)
        return highpass(data, freq=freqmin, df=df, corners=corners,
                        zerophase=zerophase)
    if low > 1:
        msg = "Selected low corner frequency is above Nyquist."
        raise ValueError(msg)
    z, p, k = iirfilter(corners, [low, high], btype='band',
                        ftype='butter', output='zpk')
    sos = zpk2sos(z, p, k)
    if zerophase:
        firstpass = sosfilt(sos, data)
        return sosfilt(sos, firstpass[::-1])[::-1]
    else:
        return sosfilt(sos, data)

sos 滤波器是什么


零相位滤波器

python 复制代码
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

# 生成示例数据:一个带有噪声的正弦信号
fs = 1000  # 采样频率(Hz)
t = np.linspace(0, 1, fs)  # 时间向量
freq1 = 5  # 低频
freq2 = 50  # 高频
signal_clean = np.sin(2 * np.pi * freq1 * t) + np.sin(2 * np.pi * freq2 * t)  # 清晰信号
noise = np.random.randn(len(t)) * 0.2  # 噪声
signal_noisy = signal_clean + noise  # 带噪声的信号

# 设计带通滤波器
lowcut = 10  # 带通滤波器的低频边界(Hz)
highcut = 40  # 带通滤波器的高频边界(Hz)

# 使用巴特沃斯滤波器设计
b, a = signal.butter(4, [lowcut, highcut], fs=fs, btype='band')

# 使用 filtfilt 进行零相位滤波
signal_filtered = signal.filtfilt(b, a, signal_noisy)

# 绘制结果
plt.figure(figsize=(10, 6))
plt.subplot(3, 1, 1)
plt.plot(t, signal_noisy, label="Noisy signal")
plt.title("Noisy Signal")
plt.subplot(3, 1, 2)
plt.plot(t, signal_clean, label="Original Clean Signal", color='g')
plt.title("Original Clean Signal")
plt.subplot(3, 1, 3)
plt.plot(t, signal_filtered, label="Filtered Signal", color='r')
plt.title("Filtered Signal with Zero-Phase")
plt.tight_layout()
plt.show()
相关推荐
XINVRY-FPGA1 天前
XC7A100T-2FGG484I Xilinx Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信息与通信·信号处理·fpga
FPGA_ADDA2 天前
RFSOC27DR+VU13P 6U VPX板卡
fpga开发·信号处理·adda射频采集·rfsoc27dr·vu13p
渡我白衣2 天前
网络层IP协议详解:互联网的灵魂所在
网络协议·tcp/ip·信号处理
【杨(_> <_)】3 天前
SAR信号处理重要工具-傅里叶变换(二)
算法·信号处理·傅里叶分析·菲涅尔函数
【建模先锋】3 天前
多源信息融合+经典卷积网络故障诊断模型合集
深度学习·信号处理·故障诊断·多源信息融合
贝塔实验室4 天前
频偏估计方法--快速傅里叶变换(FFT)估计法
网络协议·算法·数学建模·动态规划·信息与通信·信号处理·傅立叶分析
贝塔实验室4 天前
QPSK信号载波同步技术---极性Costas 法载波同步
计算机网络·算法·网络安全·数学建模·信息与通信·信号处理·傅立叶分析
霖004 天前
ZYNQ裸机开发指南笔记
人工智能·经验分享·笔记·matlab·fpga开发·信号处理
通信小呆呆4 天前
分布式雷达 vs 多基地雷达:同频共振的“合唱团”和“乐队”
分布式·目标检测·信息与通信·信号处理·计算成像
贝塔实验室4 天前
QPSK信号载波同步技术---四相Costas 环法
数学建模·fpga开发·硬件工程·动态规划·信息与通信·信号处理·傅立叶分析