玛卡巴卡的卡巴卡玛 发表于 2025-3-16 11:19:29

干货:Farrow设计实现详解

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                         ,                         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                      ω∈)。
[*]定义耽误参数                                       μ                                  \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                   ω∈。
系数矩阵情势:
                                       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结构的完整代码示例,包含系数设计和性能验证:
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 15 22:47:36 2025

@author: Neol
"""

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz

plt.close('all')
# 设置全局字体为支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']# 黑体
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False


# 设计参数
M = 4          # 多项式阶数 (mu^0, mu^1, ..., mu^4)
N = 5         # 滤波器长度(抽头数 k=0,1,2,3,4)
D = 2         # 整数延迟(通常设为N//2)
alpha = 0.4   # 通带范围
K = 200         # 频率采样点数
L = 20          # mu采样点数

# 生成离散频率和mu值
omega = np.linspace(0, alpha * np.pi, K)
mu = np.linspace(0, 1, L, endpoint=False)

# 构建最小二乘问题的矩阵A和向量b
A_real = []
A_imag = []
b_real = []
b_imag = []

for mu_j in mu:
    for omega_i in omega:
      # 理想响应:H_d = e^{-j*omega*(D + mu_j)}
      H_d = np.exp(-1j * omega_i * (D + mu_j))
      
      # 构建当前行的基函数(实部和虚部分开)
      row_real = []
      row_imag = []
      for k in range(N):
            for m in range(M+1):
                # 基项:mu^m * e^{-j*omega*k}
                term = (mu_j**m) * np.exp(-1j * omega_i * k)
                row_real.append(term.real)
                row_imag.append(term.imag)
      
      A_real.append(row_real)
      A_imag.append(row_imag)
      b_real.append(H_d.real)
      b_imag.append(H_d.imag)

# 合并实部和虚部
A = np.vstack()
b = np.hstack()

# 求解最小二乘问题
c, residuals, rank, singular_values = np.linalg.lstsq(A, b, rcond=None)

# 将系数向量转换为系数矩阵 (N x M+1)
C = c.reshape((N, M+1))

print("Farrow系数矩阵C:")
print(np.round(C, 4))

# 验证设计:计算在mu=0.5时的频率响应
mu_test = 0.9
h = np.zeros(N, dtype=np.complex128)
for k in range(N):
    for m in range(M+1):
      h += C * (mu_test ** m)

# 计算频率响应
w, H = freqz(h, worN=1024)
H_ideal = np.exp(-1j * w * (D + mu_test))

# 绘制幅度和相位响应
plt.figure(figsize=(12, 8))

# 幅度响应
plt.subplot(2, 2, 1)
plt.plot(w, 20*np.log10(np.abs(H)), label='Designed')
plt.plot(w, 20*np.log10(np.abs(H_ideal)), '--', label='Ideal')
plt.title(f'Magnitude Response (mu={mu_test})')
plt.xlabel('Frequency ')
plt.ylabel('Magnitude ')
plt.grid(True)
plt.legend()

# 相位响应
plt.subplot(2, 2, 2)
plt.plot(w, np.unwrap(np.angle(H)), label='Designed')
plt.plot(w, np.unwrap(np.angle(H_ideal)), '--', label='Ideal')
plt.title(f'Phase Response (mu={mu_test})')
plt.xlabel('Frequency ')
plt.ylabel('Phase ')
plt.grid(True)
plt.legend()

# 群时延
group_delay = -np.diff(np.unwrap(np.angle(H))) / np.diff(w)
group_delay = np.hstack(])# 保持长度一致

plt.subplot(2, 2, 3)
plt.plot(w, group_delay, label='Designed')
plt.plot(w, (D + mu_test)*np.ones_like(w), '--', label='Ideal')
plt.title(f'Group Delay (mu={mu_test})')
plt.xlabel('Frequency ')
plt.ylabel('Samples')
plt.ylim(D + mu_test - 1, D + mu_test + 1)
plt.grid(True)
plt.legend()

# 系数矩阵可视化
plt.subplot(2, 2, 4)
plt.imshow(C, cmap='coolwarm', aspect='auto')
plt.colorbar(label='Coefficient Value')
plt.title('Farrow Coefficient Matrix')
plt.xlabel('Polynomial Order (m)')
plt.ylabel('Tap Index (k)')
plt.xticks(range(M+1), )
plt.yticks(range(N), )

plt.tight_layout()
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 \mu^m                           h=∑m=04​Cμm
[*]绘制幅度、相位响应和群时延,与抱负值对比

(2)输出结果



[*]系数矩阵:打印四舍五入后的系数矩阵,例如:[[ 0.0417 -0.08330.0833 -0.04170.0083]
[-0.16670.5    -0.5   0.1667 -0.0167]
[ 0.25   -0.5   0.   -0.5   0.25]
[-0.16670.16670.5    -0.5   0.0833]
[ 0.04170.0833 -0.0833 -0.04170.0083]]

[*]图形验证:

[*]幅度响应在通带内平展,与抱负值(全通特性)匹配。
[*]相位响应和群时延靠近抱负值                                                   D                                  +                                  μ                                          D+\mu                           D+μ,误差在可接受范围内。
https://i-blog.csdnimg.cn/direct/d0d966a02a4c45be86ea1273aa0c671c.png#pic_center

(3)设计调整建议



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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 干货:Farrow设计实现详解