基于多项式插值的任意比例采样率转换完整实现
Farrow 结构 + 积分-转储架构 + 定点硬件模型
在 5G NR 基带处理、软件无线电 (SDR) 和音视频处理中, 任意比例采样率转换是核心需求。传统多相滤波器需要为每个分数延迟存储一组系数,当转换比例为非整数或需要运行时可调时,存储和设计复杂度急剧上升。本平台基于 Farrow 结构——一种将滤波器系数用多项式表示的优雅架构,彻底解决了这一痛点。
| 痛点 (传统多相滤波器) | 本平台解决方案 (Farrow 结构) |
|---|---|
| 📦 系数存储量大 | ✅ 多项式压缩:8×5 = 40 系数代替 16×∞ 组系数 |
| 🔒 比例固定 | ✅ 任意比例:运行时计算分数延迟,无需重新设计 |
| 🧮 非整数比例困难 | ✅ 天然支持:30.72 → 50.00 Msps 等任意转换 |
| ⚙️ 硬件实现复杂 | ✅ 定点友好:Horner 规则 + 位移代替除法 |
| 🔄 插值抽取需分别设计 | ✅ 统一架构:插值/抽取共享同一套系数 |
🔬 学术研究价值
|
💼 工程应用价值
|
| 特性 | 传统多相滤波器 | Farrow 结构 (本平台) |
| :--- | :--- | :--- |
| 系数存储 | L 组×M 抽头 | 1 组多项式系数 |
| 任意比例 | 需重新设计 | 运行时计算 |
| 硬件复杂度 | 大系数存储器 | 多项式计算器 |
| 灵活性 | 固定比例 | 动态可调 |
基于
demo_resampling.m实测结果
| 场景 | 转换比例 | 浮点误差 | 定点误差 | 说明 |
| :---: | :---: | :---: | :---: | :---: |
| 4倍插值 | 30.72 → 122.88 | < 1e-10 | < 1e-3 | ✅ 整数比例 |
| 4倍抽取 | 122.88 → 30.72 | < 1e-10 | < 1e-3 | ✅ 整数比例 |
| 非整数 | 122.88 → 50.00 | < 1e-10 | < 1e-3 | 🚀 任意比例 |
| 索引 | 类型 | 滚降因子 α | 适用场景 |
| :---: | :--- | :---: | :--- |
| 0 | 通用 FIR | - | BW/Fs ≤ 0.8 |
| 1 | SRRC | 0.15 | 高频谱效率 (5G NR) |
| 2 | SRRC | 0.20 | 平衡选择 |
| 3 | SRRC | 0.25 | 低时域旁瓣 |
Farrow/ ├── src/ # 核心源代码 │ ├── core/ # 核心算法 │ │ ├── resample_interpolate.m # 任意比例插值器 │ │ └── resample_decimate.m # 任意比例抽取器 │ ├── filters/ # 滤波器系数 │ │ └── get_shaping_coeffs.m # 成形滤波器选择器 │ └── utils/ # 工具函数 │ ├── compute_freq_inverse.m # 频率倒数 (定点) │ ├── compute_decim_gain.m # 增益补偿 (定点) │ ├── quantize_complex.m # 复数量化 │ └── quantize_unsigned.m # 无符号量化 ├── examples/ # 示例脚本 │ ├── demo_resampling.m # 三场景采样率转换演示 │ └── demo_poly_fitting.m # 系数设计流程演示 ├── tests/ # 测试脚本 └── docs/ # 文档 ├── 算法文档.md # 理论推导 (900+ 行) └── 代码文档.md # API 参考
本平台提供 "算法+代码" 双轨制文档:
采样率转换基础、多项式插值理论、Farrow 结构原理、抽取/插值算法、定点实现、系数设计流程
完整 API 参考、输入输出说明、快速入门示例、定点格式规范
src/core/resample_interpolate.m)function out = resample_interpolate(in, f_in, f_out, filter_idx, fix_en) % RESAMPLE_INTERPOLATE 任意比例升采样器(Farrow 结构) % % 原理: 多项式插值 + 相位累加器 % h_m(μ) = Σ P(m,n) × μ^n (μ 为分数延迟) % % 对称性: 16 抽头滤波器拆分为两个 8 抽头部分 % 前半: μ^k 加权 % 后半: (1-μ)^k 加权 % 获取多项式系数矩阵 (8×5) P = get_shaping_coeffs(filter_idx); while k <= length(out) % 计算分数延迟 mu = f / f_out; % FIR 卷积 + 多项式求值 out(k) = sum1 * mu.^(4:-1:0).' + sum2 * (1-mu).^(4:-1:0).'; % 相位累加器更新 f = f + f_in; if f >= f_out f = f - f_out; shift_reg = [in(idx); shift_reg(1:end-1)]; end end end
src/core/resample_decimate.m)function out = resample_decimate(in, f_in, f_out, filter_idx, fix_en) % RESAMPLE_DECIMATE 任意比例降采样器(积分-转储架构) % % 积分阶段: 每个输入样本按 (1-μ)^k 和 μ^k 加权累加 % 转储阶段: 相位溢出时输出,同时进行增益补偿 while i <= length(in) % 积分累加 integ_value1 = integ_value1 + in(i) .* (1-mu).^(4:-1:0); integ_value2 = integ_value2 + in(i) .* mu.^(4:-1:0); f = f + f_out; if f >= f_in % 转储触发 f = f - f_in; % 多项式滤波 + 增益补偿 out(k) = (y1 + y2) * (f_out / f_in); end end end
src/filters/get_shaping_coeffs.m)function P = get_shaping_coeffs(index) % GET_SHAPING_COEFFS 成形滤波器多项式系数 % % 系数格式: r15s12 (15位有符号, 12位小数) % 矩阵结构: 8×5 (抽头 × 多项式阶数) % % 每行: h_m(μ) = P(m,1)·μ^4 + P(m,2)·μ^3 + ... + P(m,5) switch(index) case 1 % SRRC α=0.15 P = [ 132, -59, -210, 71, 23; -67, -226, 431, -31, -42; -65, 677, -711, -56, 65; 286, -1346, 1056, 206, -89; -623, 2319, -1494, -449, 113; 1103, -3790, 2126, 846, -134; -1370, 5866, -3213, -1594, 150; 679, -6664, 6667, 3737, -160] / 2^12; end end
>> addpath(genpath('src'));
>> cd examples
% 三场景采样率转换演示
>> demo_resampling
% 系数设计流程演示
>> demo_poly_fitting
三场景演示输出:
===== Farrow 采样率转换器演示 ===== 场景1: 4倍插值 (30720 → 122880 kHz) 输入长度: 1000, 输出长度: 3996 ✓ 转换成功 场景2: 4倍抽取 (122880 → 30720 kHz) 输入长度: 4000, 输出长度: 993 ✓ 转换成功 场景3: 非整数比例抽取 (122880 → 50000 kHz) 输入长度: 2000, 输出长度: 814 ✓ 转换成功
flowchart LR A[SRRC 原型滤波器<br>Span=16, L=8] --> B[128 系数] B --> C[16 组 × 8 点] C --> D[对称性: 8 组] D --> E[4阶 polyfit] E --> F[8×5 = 40 系数] F --> G[×2^12 定点化]
| 步骤 | 输入 | 输出 | 压缩率 |
| :--- | :--- | :--- | :---: |
| 原型滤波器 | α=0.15, Span=16 | 128 系数 | - |
| 多相分解 | 128 系数 | 16×8 矩阵 | - |
| 对称性利用 | 16×8 | 8×8 | 50% |
| 多项式拟合 | 8×8 | 8×5 | 37.5% |
| 总压缩 | 128 系数 | 40 系数 | 69% |
| 信号 | 格式 | 位宽 | 说明 |
| :--- | :--- | :---: | :--- |
| 输入/输出数据 | c16s13 | 16 | 复数有符号,13位小数 |
| 滤波器系数 | r15s12 | 15 | 有符号,12位小数 |
| 分数延迟 μ | r12u12 | 12 | 无符号纯小数 |
| 积分累加器 | c32s17 | 32 | 复数宽累加器 |
| 增益系数 | r8u8 | 8 | 无符号纯小数 |
% ADC 采样率 → 基带符号率 y = resample_decimate(adc_samples, 122880, 30720, 1, 1); % 基带符号率 → DAC 采样率 y = resample_interpolate(baseband, 30720, 122880, 1, 1);
% 任意频率适配 y = resample_interpolate(signal, 48000, 50000, 0, 0);
% 补偿 0.3 采样点的定时偏差 phase_offset = 0.3 * f_out; y = resample_interpolate(x, f_in, f_out, 1, 0, phase_offset);

本文代码仅为核心片段,完整版工程已整理好。关注公众号 【 3GPP仿真实验室】进行获取。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049237/viewspace-3109877/ ,如需转载,请注明出处,否则将追究法律责任。