🎯 Farrow 结构采样率转换器
基于多项式插值的任意比例采样率转换完整实现
Farrow 结构 + 积分-转储架构 + 定点硬件模型
📌 为什么选择 Farrow 结构?
在 5G NR 基带处理、软件无线电 (SDR) 和音视频处理中,任意比例采样率转换是核心需求。传统多相滤波器需要为每个分数延迟存储一组系数,当转换比例为非整数或需要运行时可调时,存储和设计复杂度急剧上升。本平台基于 Farrow 结构——一种将滤波器系数用多项式表示的优雅架构,彻底解决了这一痛点。
| 痛点 (传统多相滤波器) | 本平台解决方案 (Farrow 结构) |
|---|---|
| 📦 系数存储量大 | ✅ 多项式压缩:8×5 = 40 系数代替 16×∞ 组系数 |
| 🔒 比例固定 | ✅ 任意比例:运行时计算分数延迟,无需重新设计 |
| 🧮 非整数比例困难 | ✅ 天然支持:30.72 → 50.00 Msps 等任意转换 |
| ⚙️ 硬件实现复杂 | ✅ 定点友好:Horner 规则 + 位移代替除法 |
| 🔄 插值抽取需分别设计 | ✅ 统一架构:插值/抽取共享同一套系数 |
🎯 核心价值
🔬 学术研究价值
|
💼 工程应用价值
|
⚡ 技术亮点
🌊 Farrow vs 传统多相滤波器
| 特性 | 传统多相滤波器 | 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 | 低时域旁瓣 |
🖥️ 运行环境
- MATLAB 版本: R2023b 或 R2024b (推荐)
- 依赖工具箱:
- Signal Processing Toolbox (推荐)
- Communications Toolbox (可选)
📁 项目结构
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 参考、输入输出说明、快速入门示例、定点格式规范
💻 核心代码展示
🔥 Farrow 插值器核心 (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 | 无符号纯小数 |
🚀 典型应用场景
📡 5G NR 基带处理
% ADC 采样率 → 基带符号率
y = resample_decimate(adc_samples, 122880, 30720, 1, 1);
% 基带符号率 → DAC 采样率
y = resample_interpolate(baseband, 30720, 122880, 1, 1);
🛰️ 软件无线电 (SDR)
% 任意频率适配
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仿真实验室】进行获取。