【MATLAB源码】5G/6G:Farrow结构采样率转换器

来源:这里教程网 时间:2026-03-03 23:20:01 作者:

???? Farrow 结构采样率转换器

基于多项式插值的任意比例采样率转换完整实现     Farrow 结构 + 积分-转储架构 + 定点硬件模型


???? 为什么选择 Farrow 结构?

在 5G NR 基带处理、软件无线电 (SDR) 和音视频处理中, 任意比例采样率转换是核心需求。传统多相滤波器需要为每个分数延迟存储一组系数,当转换比例为非整数或需要运行时可调时,存储和设计复杂度急剧上升。本平台基于 Farrow 结构——一种将滤波器系数用多项式表示的优雅架构,彻底解决了这一痛点。

痛点 (传统多相滤波器) 本平台解决方案 (Farrow 结构)
???? 系数存储量大 多项式压缩:8×5 = 40 系数代替 16×∞ 组系数
???? 比例固定 任意比例:运行时计算分数延迟,无需重新设计
???? 非整数比例困难 天然支持:30.72 → 50.00 Msps 等任意转换
⚙️ 硬件实现复杂 定点友好:Horner 规则 + 位移代替除法
???? 插值抽取需分别设计 统一架构:插值/抽取共享同一套系数

???? 核心价值

???? 学术研究价值

理论完整:从采样定理到多项式插值的完整推导 对称性利用:线性相位滤波器系数存储减半 设计流程:SRRC 原型 → 多相分解 → 多项式拟合 误差分析:拟合误差 < 0.1%,定点 SNR > 60dB

???? 工程应用价值

5G NR 就绪:30.72 ↔ 122.88 Msps 无缝转换 双模式仿真:浮点验证 + 定点硬件模型 即插即用:标准化 API,快速集成 全中文注释:适合团队协作与二次开发

⚡ 技术亮点

???? 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);

采样率转换三场景演示.png Farrow 系数设计流程.png


???? 获取方式

本文代码仅为核心片段,完整版工程已整理好。关注公众号 【 3GPP仿真实验室】进行获取。

相关推荐