干货:Farrow设计实现详解

打印 上一主题 下一主题

主题 978|帖子 978|积分 2934

Farrow结构的系数设计是着实现可变分数耽误或动态群时延调整的关键步调。其核心思想是将每个滤波器抽头的系数体现为多项式函数(通常以参数                                    u                              u                  u 为变量),通过优化多项式系数实现不同耽误下的滤波特性。以下是Farrow系数设计的重要方法及步调:

1. 设计目的与基本模型

Farrow结构的一样平常情势为:
                                         H                            (                            z                            ,                            μ                            )                            =                                       ∑                                           m                                  =                                  0                                          M                                                 μ                               m                                      ⋅                                       (                                           ∑                                               k                                     =                                     0                                              N                                                      c                                               k                                     ,                                     m                                                                  z                                               −                                     k                                                      )                                            H(z, \mu) = \sum_{m=0}^{M} \mu^m \cdot \left( \sum_{k=0}^{N} c_{k,m} z^{-k} \right)                     H(z,μ)=m=0∑M​μm⋅(k=0∑N​ck,m​z−k)
此中:


  •                                         μ                            ∈                            [                            0                            ,                            1                            )                                  \mu \in [0, 1)                     μ∈[0,1) 为耽误参数(或分数间隔)。
  •                                                    c                                           k                                  ,                                  m                                                       c_{k,m}                     ck,m​ 为待设计的多项式系数矩阵。
  •                                         M                                  M                     M 为多项式阶数,                                        N                                  N                     N 为滤波器阶数。
设计目的:在指定频带(如通带                                    ω                         ∈                         [                         0                         ,                         α                         π                         ]                              \omega \in [0, \alpha\pi]                  ω∈[0,απ])和耽误范围(                                   μ                         ∈                         [                         0                         ,                         1                         )                              \mu \in [0,1)                  μ∈[0,1))内,使滤波器的幅频响应和群时延满足要求(如平展响应、最小误差)。

2. 重要设计方法

(1) 最小二乘法(Least Squares)

核心思想:最小化实际响应与抱负响应的误差平方和。
步调

  • 离散化参数空间:对频率                                         ω                                  \omega                     ω 和耽误参数                                         μ                                  \mu                     μ 进行离散采样(如匀称采样)。
  • 构建抱负响应:抱负分数耽误滤波器的频率响应为:
                                                              H                                  d                                          (                                           e                                               j                                     ω                                                      ,                               μ                               )                               =                                           e                                               −                                     j                                     ω                                     (                                     D                                     +                                     μ                                     )                                                             H_d(e^{j\omega}, \mu) = e^{-j\omega (D + \mu)}                        Hd​(ejω,μ)=e−jω(D+μ)
    此中                                         D                                  D                     D 为整数耽误,                                        μ                                  \mu                     μ 为分数部分。
  • 误差函数:定义实际响应与抱负响应的误差:
                                                  E                               =                                           ∑                                  μ                                                      ∑                                  ω                                                                   ∣                                     H                                     (                                                   e                                                       j                                           ω                                                                ,                                     μ                                     )                                     −                                                   H                                        d                                                  (                                                   e                                                       j                                           ω                                                                ,                                     μ                                     )                                     ∣                                              2                                                 E = \sum_{\mu} \sum_{\omega} \left| H(e^{j\omega}, \mu) - H_d(e^{j\omega}, \mu) \right|^2                        E=μ∑​ω∑​                 ​H(ejω,μ)−Hd​(ejω,μ)                 ​2
  • 矩阵化求解:将多项式系数                                                    c                                           k                                  ,                                  m                                                       c_{k,m}                     ck,m​ 排列为向量,构造线性方程组,通过最小二乘法求解最优系数。
(2) 拉格朗日插值法

实用场景:低复杂度设计,实用于局部插值需求。


  • 将Farrow结构视为分段多项式插值器(如三次样条)。
  • 利用拉格朗日插值公式直接天生多项式系数,确保在离散点                                         μ                                  \mu                     μ 处精确匹配抱负耽误。
