You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GNU Radio Companion中设置滤波器模块的阻带衰减值

GNU Radio 带通滤波器自定义阻带衰减配置方法

标准Band Pass Filter模块未开放阻带衰减配置,是因为模块内部硬编码了60dB阻带衰减、0.1dB通带波纹的默认参数,没有暴露对应配置入口,可通过以下两种可靠方案实现自定义配置:


方案1:抽头生成模块+通用FIR滤波器组合(零代码,优先使用)

不需要编写自定义块,直接组合GRC自带模块即可实现全参数配置:

  • 从模块库检索并添加Band Pass Filter Taps模块,该模块直接开放*阻带衰减(Stopband Attenuation,单位dB)*配置项,同时支持自定义通带波纹、过渡带宽等所有滤波器设计参数,输出为计算完成的FIR抽头系数向量。
  • 根据输入信号类型选择对应通用滤波模块:复数信号选FFT Filter(对应底层fft_filter_ccc)或FIR Filter(对应fir_filter_ccc),实数信号选择对应实数版本的滤波模块即可。
  • 将Band Pass Filter Taps的输出端口直接连接到滤波模块的taps参数输入端口,流图运行时会自动完成系数加载,滤波效果和原生带通滤波器完全一致,且支持所有参数动态调整。

方案2:修复Embedded Python Block封装逻辑

之前自定义块调用失败的核心原因是:GNU Radio滤波模块的work方法不能直接在外部块的工作函数中嵌套调用,且滤波器实例不能在work方法内重复初始化(会清空历史样本缓存导致滤波异常),正确封装逻辑如下:

  1. 新建Embedded Python Block,设置输入、输出端口类型匹配你的信号类型(以复数信号为例,类型选complex)
  2. 添加需要配置的参数:采样率、通带下截止频率、通带上截止频率、过渡带宽度、阻带衰减,参数类型均设为浮点型。
  3. 在块的初始化方法中完成抽头计算和滤波器实例化,参考代码如下:
import numpy as np
from gnuradio import filter

class configurable_bandpass(gr.sync_block):
    def __init__(self, samp_rate=1e6, low_cut=100e3, high_cut=200e3, trans_width=10e3, stopband_atten=80):
        gr.sync_block.__init__(self,
            name="Configurable Band Pass Filter",
            in_sig=[np.complex64],
            out_sig=[np.complex64])
        # 调用optfir生成自定义参数的滤波器抽头
        self.taps = filter.optfir.complex_band_pass(
            gain=1,
            sampling_freq=samp_rate,
            low_cutoff_freq=low_cut,
            high_cutoff_freq=high_cut,
            transition_width=trans_width,
            passband_ripple=0.1,
            stopband_attenuation=stopband_atten
        )
        # 初始化FFT滤波器实例,抽取倍数设为1
        self.filt_inst = filter.fft_filter_ccc(decimation=1, taps=self.taps, nthreads=1)
  1. 重写work方法时,调用滤波器实例的filter方法处理输入数据,不要直接调用work方法:
def work(self, input_items, output_items):
        in_buff = input_items[0]
        out_buff = output_items[0]
        out_buff[:] = self.filt_inst.filter(in_buff)
        return len(out_buff)

注意:如果需要动态修改滤波器参数,需要新增参数回调方法,在参数更新时重新计算抽头,调用滤波器实例的set_taps方法加载新系数即可,不需要重新实例化滤波器对象。


不推荐直接修改GNU Radio安装目录下的原生模块定义文件,该操作会修改全局默认配置,版本升级后配置会被覆盖,维护成本极高。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.07 16:15:42