IT评测·应用市场-qidao123.com

标题: 信号处理抽取多项滤波的数学推导与仿真 [打印本页]

作者: 火影    时间: 2025-3-14 18:50
标题: 信号处理抽取多项滤波的数学推导与仿真

昨天的《信号处理之插值、抽取与多项滤波》,已经介绍了插值抽取的多项滤率,本日具体介绍多项滤波的数学推导,并附上实战仿真代码。
一、数学变更推导

1. 多相分解的核心思想

将FIR滤波器的系数                                   h                         (                         n                         )                              h(n)                  h(n)按相位分组,每组对应输入信号的差别抽样相位。通太过相、滤波、重组,实现与原FIR等效的处理。
2. 数学变更推导

FIR滤波器的体系函数可表现为:
                                         H                            (                            z                            )                            =                                       ∑                                           n                                  =                                  0                                                      N                                  −                                  1                                                 h                            (                            n                            )                                       z                                           −                                  n                                                       H(z) = \sum_{n=0}^{N-1} h(n) z^{-n}                     H(z)=n=0∑N−1​h(n)z−n
其中,                                   h                         (                         n                         )                              h(n)                  h(n)为滤波器系数,                                   N                              N                  N为阶数。
设分解因子为                                   M                              M                  M,则第                                   k                              k                  k个子滤波器系数为:
                                                    h                               k                                      (                            m                            )                            =                            h                            (                            k                            +                            m                            M                            )                            ,                                     0                            ≤                            k                            <                            M                                  h_k(m) = h(k + mM), \quad 0 \leq k < M                     hk​(m)=h(k+mM),0≤k<M
将FIR滤波器拆分为                                   M                              M                  M个并行的子滤波器(即多相分量),每个子滤波器处理信号的特定相位分量,再通过延迟和组合实现等效。目标形式为:
                                         H                            (                            z                            )                            =                                       ∑                                           k                                  =                                  0                                                      M                                  −                                  1                                                            z                                           −                                  k                                                            H                               k                                      (                                       z                               M                                      )                                  H(z) = \sum_{k=0}^{M-1} z^{-k} H_k(z^M)                     H(z)=k=0∑M−1​z−kHk​(zM)
其中,                                             H                            k                                  (                                   z                            M                                  )                              H_k(z^M)                  Hk​(zM)表现第                                   k                              k                  k个子滤波器的体系函数。
将                                   H                         (                         z                         )                              H(z)                  H(z)按                                   M                              M                  M的整数倍延迟展开:
                                         H                            (                            z                            )                            =                                       ∑                                           n                                  =                                  0                                                      N                                  −                                  1                                                 h                            (                            n                            )                                       z                                           −                                  n                                                 =                                       ∑                                           k                                  =                                  0                                                      M                                  −                                  1                                                            ∑                                           m                                  =                                  0                                                      K                                  −                                  1                                                 h                            (                            k                            +                            m                            M                            )                                       z                                           −                                  (                                  k                                  +                                  m                                  M                                  )                                                       H(z) = \sum_{n=0}^{N-1} h(n) z^{-n} = \sum_{k=0}^{M-1} \sum_{m=0}^{K-1} h(k + mM) z^{-(k + mM)}                     H(z)=n=0∑N−1​h(n)z−n=k=0∑M−1​m=0∑K−1​h(k+mM)z−(k+mM)
其中,                                   K                         =                         ⌈                                   N                            M                                  ⌉                              K = \lceil \frac{N}{M} \rceil                  K=⌈MN​⌉(向上取整)。
将原系数按                                   M                              M                  M个相位分组:

3. 时域操纵等价性

原FIR输出:
                                         y                            (                            n                            )                            =                                       ∑                                           m                                  =                                  0                                                      N                                  −                                  1                                                 h                            (                            m                            )                            x                            (                            n                            −                            m                            )                                  y(n) = \sum_{m=0}^{N-1} h(m)x(n-m)                     y(n)=m=0∑N−1​h(m)x(n−m)