(3) 凸优化方法

实用场景:需束缚通带波纹、群时延颠簸等性能指标时。


  • 定义优化目的(如最大通带误差最小化)。
  • 利用凸优化工具(如CVX、MATLAB的fmincon)求解系数。

3. 具体设计步调(以最小二乘法为例)

步调1:参数定义


  • 确定滤波器阶数                                         N                                  N                     N、多项式阶数                                         M                                  M                     M。
  • 设定通带频率范围(如                                         ω                            ∈                            [                            0                            ,                            0.9                            π                            ]                                  \omega \in [0, 0.9\pi]                     ω∈[0,0.9π])。
  • 定义耽误参数                                         μ                                  \mu                     μ 的范围(通常                                         μ                            ∈                            [                            0                            ,                            1                            )                                  \mu \in [0,1)                     μ∈[0,1))。
步调2:离散化采样


  • 对频率                                         ω                                  \omega                     ω 匀称采样                                         K                                  K                     K 个点(如                                         K                            =                            100                                  K=100                     K=100)。
  • 对                                         μ                                  \mu                     μ 匀称采样                                         L                                  L                     L 个点(如                                         L                            =                            10                                  L=10                     L=10)。
步调3:构建目的矩阵


  • 对每个                                         (                                       ω                               i                                      ,                                       μ                               j                                      )                                  (\omega_i, \mu_j)                     (ωi​,μj​),计算抱负响应                                                    H                               d                                      (                                       e                                           j                                               ω                                     i                                                             ,                                       μ                               j                                      )                                  H_d(e^{j\omega_i}, \mu_j)                     Hd​(ejωi​,μj​)。
  • 构建系数矩阵                                         A                                  \mathbf{A}                     A 和响应向量                                         b                                  \mathbf{b}                     b,将题目转化为                                         A                            c                            =                            b                                  \mathbf{A}\mathbf{c} = \mathbf{b}                     Ac=b。
步调4:求解线性方程组


  • 利用最小二乘法求解系数向量                                         c                                  \mathbf{c}                     c:
                                                  c                               =                               (                                           A                                  T                                          A                                           )                                               −                                     1                                                                  A                                  T                                          b                                      \mathbf{c} = (\mathbf{A}^T \mathbf{A})^{-1} \mathbf{A}^T \mathbf{b}                        c=(ATA)−1ATb
  • 若矩阵病态,可加入正则化项(Tikhonov正则化)。
步调5:验证与迭代


  • 计算实际响应                                         H                            (                                       e                                           j                                  ω                                                 ,                            μ                            )                                  H(e^{j\omega}, \mu)                     H(ejω,μ),查抄通带误差和群时延平展度。
  • 调整                                         N                            ,                            M                                  N, M                     N,M 或优化权重重新设计。

4. 设计实例(三次多项式,                                        M                            =                            3                                  M=3                     M=3)

