1. gr-filter 整体定位与功能分类定位gr-filter是 GNU Radio 的滤波与采样率变换核心包负责FIR/IIR 滤波抽取/插值/有理数/任意比率重采样多相滤波器组PFB信道化滤波器系数设计firdes通信专用成形滤波RRC、高斯依赖gnuradio-runtime → 块基类、调度 gr-fft → FFT 加速滤波、窗函数 gr-blocks → 部分辅助块 Volk → SIMD 卷积功能分类GRC 树类别代表块流程作用FIR/IIR 滤波fir_filter_xxx、iir_filter_xxx、fft_filter_xxx抗混叠、信道选择、音频 LPF多速率interp_fir_filter、rational_resampler、pfb_arb_resampler改变采样率PFB 架构pfb_channelizer、pfb_decimator/interpolator、pfb_synthesizer高效多信道、多相抽取/插值频移滤波freq_xlating_fir_filter、freq_xlating_fft_filter下变频滤波一体系数设计firdes、optfir、pm_remez离线/在线生成 taps通信成形root_raised_cosine_filter、RRC/Gaussian taps脉冲成形、匹配滤波简单滤波dc_blocker、single_pole_iir、low_pass_filterDC 消除、一阶平滑其他hilbert_fc、filterbank、mmse_resampler希尔伯特变换、滤波器组、分数插值源码结构gr-filter/ ├── include/gnuradio/filter/ # API kernel 类fir_filter, fft_filter, pfb_* ├── lib/ # *_impl.cc firdes.cc pm_remez.cc ├── python/filter/ # PyBind11 optfir.py pfb.py └── grc/ # GRC 块定义接口调用总入口fromgnuradioimportfilter,gr,fft# 设计系数tapsfilter.firdes.low_pass(gain1.0,sampling_freqfs,cutoff_freqfc,transition_widthtw,windowfft.window.WIN_HAMMING)# 使用滤波器lpffilter.fir_filter_fff(1,taps)# decim1 普通 FIRtb.connect(src,lpf,dst)2. FIR/IIR 滤波器底层源码实现2.1 FIR 核心公式离散卷积FIR[y[n] \sum_{k0}^{N-1} h[k] \cdot x[n-k]]传递函数(H(z) \sum_{k0}^{N-1} h[k] z^{-k})2.2 FIR 架构Kernel Block 两层Kernel 类include/gnuradio/filter/fir_filter.h纯算法可被多块复用。OUT_T filter(const IN_T input[]) const; void filterN(OUT_T output[], const IN_T input[], unsigned long n); void filterNdec(OUT_T output[], ..., unsigned int decimate);Block 类fir_filter_blk_impl.cc包装为 GNU Radio 块。if (this-decimation() 1) { d_fir.filterN(out, in, noutput_items); } else { d_fir.filterNdec(out, in, noutput_items, this-decimation()); }decimation1普通 FIRdecimation1FIR 抽取每 D 点输出 1 点set_history(ntaps)保留历史样本供卷积实现优化taps反转存储std::reverse适配卷积方向多份对齐 tapsd_aligned_taps处理非对齐输入float/complex 走VOLK点积内核2.3 IIR 核心公式Direct Form I 差分方程newstylefalse与 scipy/MATLAB 一致[y[n] \sum_{k1}^{M} a_k y[n-k] \sum_{k0}^{N} b_k x[n-k]][H(z) \frac{\sum_{k0}^{N} b_k z^{-k}}{1 \sum_{k1}^{M} a_k z^{-k}}]fftaps 前馈系数 (b_k)fbtaps 反馈系数 (a_k)(a_0) 被忽略文件iir_filter_ffd_impl.cc→ kerneliir_filteri,o,tap,acc2.4 firdesFIR 系数设计低通窗函数法firdes.cc理想低通冲激响应sinc[h[n] \frac{\sin(2\pi f_c n / f_s)}{\pi n} \cdot w[n], \quad n \neq 0][h[0] \frac{2 f_c}{f_s} \cdot w[0]]再归一化使 DC 增益 gain。流程作用场景用法接收音频 LPFfir_filter_fff(decim, taps)FM 去加重后音频滤波wfm_rcv中 FIR decim抗混叠抽取前 LPFIIR 去加重iir_filter_ffd(btaps, ataps)gr-analog fm_emph 使用涉及语法三层模板fir_filterIN_T, OUT_T, TAP_Tsync_decimatorFIR抽取Kernel/Block 分离volk::vector对齐内存接口调用importgnuradio.fftasfftfromgnuradioimportfilter# 设计 使用tapsfilter.firdes.low_pass(1.0,48000,5000,1000,fft.window.WIN_HAMMING)firfilter.fir_filter_fff(1,taps)# 普通 FIRfir_decimfilter.fir_filter_fff(4,taps)# 4 倍抽取 FIR# IIR来自 scipy 设计时 oldstyleFalseiirfilter.iir_filter_ffd(fftaps,fbtaps,oldstyleFalse)# GRC 层次块设计滤波一体lpffilter.low_pass_filter(1,samp_rate,cutoff,transition,window)#includegnuradio/filter/fir_filter_blk.hautofirgr::filter::fir_filter_blkfloat,float,float::make(1,taps);3. FFT 加速滤波原理与源码优化逻辑3.1 原理Overlap-Add / 频域卷积时域卷积等价于频域相乘[y[n] x[n] * h[n] \Leftrightarrow Y[k] X[k] \cdot H[k]]当 tap 数 (N) 较大时FFT 法复杂度约 (O(N\log N))优于直接卷积 (O(N \cdot L))。3.2 关键参数fft_filter.ccd_ntaps ntaps; d_fftsize (int)(2 * pow(2.0, ceil(log(double(ntaps)) / log(2.0)))); d_nsamples d_fftsize - d_ntaps 1;符号含义d_ntaps滤波器阶数d_fftsizeFFT 长度≥ 2×ntaps2 的幂d_nsamples每块有效输出样本数d_tail块间重叠相加的“尾巴”3.3 处理流程预计算对 taps 做 FFT →d_xformed_taps乘 (1/N) 缩放每块处理输入d_nsamples点 零填充 → 长度d_fftsize正向 FFT → 与d_xformed_taps相乘VOLK逆向 IFFT加上上一块d_tailoverlap-add输出前d_nsamples点保存新 tailvolk_32fc_x2_multiply_32fc_a(c, a, d_xformed_taps.data(), ...); d_invfft-execute(); for (j 0; j tailsize(); j) d_invfft-get_outbuf()[j] d_tail[j]; ... memcpy(d_tail[0], d_invfft-get_outbuf() d_nsamples, ...);3.4 何时用 FFT 滤波tap 很长数百~数千时比 FIR 直接卷积更快pfb_decimator可选use_fft_filtersTruefreq_xlating_fft_filter结合频移流程作用广播/宽信道、高阶 LPF、大 tap 数信道化中的性能优化路径。接口调用# FFT 滤波块支持 decimationfft_firfilter.fft_filter_fff(decimation4,tapstaps,nthreads1)fft_fir_ccffilter.fft_filter_ccf(decimation1,tapstaps)4. 抽取/插值滤波、多相滤波架构4.1 插值 FIRinterp_fir_filter公式先插零再滤波等价于多相实现。插值 (L) 倍输出采样率 (f_s’ L \cdot f_s)多相分解原 taps (h[n]) 拆成 (L) 个子滤波器[h_r[k] h[r kL], \quad r 0,1,\ldots,L-1]每个输入样本依次通过 (L) 个子滤波器产生 (L) 个输出。继承sync_interpolator1 输入 : L 输出4.2 有理数重采样rational_resampler采样率变换[f_{out} f_{in} \cdot \frac{L}{M}](L)interpolation(M)decimation。多相 FIR 银行 计数器d_ctrwhile ((i noutput_items) (count ninput_items[0])) { out[i] d_firs[ctr].filter(in); ctr this-decimation(); while (ctr this-interpolation()) { ctr - this-interpolation(); in; count; } }每输入 1 点按相位ctr选子滤波器输出无用户 taps 时自动用 Kaiser 窗设计 LPFdesign_resampler_filter用std::gcd(L,M)约简降低复杂度4.3 多相滤波器组PFB通用架构核心思想把原型滤波器 (H(z)) 分解为 (N) 个多相分支[H(z) \sum_{k0}^{N-1} z^{-k} H_k(z^N)]块作用pfb_decimator_ccf(N) 路输入 → 选 1 路信道输出抽取选频pfb_interpolator_ccf1 路 → (N) 路插值合成pfb_channelizer_ccf宽输入 → 多窄带信道FFT 信道化pfb_synthesizer_ccf多信道 → 宽输出合成pfb_decimator还含复数旋转器 (e^{j2\pi k \cdot \text{chan}/N}) 选信道。流程作用ADC 高采样率 → [抽取 FIR] → 低采样率基带 音频 48k → [插值 FIR] → 240k 供 FM 调制 任意 L/M → [rational_resampler] → 统一采样率 宽频谱 → [pfb_channelizer] → 多路窄带信道接口调用# 插值interpfilter.interp_fir_filter_fff(interpolation4,tapstaps)# 有理数重采样 48k → 44.1k 类场景rrfilter.rational_resampler_fff(interpolation441,decimation480,taps[],fractional_bw0.4)# PFB 抽取8 选 1 信道pfb_decfilter.pfb_decimator_ccf(decim8,tapstaps,channel0)# PFB 插值pfb_intfilter.pfb_interpolator_ccf(interp8,tapstaps)# PFB 信道化chanfilter.pfb_channelizer_ccf(numchans8,tapstaps)5. 任意重采样模块底层原理块名pfb_arb_resampler_xxxKernelpfb_arb_resampler.cc5.1 目标实现任意比率重采样 (f_{out} r \cdot f_{in})(r) 为任意浮点数如 1.037。5.2 原理多相滤波器 线性插值设滤波器组数 (N )filter_size即d_int_rate整数部分(D \lfloor N/r \rfloor)小数部分(f N/r - D)d_flt_rate每输出 1 点用第 (j) 个子滤波器 FIR 得 (o_0)用差分滤波器得 (o_1)(H’(z)) 近似线性插值(y o_0 o_1 \cdot \text{acc})累加器d_acc按小数步进更新溢出时推进输入o0 d_filters[j].filter(input[i_in]); o1 d_diff_filters[j].filter(input[i_in]); output[i_out] o0 o1 * d_acc;差分 taps 由[-1, 1]差分器作用于原型 taps 得到用于子样本级插值。5.3 与 rational_resampler 对比rational_resamplerpfb_arb_resampler比率有理数 L/M任意浮点 r精度精确近似插值复杂度较低较高双滤波器组流程作用音频设备采样率不匹配48000 ↔ 44100符号时钟恢复后的分数重采样软件无线电中非标比率变换接口调用# 浮点 → 浮点重采样到 1.2 倍arbfilter.pfb_arb_resampler_fff(rate1.2,tapstaps,filter_size32)# 复数arb_ccffilter.pfb_arb_resampler_ccf(rate0.8,tapstaps,filter_size32)6. 通信专用 RRC/升余弦、高斯滤波源码设计入口firdes.cc GRC 变量块variable_rrc_filter_taps6.1 根升余弦RRC用途发送端脉冲成形接收端匹配滤波。发送接收 RRC 级联 ≈ 升余弦消除 ISI。频域滚降系数 (\alpha \in [0,1])时域firdes::root_raised_cosine(T_s 1/\text{symbol_rate})(spb f_s \cdot T_s)[h(t) \frac{4\alpha}{\pi\sqrt{T_s}} \cdot\frac{\cos((1\alpha)\pi t/T_s) \frac{\sin((1-\alpha)\pi t/T_s)}{4\alpha t/T_s}}{1 - (4\alpha t/T_s)^2}](t0) 及分母为 0 处用极限值处理见源码if (fabs(x3) 0.000001)分支。6.2 高斯滤波用途GFSK/MSK如蓝牙、GSM频谱成形限制带外辐射。公式firdes::gaussian[h[n] \exp\left(-\frac{1}{2}\left(\frac{s \cdot n \cdot T_s}{T_{sym}}\right)^2\right)]其中 (s \frac{1}{\sqrt{\ln 2 / (2\pi^2 B T^2)}})(BT) 为带宽-符号时间积bt参数。6.3 升余弦RCfirdes也提供raised_cosine非 root用于理论分析或特殊链路实际通信多用RRC 对。流程作用比特流 → [RRC 成形 FIR] → 上变频 → 信道 ↓ 限制带宽、控制 ISI GFSK: 比特 → [高斯 FIR] → 频率调制接口调用# 直接设计 tapsrrc_tapsfilter.firdes.root_raised_cosine(gain1.0,sampling_freq8e6,# 8 样点/符号symbol_rate1e6,# 1 Mspsalpha0.35,# 滚降ntaps11*8)# 通常 8~16 倍 spbgauss_tapsfilter.firdes.gaussian(gain1.0,spb8,bt0.35,ntaps4*8)# 使用rrc_firfilter.fir_filter_fff(1,rrc_taps)# GRC 层次块rrc_blkfilter.root_raised_cosine_filter(gain1.0,sample_ratefs,symbol_rateRs,alpha0.35,ntaps101)# 优化设计需 scipyfromgnuradio.filterimportoptfir tapsoptfir.low_pass(1,fs,passband,stopband,ripple,atten)7. DC 消除、简单高低通滤波7.1 DC Blockerdc_blocker_ff_impl.cc问题IQ 接收机常有 DC 偏置影响解调/频谱。原理(H(z) \frac{1 - z^{-D}}{1 - z^{-D}/D}) 的滑动平均实现近似高通截止 (\approx f_s/(2\pi D))。短形式long_formFalse[y[n] x[n-D1] - \text{MA}_2(\text{MA}_1(x[n]))]长形式四级滑动平均 延迟线阻带更深。y1 d_ma_0.filter(in[i]); y2 d_ma_1.filter(y1); out[i] d_ma_0.delayed_sig() - y2;流程作用USRP/IQ 接收最前端解调之前。7.2 单极点 IIRsingle_pole_iir_filter_ff一阶 IIR 低通[y[n] \alpha x[n] (1-\alpha) y[n-1]](\alpha) 越小截止频率越低。流程作用极简平滑、慢变 DC 跟踪比 dc_blocker 更简单。7.3 简单高低通GRC 层次块 firdeslow_pass_filter、high_pass_filter、band_pass_filter等内部 firdes.low_pass(...)fir_filter_fff(1, taps)低通 firdes 公式见第 2 节 sinc × 窗。高通频谱反转低通[h_{HP}[n] h_{LP}[n] \cdot (-1)^n \quad \text{或等效频域变换}]接口调用# DC 消除dcfilter.dc_blocker_ff(D32,long_formTrue)# floatdc_cfilter.dc_blocker_cc(D32,long_formFalse)# complex# 单极点 IIR 低通iir1filter.single_pole_iir_filter_ff(alpha0.01)# 简单低通设计滤波一体lpffilter.low_pass_filter(gain1.0,samp_rate48000,cutoff_freq5000,transition_width1000,windowfft.window.WIN_HAMMING)hpffilter.high_pass_filter(1.0,48000,200,500,fft.window.WIN_HAMMING)bpffilter.band_pass_filter(1.0,48000,200,4000,500,fft.window.WIN_HAMMING)总览典型信号处理流程发射链比特root_raised_cosine FIRinterp_fir_filter 上采样上变频接收链USRP IQdc_blocker_ccfreq_xlating_fir_filter 或 mixFIRrational_resampler 或 pfb_arbfir_filter 信道 LPF解调器 gr-analog语法知识汇总语法/模式示例位置用途三层模板IN,OUT,TAPfir_filter_blk,rational_resampler多类型支持Kernel Block 分离kernel::fir_filterfir_filter_blk_impl算法复用sync_decimator/interpolatorFIR decim, interp_fir固定比率多速率blockgeneral_workrational_resampler任意 consume/produce多相 taps 分解rational_resampler, pfb_*高效多速率VOLK SIMDfir_filter, fft_filter卷积加速FFT overlap-addfft_filter.cc长 FIR 加速set_history/set_relative_rate多速率块调度器配合firdes静态设计类firdes.cc系数生成pm_remez等波纹最优 FIR精确通带设计std::gcd约简rational_resampler降低多相数std::deque延迟线dc_blocker滑动平均Python 快速参考功能调用设计 LPF tapsfilter.firdes.low_pass(gain, fs, fc, tw, window)设计 RRCfilter.firdes.root_raised_cosine(gain, fs, sym_rate, alpha, ntaps)设计高斯filter.firdes.gaussian(gain, spb, bt, ntaps)FIR 滤波filter.fir_filter_fff(decim, taps)IIR 滤波filter.iir_filter_ffd(b, a, oldstyleFalse)FFT FIRfilter.fft_filter_fff(decim, taps)插值filter.interp_fir_filter_fff(L, taps)有理重采样filter.rational_resampler_fff(L, M, taps, fractional_bw0.4)任意重采样filter.pfb_arb_resampler_ccf(rate, taps, filter_size32)PFB 信道化filter.pfb_channelizer_ccf(numchans, taps)DC 消除filter.dc_blocker_cc(D, long_form)频移滤波filter.freq_xlating_fir_filter_ccc(center_freq, samp_rate, taps)与 gr-analog / gr-blocks 的分工模块职责gr-filter滤波、多速率、系数设计、RRC/高斯gr-analogFM/AM 调制解调调用 gr-filter 做音频 LPFgr-fftFFT 引擎、窗函数gr-blocks基础数学、类型转换例如wfm_rcv中quadrature_demod_cfanalogfir_filter_ffffilterfm_deemphanalog 的 IIR。
gr-filter 滤波与多速率模块完整源码分析
1. gr-filter 整体定位与功能分类定位gr-filter是 GNU Radio 的滤波与采样率变换核心包负责FIR/IIR 滤波抽取/插值/有理数/任意比率重采样多相滤波器组PFB信道化滤波器系数设计firdes通信专用成形滤波RRC、高斯依赖gnuradio-runtime → 块基类、调度 gr-fft → FFT 加速滤波、窗函数 gr-blocks → 部分辅助块 Volk → SIMD 卷积功能分类GRC 树类别代表块流程作用FIR/IIR 滤波fir_filter_xxx、iir_filter_xxx、fft_filter_xxx抗混叠、信道选择、音频 LPF多速率interp_fir_filter、rational_resampler、pfb_arb_resampler改变采样率PFB 架构pfb_channelizer、pfb_decimator/interpolator、pfb_synthesizer高效多信道、多相抽取/插值频移滤波freq_xlating_fir_filter、freq_xlating_fft_filter下变频滤波一体系数设计firdes、optfir、pm_remez离线/在线生成 taps通信成形root_raised_cosine_filter、RRC/Gaussian taps脉冲成形、匹配滤波简单滤波dc_blocker、single_pole_iir、low_pass_filterDC 消除、一阶平滑其他hilbert_fc、filterbank、mmse_resampler希尔伯特变换、滤波器组、分数插值源码结构gr-filter/ ├── include/gnuradio/filter/ # API kernel 类fir_filter, fft_filter, pfb_* ├── lib/ # *_impl.cc firdes.cc pm_remez.cc ├── python/filter/ # PyBind11 optfir.py pfb.py └── grc/ # GRC 块定义接口调用总入口fromgnuradioimportfilter,gr,fft# 设计系数tapsfilter.firdes.low_pass(gain1.0,sampling_freqfs,cutoff_freqfc,transition_widthtw,windowfft.window.WIN_HAMMING)# 使用滤波器lpffilter.fir_filter_fff(1,taps)# decim1 普通 FIRtb.connect(src,lpf,dst)2. FIR/IIR 滤波器底层源码实现2.1 FIR 核心公式离散卷积FIR[y[n] \sum_{k0}^{N-1} h[k] \cdot x[n-k]]传递函数(H(z) \sum_{k0}^{N-1} h[k] z^{-k})2.2 FIR 架构Kernel Block 两层Kernel 类include/gnuradio/filter/fir_filter.h纯算法可被多块复用。OUT_T filter(const IN_T input[]) const; void filterN(OUT_T output[], const IN_T input[], unsigned long n); void filterNdec(OUT_T output[], ..., unsigned int decimate);Block 类fir_filter_blk_impl.cc包装为 GNU Radio 块。if (this-decimation() 1) { d_fir.filterN(out, in, noutput_items); } else { d_fir.filterNdec(out, in, noutput_items, this-decimation()); }decimation1普通 FIRdecimation1FIR 抽取每 D 点输出 1 点set_history(ntaps)保留历史样本供卷积实现优化taps反转存储std::reverse适配卷积方向多份对齐 tapsd_aligned_taps处理非对齐输入float/complex 走VOLK点积内核2.3 IIR 核心公式Direct Form I 差分方程newstylefalse与 scipy/MATLAB 一致[y[n] \sum_{k1}^{M} a_k y[n-k] \sum_{k0}^{N} b_k x[n-k]][H(z) \frac{\sum_{k0}^{N} b_k z^{-k}}{1 \sum_{k1}^{M} a_k z^{-k}}]fftaps 前馈系数 (b_k)fbtaps 反馈系数 (a_k)(a_0) 被忽略文件iir_filter_ffd_impl.cc→ kerneliir_filteri,o,tap,acc2.4 firdesFIR 系数设计低通窗函数法firdes.cc理想低通冲激响应sinc[h[n] \frac{\sin(2\pi f_c n / f_s)}{\pi n} \cdot w[n], \quad n \neq 0][h[0] \frac{2 f_c}{f_s} \cdot w[0]]再归一化使 DC 增益 gain。流程作用场景用法接收音频 LPFfir_filter_fff(decim, taps)FM 去加重后音频滤波wfm_rcv中 FIR decim抗混叠抽取前 LPFIIR 去加重iir_filter_ffd(btaps, ataps)gr-analog fm_emph 使用涉及语法三层模板fir_filterIN_T, OUT_T, TAP_Tsync_decimatorFIR抽取Kernel/Block 分离volk::vector对齐内存接口调用importgnuradio.fftasfftfromgnuradioimportfilter# 设计 使用tapsfilter.firdes.low_pass(1.0,48000,5000,1000,fft.window.WIN_HAMMING)firfilter.fir_filter_fff(1,taps)# 普通 FIRfir_decimfilter.fir_filter_fff(4,taps)# 4 倍抽取 FIR# IIR来自 scipy 设计时 oldstyleFalseiirfilter.iir_filter_ffd(fftaps,fbtaps,oldstyleFalse)# GRC 层次块设计滤波一体lpffilter.low_pass_filter(1,samp_rate,cutoff,transition,window)#includegnuradio/filter/fir_filter_blk.hautofirgr::filter::fir_filter_blkfloat,float,float::make(1,taps);3. FFT 加速滤波原理与源码优化逻辑3.1 原理Overlap-Add / 频域卷积时域卷积等价于频域相乘[y[n] x[n] * h[n] \Leftrightarrow Y[k] X[k] \cdot H[k]]当 tap 数 (N) 较大时FFT 法复杂度约 (O(N\log N))优于直接卷积 (O(N \cdot L))。3.2 关键参数fft_filter.ccd_ntaps ntaps; d_fftsize (int)(2 * pow(2.0, ceil(log(double(ntaps)) / log(2.0)))); d_nsamples d_fftsize - d_ntaps 1;符号含义d_ntaps滤波器阶数d_fftsizeFFT 长度≥ 2×ntaps2 的幂d_nsamples每块有效输出样本数d_tail块间重叠相加的“尾巴”3.3 处理流程预计算对 taps 做 FFT →d_xformed_taps乘 (1/N) 缩放每块处理输入d_nsamples点 零填充 → 长度d_fftsize正向 FFT → 与d_xformed_taps相乘VOLK逆向 IFFT加上上一块d_tailoverlap-add输出前d_nsamples点保存新 tailvolk_32fc_x2_multiply_32fc_a(c, a, d_xformed_taps.data(), ...); d_invfft-execute(); for (j 0; j tailsize(); j) d_invfft-get_outbuf()[j] d_tail[j]; ... memcpy(d_tail[0], d_invfft-get_outbuf() d_nsamples, ...);3.4 何时用 FFT 滤波tap 很长数百~数千时比 FIR 直接卷积更快pfb_decimator可选use_fft_filtersTruefreq_xlating_fft_filter结合频移流程作用广播/宽信道、高阶 LPF、大 tap 数信道化中的性能优化路径。接口调用# FFT 滤波块支持 decimationfft_firfilter.fft_filter_fff(decimation4,tapstaps,nthreads1)fft_fir_ccffilter.fft_filter_ccf(decimation1,tapstaps)4. 抽取/插值滤波、多相滤波架构4.1 插值 FIRinterp_fir_filter公式先插零再滤波等价于多相实现。插值 (L) 倍输出采样率 (f_s’ L \cdot f_s)多相分解原 taps (h[n]) 拆成 (L) 个子滤波器[h_r[k] h[r kL], \quad r 0,1,\ldots,L-1]每个输入样本依次通过 (L) 个子滤波器产生 (L) 个输出。继承sync_interpolator1 输入 : L 输出4.2 有理数重采样rational_resampler采样率变换[f_{out} f_{in} \cdot \frac{L}{M}](L)interpolation(M)decimation。多相 FIR 银行 计数器d_ctrwhile ((i noutput_items) (count ninput_items[0])) { out[i] d_firs[ctr].filter(in); ctr this-decimation(); while (ctr this-interpolation()) { ctr - this-interpolation(); in; count; } }每输入 1 点按相位ctr选子滤波器输出无用户 taps 时自动用 Kaiser 窗设计 LPFdesign_resampler_filter用std::gcd(L,M)约简降低复杂度4.3 多相滤波器组PFB通用架构核心思想把原型滤波器 (H(z)) 分解为 (N) 个多相分支[H(z) \sum_{k0}^{N-1} z^{-k} H_k(z^N)]块作用pfb_decimator_ccf(N) 路输入 → 选 1 路信道输出抽取选频pfb_interpolator_ccf1 路 → (N) 路插值合成pfb_channelizer_ccf宽输入 → 多窄带信道FFT 信道化pfb_synthesizer_ccf多信道 → 宽输出合成pfb_decimator还含复数旋转器 (e^{j2\pi k \cdot \text{chan}/N}) 选信道。流程作用ADC 高采样率 → [抽取 FIR] → 低采样率基带 音频 48k → [插值 FIR] → 240k 供 FM 调制 任意 L/M → [rational_resampler] → 统一采样率 宽频谱 → [pfb_channelizer] → 多路窄带信道接口调用# 插值interpfilter.interp_fir_filter_fff(interpolation4,tapstaps)# 有理数重采样 48k → 44.1k 类场景rrfilter.rational_resampler_fff(interpolation441,decimation480,taps[],fractional_bw0.4)# PFB 抽取8 选 1 信道pfb_decfilter.pfb_decimator_ccf(decim8,tapstaps,channel0)# PFB 插值pfb_intfilter.pfb_interpolator_ccf(interp8,tapstaps)# PFB 信道化chanfilter.pfb_channelizer_ccf(numchans8,tapstaps)5. 任意重采样模块底层原理块名pfb_arb_resampler_xxxKernelpfb_arb_resampler.cc5.1 目标实现任意比率重采样 (f_{out} r \cdot f_{in})(r) 为任意浮点数如 1.037。5.2 原理多相滤波器 线性插值设滤波器组数 (N )filter_size即d_int_rate整数部分(D \lfloor N/r \rfloor)小数部分(f N/r - D)d_flt_rate每输出 1 点用第 (j) 个子滤波器 FIR 得 (o_0)用差分滤波器得 (o_1)(H’(z)) 近似线性插值(y o_0 o_1 \cdot \text{acc})累加器d_acc按小数步进更新溢出时推进输入o0 d_filters[j].filter(input[i_in]); o1 d_diff_filters[j].filter(input[i_in]); output[i_out] o0 o1 * d_acc;差分 taps 由[-1, 1]差分器作用于原型 taps 得到用于子样本级插值。5.3 与 rational_resampler 对比rational_resamplerpfb_arb_resampler比率有理数 L/M任意浮点 r精度精确近似插值复杂度较低较高双滤波器组流程作用音频设备采样率不匹配48000 ↔ 44100符号时钟恢复后的分数重采样软件无线电中非标比率变换接口调用# 浮点 → 浮点重采样到 1.2 倍arbfilter.pfb_arb_resampler_fff(rate1.2,tapstaps,filter_size32)# 复数arb_ccffilter.pfb_arb_resampler_ccf(rate0.8,tapstaps,filter_size32)6. 通信专用 RRC/升余弦、高斯滤波源码设计入口firdes.cc GRC 变量块variable_rrc_filter_taps6.1 根升余弦RRC用途发送端脉冲成形接收端匹配滤波。发送接收 RRC 级联 ≈ 升余弦消除 ISI。频域滚降系数 (\alpha \in [0,1])时域firdes::root_raised_cosine(T_s 1/\text{symbol_rate})(spb f_s \cdot T_s)[h(t) \frac{4\alpha}{\pi\sqrt{T_s}} \cdot\frac{\cos((1\alpha)\pi t/T_s) \frac{\sin((1-\alpha)\pi t/T_s)}{4\alpha t/T_s}}{1 - (4\alpha t/T_s)^2}](t0) 及分母为 0 处用极限值处理见源码if (fabs(x3) 0.000001)分支。6.2 高斯滤波用途GFSK/MSK如蓝牙、GSM频谱成形限制带外辐射。公式firdes::gaussian[h[n] \exp\left(-\frac{1}{2}\left(\frac{s \cdot n \cdot T_s}{T_{sym}}\right)^2\right)]其中 (s \frac{1}{\sqrt{\ln 2 / (2\pi^2 B T^2)}})(BT) 为带宽-符号时间积bt参数。6.3 升余弦RCfirdes也提供raised_cosine非 root用于理论分析或特殊链路实际通信多用RRC 对。流程作用比特流 → [RRC 成形 FIR] → 上变频 → 信道 ↓ 限制带宽、控制 ISI GFSK: 比特 → [高斯 FIR] → 频率调制接口调用# 直接设计 tapsrrc_tapsfilter.firdes.root_raised_cosine(gain1.0,sampling_freq8e6,# 8 样点/符号symbol_rate1e6,# 1 Mspsalpha0.35,# 滚降ntaps11*8)# 通常 8~16 倍 spbgauss_tapsfilter.firdes.gaussian(gain1.0,spb8,bt0.35,ntaps4*8)# 使用rrc_firfilter.fir_filter_fff(1,rrc_taps)# GRC 层次块rrc_blkfilter.root_raised_cosine_filter(gain1.0,sample_ratefs,symbol_rateRs,alpha0.35,ntaps101)# 优化设计需 scipyfromgnuradio.filterimportoptfir tapsoptfir.low_pass(1,fs,passband,stopband,ripple,atten)7. DC 消除、简单高低通滤波7.1 DC Blockerdc_blocker_ff_impl.cc问题IQ 接收机常有 DC 偏置影响解调/频谱。原理(H(z) \frac{1 - z^{-D}}{1 - z^{-D}/D}) 的滑动平均实现近似高通截止 (\approx f_s/(2\pi D))。短形式long_formFalse[y[n] x[n-D1] - \text{MA}_2(\text{MA}_1(x[n]))]长形式四级滑动平均 延迟线阻带更深。y1 d_ma_0.filter(in[i]); y2 d_ma_1.filter(y1); out[i] d_ma_0.delayed_sig() - y2;流程作用USRP/IQ 接收最前端解调之前。7.2 单极点 IIRsingle_pole_iir_filter_ff一阶 IIR 低通[y[n] \alpha x[n] (1-\alpha) y[n-1]](\alpha) 越小截止频率越低。流程作用极简平滑、慢变 DC 跟踪比 dc_blocker 更简单。7.3 简单高低通GRC 层次块 firdeslow_pass_filter、high_pass_filter、band_pass_filter等内部 firdes.low_pass(...)fir_filter_fff(1, taps)低通 firdes 公式见第 2 节 sinc × 窗。高通频谱反转低通[h_{HP}[n] h_{LP}[n] \cdot (-1)^n \quad \text{或等效频域变换}]接口调用# DC 消除dcfilter.dc_blocker_ff(D32,long_formTrue)# floatdc_cfilter.dc_blocker_cc(D32,long_formFalse)# complex# 单极点 IIR 低通iir1filter.single_pole_iir_filter_ff(alpha0.01)# 简单低通设计滤波一体lpffilter.low_pass_filter(gain1.0,samp_rate48000,cutoff_freq5000,transition_width1000,windowfft.window.WIN_HAMMING)hpffilter.high_pass_filter(1.0,48000,200,500,fft.window.WIN_HAMMING)bpffilter.band_pass_filter(1.0,48000,200,4000,500,fft.window.WIN_HAMMING)总览典型信号处理流程发射链比特root_raised_cosine FIRinterp_fir_filter 上采样上变频接收链USRP IQdc_blocker_ccfreq_xlating_fir_filter 或 mixFIRrational_resampler 或 pfb_arbfir_filter 信道 LPF解调器 gr-analog语法知识汇总语法/模式示例位置用途三层模板IN,OUT,TAPfir_filter_blk,rational_resampler多类型支持Kernel Block 分离kernel::fir_filterfir_filter_blk_impl算法复用sync_decimator/interpolatorFIR decim, interp_fir固定比率多速率blockgeneral_workrational_resampler任意 consume/produce多相 taps 分解rational_resampler, pfb_*高效多速率VOLK SIMDfir_filter, fft_filter卷积加速FFT overlap-addfft_filter.cc长 FIR 加速set_history/set_relative_rate多速率块调度器配合firdes静态设计类firdes.cc系数生成pm_remez等波纹最优 FIR精确通带设计std::gcd约简rational_resampler降低多相数std::deque延迟线dc_blocker滑动平均Python 快速参考功能调用设计 LPF tapsfilter.firdes.low_pass(gain, fs, fc, tw, window)设计 RRCfilter.firdes.root_raised_cosine(gain, fs, sym_rate, alpha, ntaps)设计高斯filter.firdes.gaussian(gain, spb, bt, ntaps)FIR 滤波filter.fir_filter_fff(decim, taps)IIR 滤波filter.iir_filter_ffd(b, a, oldstyleFalse)FFT FIRfilter.fft_filter_fff(decim, taps)插值filter.interp_fir_filter_fff(L, taps)有理重采样filter.rational_resampler_fff(L, M, taps, fractional_bw0.4)任意重采样filter.pfb_arb_resampler_ccf(rate, taps, filter_size32)PFB 信道化filter.pfb_channelizer_ccf(numchans, taps)DC 消除filter.dc_blocker_cc(D, long_form)频移滤波filter.freq_xlating_fir_filter_ccc(center_freq, samp_rate, taps)与 gr-analog / gr-blocks 的分工模块职责gr-filter滤波、多速率、系数设计、RRC/高斯gr-analogFM/AM 调制解调调用 gr-filter 做音频 LPFgr-fftFFT 引擎、窗函数gr-blocks基础数学、类型转换例如wfm_rcv中quadrature_demod_cfanalogfir_filter_ffffilterfm_deemphanalog 的 IIR。