如何在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方法内重复初始化(会清空历史样本缓存导致滤波异常),正确封装逻辑如下:
- 新建Embedded Python Block,设置输入、输出端口类型匹配你的信号类型(以复数信号为例,类型选
complex) - 添加需要配置的参数:采样率、通带下截止频率、通带上截止频率、过渡带宽度、阻带衰减,参数类型均设为浮点型。
- 在块的初始化方法中完成抽头计算和滤波器实例化,参考代码如下:
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)
- 重写
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
相关产品推荐
相关产品推荐