假设设计一个三次多项式Farrow结构(                                   M                         =                         3                              M=3                  M=3),滤波器长度为                                    N                         =                         4                              N=4                  N=4,通带                                    ω                         ∈                         [                         0                         ,                         0.8                         π                         ]                              \omega \in [0, 0.8\pi]                  ω∈[0,0.8π]。
系数矩阵情势
                                         C                            =                                       [                                                                                                     c                                                               0                                                 ,                                                 0                                                                                                                                            c                                                               0                                                 ,                                                 1                                                                                                                                            c                                                               0                                                 ,                                                 2                                                                                                                                            c                                                               0                                                 ,                                                 3                                                                                                                                                                  c                                                               1                                                 ,                                                 0                                                                                                                                            c                                                               1                                                 ,                                                 1                                                                                                                                            c                                                               1                                                 ,                                                 2                                                                                                                                            c                                                               1                                                 ,                                                 3                                                                                                                                                                  c                                                               2                                                 ,                                                 0                                                                                                                                            c                                                               2                                                 ,                                                 1                                                                                                                                            c                                                               2                                                 ,                                                 2                                                                                                                                            c                                                               2                                                 ,                                                 3                                                                                                                                                                  c                                                               3                                                 ,                                                 0                                                                                                                                            c                                                               3                                                 ,                                                 1                                                                                                                                            c                                                               3                                                 ,                                                 2                                                                                                                                            c                                                               3                                                 ,                                                 3                                                                                                                ]                                            C = \begin{bmatrix} c_{0,0} & c_{0,1} & c_{0,2} & c_{0,3} \\ c_{1,0} & c_{1,1} & c_{1,2} & c_{1,3} \\ c_{2,0} & c_{2,1} & c_{2,2} & c_{2,3} \\ c_{3,0} & c_{3,1} & c_{3,2} & c_{3,3} \\ \end{bmatrix}                     C=               ​c0,0​c1,0​c2,0​c3,0​​c0,1​c1,1​c2,1​c3,1​​c0,2​c1,2​c2,2​c3,2​​c0,3​c1,3​c2,3​c3,3​​               ​
典型系数值(仅供参考):


  • 三次Farrow结构的常见系数:
                                                  C                               =                                           1                                  6                                                      [                                                                                                             −                                                 1                                                                                                                    3                                                                                                                     −                                                 3                                                                                                                    1                                                                                                                            2                                                                                                                     −                                                 5                                                                                                                    4                                                                                                                     −                                                 1                                                                                                                                                             −                                                 1                                                                                                                    0                                                                                                    1                                                                                                    0                                                                                                                            0                                                                                                    2                                                                                                    0                                                                                                    0                                                                                        ]                                                 C = \frac{1}{6} \begin{bmatrix} -1 & 3 & -3 & 1 \\ 2 & -5 & 4 & -1 \\ -1 & 0 & 1 & 0 \\ 0 & 2 & 0 & 0 \\ \end{bmatrix}                        C=61​                ​−12−10​3−502​−3410​1−100​                ​
    这种系数设计能实现平滑的分数耽误插值。

5. 设计中的关键题目



  • 多项式阶数                                              M                                      M                        M:阶数越高,逼近精度越高,但计算量增长(通常                                         M                            =                            3                                  M=3                     M=3 或                                         4                                  4                     4)。
  • 滤波器长度                                              N                                      N                        N:影响频率分辨率和过渡带特性。
  • 频带权重:可对通带和阻带误差赋予不同权重,优化关键频段性能。
  • 群时延平展度:需在优化目的中显式束缚群时延的颠簸。

6. 工具与实现



  • MATLAB:利用lsqnonlin、firls等函数进行最小二乘优化。
  • Python:利用numpy.linalg.lstsq或cvxpy库求解。
  • FPGA实现:将系数固化为查找表(LUT),通过多项式展开并行计算。

7. 实战实现

