当前位置: 首页 > article >正文

信号处理之插值、抽取与多项滤波

信号处理之插值、抽取与多项滤波


一、问题背景

插值(Interpolation)与抽取(Decimation)是数字信号处理中采样率转换的核心操作:

  • 插值:在信号中插入新样本以提高采样率( L L L倍)
  • 抽取:按比例 M M M降低采样率(需防混叠)
    多项滤波通过多相分解优化计算效率,实现高效的多速率处理。

二、数学原理

1. 插值过程
  • 数学模型:插值因子 L L L,插值后信号为:
    x up [ n ] = { x [ n / L ] , n / L ∈ Z 0 , 其他 x_{\text{up}}[n] = \begin{cases} x[n/L], & n/L \in \mathbb{Z} \\ 0, & \text{其他} \end{cases} xup[n]={x[n/L],0,n/LZ其他
  • 低通滤波:消除镜像频率分量,传递函数为 H ( z ) H(z) H(z)
2. 抽取过程
  • 数学模型:抽取因子 M M M,抽取前需滤波防混叠:
    y [ n ] = ∑ k = − ∞ ∞ h [ k ] ⋅ x [ n M − k ] y[n] = \sum_{k=-\infty}^{\infty} h[k] \cdot x[nM -k] y[n]=k=h[k]x[nMk]
3. 多相分解(核心)

将滤波器 H ( z ) H(z) H(z)分解为 L L L个(插值)或 M M M个(抽取)子滤波器:
H ( z ) = ∑ r = 0 L − 1 z − r E r ( z L ) H(z) = \sum_{r=0}^{L-1} z^{-r} E_r(z^L) H(z)=r=0L1zrEr(zL)
其中 E r ( z ) E_r(z) Er(z)为多相分量,对应不同相位延迟的子滤波器。

4、基本操作
  1. 插值与抽取的基本操作

    • 插值(Interpolation):将信号采样率提高 L L L倍,分为两步:

      • 插零:在原始信号 x ( n ) x(n) x(n)的相邻采样点间插入 L − 1 L-1 L1个零值,得到 x ′ ( m ) x'(m) x(m)
      • 滤波:通过低通滤波器 h int ( k ) h_{\text{int}}(k) hint(k)消除镜像频谱,补偿幅度损失。数学表达式为:
        y int ( m ) = L ⋅ ∑ k x ′ ( k ) h int ( m − k ) y_{\text{int}}(m) = L \cdot \sum_{k} x'(k) h_{\text{int}}(m - k) yint(m)=Lkx(k)hint(mk)
        其中增益因子 L L L用于恢复插值后信号的幅度。
    • 抽取(Decimation):将信号采样率降低 D D D倍,分为两步:

      • 抗混叠滤波:通过低通滤波器 h dec ( k ) h_{\text{dec}}(k) hdec(k)限制信号带宽,避免混叠。
      • 抽取:保留每 D D D个采样点中的一个,输出 y dec ( n ) = ∑ k x ( k ) h dec ( n D − k ) y_{\text{dec}}(n) = \sum_{k} x(k) h_{\text{dec}}(nD - k) ydec(n)=kx(k)hdec(nDk)
  2. 多级滤波设计

    • CIC滤波器(级联积分梳状滤波器):常用于高效抽取,传输函数为:
      H CIC ( z ) = ( 1 − z − D 1 − z − 1 ) L H_{\text{CIC}}(z) = \left( \frac{1 - z^{-D}}{1 - z^{-1}} \right)^L HCIC(z)=(1z11zD)L
      其中 L L L为级数, D D D为抽取因子。CIC无需乘法运算,适合高速处理,但通带衰减较大,需后接补偿滤波器(如CFIR)。

    • 半带滤波器(HB):适用于2倍抽取/插值,通带截止频率为 π / 2 \pi/2 π/2,半数系数为零,计算效率高。

  3. 频域分析

    • 插值后信号频谱会压缩为原始带宽的 1 / L 1/L 1/L,并产生 L − 1 L-1 L1个镜像,需通过低通滤波器(截止频率 π / L \pi/L π/L)抑制镜像。
    • 抽取前需将信号带宽限制在 π / D \pi/D π/D内,否则会导致频谱混叠。

二、实现方法
  1. 插值抽取流程

    • 插值实现步骤
      1. 插入 L − 1 L-1 L1个零值;
      2. 通过低通滤波器平滑信号;
      3. 乘以增益 L L L恢复幅度。
    • 抽取实现步骤
      1. 设计抗混叠滤波器;
      2. 滤波后按因子 D D D降采样。
  2. 多级滤波优化

    • CIC + CFIR组合
      • 第一级使用CIC进行粗抽取,降低数据速率;
      • 第二级用CFIR补偿CIC的通带衰减。
    • 多相滤波结构
      将滤波器分解为 L L L个子滤波器,并行处理插零后的信号,大幅减少计算量。
  3. 代码示例(CIC滤波器实现)

def cic_filter(input_signal, D, L):
    # 积分器部分
    integral = np.cumsum(input_signal)
    # 梳状滤波器部分
    delay = np.zeros_like(integral)
    delay[D:] = integral[:-D]
    comb = integral - delay
    # 级联L次
    output = comb.copy()
    for _ in range(L-1):
        output = np.cumsum(output)
        delay = np.zeros_like(output)
        delay[D:] = output[:-D]
        output = output - delay
    return output[::D]  # 抽取

三、多项滤波实现

1. 插值+滤波的高效结构
  • 传统方法:上采样后滤波,计算效率低(含大量零乘)
  • 多相优化
    • 将滤波器分解为 L L L个多相分支 E 0 ( z ) , E 1 ( z ) , . . . , E L − 1 ( z ) E_0(z), E_1(z), ..., E_{L-1}(z) E0(z),E1(z),...,EL1(z)
    • 输入信号直接进入对应分支,并行计算后交替输出
    • 计算量降低为原来的 1 / L 1/L 1/L
2. 抽取+滤波的高效结构
  • 传统方法:先滤波后下采样,计算冗余
  • 多相优化
    • 分解滤波器为 M M M个分支 E 0 ( z ) , E 1 ( z ) , . . . , E M − 1 ( z ) E_0(z), E_1(z), ..., E_{M-1}(z) E0(z),E1(z),...,EM1(z)
    • 输入信号分块后分别通过分支,再下采样合并
    • 计算量降低为原来的 1 / M 1/M 1/M
3. 插值抽取联合实现

当需要同时进行 L L L倍插值和 M M M倍抽取时:

  • 级联结构:先插值后抽取,但需满足 gcd ⁡ ( L , M ) = 1 \gcd(L,M)=1 gcd(L,M)=1避免重复采样
  • 多相联合优化:直接设计分数倍采样率转换滤波器,避免冗余计算

四、多项滤波关键公式推导

多相分解表达式

滤波器冲激响应 h [ n ] h[n] h[n]分解为:
h [ n ] = ∑ r = 0 L − 1 e r [ m ] ⋅ δ [ n − r − m L ] h[n] = \sum_{r=0}^{L-1} e_r[m] \cdot \delta[n - r - mL] h[n]=r=0L1er[m]δ[nrmL]
其中 e r [ m ] = h [ r + m L ] e_r[m] = h[r + mL] er[m]=h[r+mL],对应第 r r r个多相分支。

插值滤波输出

y [ n ] = ∑ r = 0 L − 1 e r [ m ] ⋅ x [ ⌊ n L ⌋ − m ] y[n] = \sum_{r=0}^{L-1} e_r[m] \cdot x\left[\left\lfloor \frac{n}{L} \right\rfloor - m \right] y[n]=r=0L1er[m]x[Lnm]


五、多项滤波实现步骤

  1. 设计原型低通滤波器:满足插值/抽取的频响要求(如截止频率 π / max ⁡ ( L , M ) \pi/\max(L,M) π/max(L,M)
  2. 多相分解:按 L L L M M M分解为子滤波器
  3. 并行滤波:输入信号分块送入多相分支
  4. 合并输出:插值时交替拼接结果,抽取时下采样合并

六、多项滤波应用场景

  • 软件无线电(SDR)中的采样率转换
  • 音频处理(如44.1kHz↔48kHz转换)
  • 图像超分辨率与压缩

七、多项滤波MATLAB示例代码

% 设计插值多相滤波器
L = 4; % 插值因子
h = fir1(60, 1/L); % 原型低通滤波器
poly_phases = reshape(h, L, []); % 多相分解

% 输入信号
x = randn(1,100); 

% 多相插值实现
output = zeros(1, L*length(x));
for i = 1:L
    output(i:L:end) = filter(poly_phases(i,:), 1, x);
end

总结:插值抽取的多项滤波通过多相分解,将计算复杂度从 O ( N ) O(N) O(N)降至 O ( N / L ) O(N/L) O(N/L) O ( N / M ) O(N/M) O(N/M),是实时信号处理系统的核心优化技术。附上其学习研究思维导图:
在这里插入图片描述


http://www.kler.cn/a/582790.html

相关文章:

  • 【C++】C++11新特性
  • ELK traceId 通过A服务调用B服务举例
  • Hive SQL 精进系列:COALESCE 手册
  • 跨境电商IP安全怎么做?从基础到高级防护的实战经验分享
  • 信息学奥赛c++语言:整数去重
  • idea maven 编译报错Java heap space解决方法
  • 华为欧拉操作系统安装Docker服务
  • 基于 GEE 利用 Sentinel-2 数据反演叶绿素与冠层水分含量
  • Android Glide 的显示与回调模块原理源码级深度剖析
  • Vue+Node.js+MySQL+Element-Plus实现一个账号注册与登录功能
  • FPGA 实现 OV5640 摄像头视频图像显示
  • 如何制作Windows系统盘、启动盘?(MediaCreationTool_22H2)
  • Banana Pi 与瑞萨电子携手共同推动开源创新:BPI-AI2N
  • Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)
  • 【数据结构】-- LinkedList与链表(1)
  • MySQL数据库复杂的增删改查操作
  • 如何在Android中实现SQLite数据库操作
  • 【架构艺术】Go语言微服务monorepo的代码架构设计
  • STM32-Unix时间戳
  • Taro-Bluetooth-Print:让蓝牙打印也充满乐趣的开发组件库