多相布局输出:
                                         y                            (                            n                            )                            =                                       ∑                                           k                                  =                                  0                                                      M                                  −                                  1                                                            ∑                                           m                                  =                                  0                                                      K                                  −                                  1                                                            h                               k                                      (                            m                            )                            x                                       (                               n                               −                               k                               −                               m                               M                               )                                            y(n) = \sum_{k=0}^{M-1} \sum_{m=0}^{K-1} h_k(m) x\left(n - k - mM\right)                     y(n)=k=0∑M−1​m=0∑K−1​hk​(m)x(n−k−mM)
4、物理意义验证


5、应用场景


二、Python实现与验证

该实战,通过两种同的方法举行抽取滤波,将信号采样率降低到原来的1/4,并对效果举行对比和误差分析。
1. 生成测试信号

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.signal import firwin, lfilter
  4. # 生成测试信号:10Hz正弦波 + 100Hz高频噪声
  5. fs = 1000  # 采样率
  6. t = np.arange(0, 1, 1/fs)
  7. x = np.sin(2*np.pi*10*t) + 0.5*np.random.randn(len(t))  # 原始信号
复制代码
2. 设计FIR滤波器

  1. # 设计低通FIR滤波器(截止频率50Hz,阶数N=31)
  2. N = 31
  3. fc = 50
  4. h = firwin(N, fc, fs=fs, window='hamming')  # 获取系数
复制代码
3. 标准FIR滤波

  1. y_fir = lfilter(h, 1, x)  # FIR滤波结果
复制代码
4. 多相分解(M=4)

  1. M = 4  # 分解因子
  2. poly_h = [h[k::M] for k in range(M)]  # 分解为M个子滤波器
  3. # 补零对齐长度(确保所有子滤波器长度一致)
  4. max_len = max(len(p) for p in poly_h)
  5. poly_h = [np.pad(p, (0, max_len - len(p))) for p in poly_h]
复制代码
5. 多相滤波实现

  1. # 初始化输出
  2. y_poly = np.zeros_like(x)
  3. # 处理每个子滤波器分支
  4. for k in range(M):
  5.     # 抽取输入信号的相位分量
  6.     x_k = x[k::M]
  7.    
  8.     # 子滤波器滤波
  9.     y_k = lfilter(poly_h[k], 1, x_k)
  10.    
  11.     # 上采样并添加延迟
  12.     y_up = np.zeros(len(x))
  13.     y_up[k::M] = y_k  # 上采样(插入零)
  14.     y_up = np.roll(y_up, -k)  # 延迟补偿
  15.    
  16.     y_poly += y_up  # 合并分支结果
  17. # 截断初始延迟
  18. y_poly = y_poly[:len(x)-N]
  19. y_fir = y_fir[:len(x)-N]
  20. x_trim = x[:len(x)-N]
  21. y_fir = np.roll(y_fir, -3)
复制代码
6. 可视化对比

  1. plt.figure(figsize=(12, 8))
  2. # 原始信号与滤波结果
  3. plt.subplot(3,1,1)
  4. plt.plot(x_trim, label='原始信号', alpha=0.5)
  5. plt.plot(y_fir, label='FIR滤波结果', linewidth=2)
  6. plt.legend()
  7. plt.title('FIR滤波效果')
  8. y_fir = y_fir[0::M] #抽取
  9. y_poly = y_poly[0::M] #抽取
  10. # 多相滤波结果对比
  11. plt.subplot(3,1,2)
  12. plt.plot(y_poly, label='多相滤波结果', linestyle='--')
  13. plt.plot(y_fir, label='FIR滤波结果', alpha=0.7)
  14. plt.legend()
  15. plt.title('多相滤波与FIR结果对比')
  16. # 误差分析
  17. plt.subplot(3,1,3)
  18. error = y_fir - y_poly[:len(y_fir)]
  19. plt.plot(error, label='误差', color='red')
  20. plt.legend()
  21. plt.title('误差曲线 (最大误差: {:.2e})'.format(np.max(np.abs(error))))
  22. plt.tight_layout()
  23. plt.show()
复制代码


三、代码输出验证


四、关键点阐明


通过上述实现,可直观验证FIR滤波器与其多相分解形式的等效性,为信号处理体系优化提供可靠依据。

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




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4