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

2 阅读7分钟

🎯 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
1SRRC0.15高频谱效率 (5G NR)
2SRRC0.20平衡选择
3SRRC0.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=16128 系数-
多相分解128 系数16×8 矩阵-
对称性利用16×88×850%
多项式拟合8×88×537.5%
总压缩128 系数40 系数69%

🔧 定点格式规范

信号格式位宽说明
输入/输出数据c16s1316复数有符号,13位小数
滤波器系数r15s1215有符号,12位小数
分数延迟 μr12u1212无符号纯小数
积分累加器c32s1732复数宽累加器
增益系数r8u88无符号纯小数

🚀 典型应用场景

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

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


🛒 获取方式

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