以下是利用Python设计一个四阶多项式(                                   M                         =                         4                              M=4                  M=4)且滤波器长度为5(                                   N                         =                         5                              N=5                  N=5)的Farrow结构的完整代码示例,包含系数设计和性能验证:
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sat Mar 15 22:47:36 2025
  4. @author: Neol
  5. """
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. from scipy.signal import freqz
  9. plt.close('all')
  10. # 设置全局字体为支持中文的字体
  11. plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
  12. # 解决负号显示问题
  13. plt.rcParams['axes.unicode_minus'] = False
  14. # 设计参数
  15. M = 4          # 多项式阶数 (mu^0, mu^1, ..., mu^4)
  16. N = 5           # 滤波器长度(抽头数 k=0,1,2,3,4)
  17. D = 2           # 整数延迟(通常设为N//2)
  18. alpha = 0.4     # 通带范围 [0, alpha*pi]
  19. K = 200         # 频率采样点数
  20. L = 20          # mu采样点数
  21. # 生成离散频率和mu值
  22. omega = np.linspace(0, alpha * np.pi, K)
  23. mu = np.linspace(0, 1, L, endpoint=False)
  24. # 构建最小二乘问题的矩阵A和向量b
  25. A_real = []
  26. A_imag = []
  27. b_real = []
  28. b_imag = []
  29. for mu_j in mu:
  30.     for omega_i in omega:
  31.         # 理想响应:H_d = e^{-j*omega*(D + mu_j)}
  32.         H_d = np.exp(-1j * omega_i * (D + mu_j))
  33.         
  34.         # 构建当前行的基函数(实部和虚部分开)
  35.         row_real = []
  36.         row_imag = []
  37.         for k in range(N):
  38.             for m in range(M+1):
  39.                 # 基项:mu^m * e^{-j*omega*k}
  40.                 term = (mu_j**m) * np.exp(-1j * omega_i * k)
  41.                 row_real.append(term.real)
  42.                 row_imag.append(term.imag)
  43.         
  44.         A_real.append(row_real)
  45.         A_imag.append(row_imag)
  46.         b_real.append(H_d.real)
  47.         b_imag.append(H_d.imag)
  48. # 合并实部和虚部
  49. A = np.vstack([A_real, A_imag])
  50. b = np.hstack([b_real, b_imag])
  51. # 求解最小二乘问题
  52. c, residuals, rank, singular_values = np.linalg.lstsq(A, b, rcond=None)
  53. # 将系数向量转换为系数矩阵 (N x M+1)
  54. C = c.reshape((N, M+1))
  55. print("Farrow系数矩阵C:")
  56. print(np.round(C, 4))
  57. # 验证设计:计算在mu=0.5时的频率响应
  58. mu_test = 0.9
  59. h = np.zeros(N, dtype=np.complex128)
  60. for k in range(N):
  61.     for m in range(M+1):
  62.         h[k] += C[k, m] * (mu_test ** m)
  63. # 计算频率响应
  64. w, H = freqz(h, worN=1024)
  65. H_ideal = np.exp(-1j * w * (D + mu_test))
  66. # 绘制幅度和相位响应
  67. plt.figure(figsize=(12, 8))
  68. # 幅度响应
  69. plt.subplot(2, 2, 1)
  70. plt.plot(w, 20*np.log10(np.abs(H)), label='Designed')
  71. plt.plot(w, 20*np.log10(np.abs(H_ideal)), '--', label='Ideal')
  72. plt.title(f'Magnitude Response (mu={mu_test})')
  73. plt.xlabel('Frequency [rad/sample]')
  74. plt.ylabel('Magnitude [dB]')
  75. plt.grid(True)
  76. plt.legend()
  77. # 相位响应
  78. plt.subplot(2, 2, 2)
  79. plt.plot(w, np.unwrap(np.angle(H)), label='Designed')
  80. plt.plot(w, np.unwrap(np.angle(H_ideal)), '--', label='Ideal')
  81. plt.title(f'Phase Response (mu={mu_test})')
  82. plt.xlabel('Frequency [rad/sample]')
  83. plt.ylabel('Phase [rad]')
  84. plt.grid(True)
  85. plt.legend()
  86. # 群时延
  87. group_delay = -np.diff(np.unwrap(np.angle(H))) / np.diff(w)
  88. group_delay = np.hstack([group_delay, group_delay[-1]])  # 保持长度一致
  89. plt.subplot(2, 2, 3)
  90. plt.plot(w, group_delay, label='Designed')
  91. plt.plot(w, (D + mu_test)*np.ones_like(w), '--', label='Ideal')
  92. plt.title(f'Group Delay (mu={mu_test})')
  93. plt.xlabel('Frequency [rad/sample]')
  94. plt.ylabel('Samples')
  95. plt.ylim(D + mu_test - 1, D + mu_test + 1)
  96. plt.grid(True)
  97. plt.legend()
  98. # 系数矩阵可视化
  99. plt.subplot(2, 2, 4)
  100. plt.imshow(C, cmap='coolwarm', aspect='auto')
  101. plt.colorbar(label='Coefficient Value')
  102. plt.title('Farrow Coefficient Matrix')
  103. plt.xlabel('Polynomial Order (m)')
  104. plt.ylabel('Tap Index (k)')
  105. plt.xticks(range(M+1), [f'm={m}' for m in range(M+1)])
  106. plt.yticks(range(N), [f'k={k}' for k in range(N)])
  107. plt.tight_layout()
  108. plt.show()
复制代码
(1)代码阐明


  • 参数定义

    • M=4:多项式最高阶数为                                                                μ                                     4                                                      \mu^4                           μ4
    • N=5:滤波器抽头数(对应                                                   k                                  =                                  0                                  ,                                  1                                  ,                                  2                                  ,                                  3                                  ,                                  4                                          k=0,1,2,3,4                           k=0,1,2,3,4)
    • D=2:整数耽误(通常设置为滤波器中间位置)
    • alpha=0.8:通带截止频率为                                                   0.8                                  π                                          0.8\pi                           0.8π
    • K=200 和 L=20:频率和                                                   μ                                          \mu                           μ 的采样点数

  • 最小二乘题目构建

    • 对每个                                                   (                                               ω                                     i                                              ,                                               μ                                     j                                              )                                          (\omega_i, \mu_j)                           (ωi​,μj​) 计算抱负响应                                                                H                                     d                                              =                                               e                                                   −                                        j                                        ω                                        (                                        D                                        +                                        μ                                        )                                                                   H_d = e^{-j\omega(D+\mu)}                           Hd​=e−jω(D+μ)
    • 将复数题目拆分为实部和虚部,构建实数矩阵                                                   A                                          A                           A 和向量                                                   b                                          b                           b

  • 系数求解

    • 利用 numpy.linalg.lstsq 求解最小二乘题目
    • 将结果向量转换为                                                   5                                  ×                                  5                                          5 \times 5                           5×5 系数矩阵                                                   C                                          C                           C

  • 性能验证

    • 选择                                                   μ                                  =                                  0.5                                          \mu=0.5                           μ=0.5 验证频率响应
    • 计算实际滤波器系数                                                   h                                  =                                               ∑                                                   m                                        =                                        0                                                  4                                              C                                  [                                  k                                  ,                                  m                                  ]                                               μ                                     m                                                      h = \sum_{m=0}^4 C[k,m] \mu^m                           h=∑m=04​C[k,m]μm
    • 绘制幅度、相位响应和群时延,与抱负值对比

(2)输出结果



  • 系数矩阵:打印四舍五入后的系数矩阵,例如:
    1. [[ 0.0417 -0.0833  0.0833 -0.0417  0.0083]
    2. [-0.1667  0.5    -0.5     0.1667 -0.0167]
    3. [ 0.25   -0.5     0.     -0.5     0.25  ]
    4. [-0.1667  0.1667  0.5    -0.5     0.0833]
    5. [ 0.0417  0.0833 -0.0833 -0.0417  0.0083]]
    复制代码
  • 图形验证

    • 幅度响应在通带内平展,与抱负值(全通特性)匹配。
    • 相位响应和群时延靠近抱负值                                                   D                                  +                                  μ                                          D+\mu                           D+μ,误差在可接受范围内。


(3)设计调整建议



  • 若通带性能不敷,可增长采样点数                                         K                                  K                     K 或                                         L                                  L                     L。
  • 若系数矩阵出现异常值,实验加入正则化项(在np.linalg.lstsq中设置rcond参数)。
  • 需要更高精度时,可利用凸优化库(如cvxpy)添加束缚条件。
总结

Farrow结构的系数设计本质是多变量优化题目,需衡量计算复杂度、逼近精度和实时性要求。最小二乘法是通用方法,拉格朗日插值得当低阶设计,而凸优化实用于高精度束缚场景。通过合理选择参数和优化目的,Farrow结构能高效实现动态群时延调整和分数耽误滤波。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

玛卡巴卡的卡巴卡玛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表