频域滤波中数据分块导致的波形突变问题

概要

在滤波、相关等常用运算中,卷积实现等效到频域采用乘积实现,可以减少计算资源,频域实现需要进行数据分块,通过仿真说明分块数据交叠的影响。

滤波、时域卷积与频域乘积

生成采样速率102.4MHz,信号1频率2MHz,信号1幅度1V,信号2频率40MHz,信号2幅度同样为1V,采样点数2048点的双拼正弦叠加信号,时域波形如下图所示。

图1 双频正弦叠加信号时域波形

通过一个32阶截止频率为15MHz的低通滤波器,滤波器幅度相位响应曲线如下图所示,信号2被滤除,只保留了信号1频率。通过下述matlab代码能够得到该低通滤波器的系数。

%% 生成卷积使用的滤波器
Fs = 102.4*1e6; % 采样速率
N = 31; % 滤波器阶数
Fc = 15*1e6; % 截止频率
flag = 'scale'; % 采样Flag
% 创建窗矢量用于设计算法
win = hamming(N+1);
% 使用FIR函数计算系数
b = fir1(N, Fc/(Fs/2), 'low', win, flag);
Hd = dfilt.dffir(b);
% 查看滤波器响应
fvtool(Hd);

图2 低通滤波器幅相响应曲线

上述滤波过程可以通过时域卷积和频域乘积实现,对应到matlab程序中,可以通过滤波器函数filter(),卷积函数conv()以及fft()、点乘结合ifft()三种方式完成。前两种方式可以直接使用前述代码所得到的滤波器系数Hd.Numerator,最后频域点乘的方式需要滤波系数与数据等长,因此需要在系数前后补零以达到同数据块相同的采样长度,并通过FFT变换的频域滤波系数。

原始信号波形,以及三种滤波方式得到的滤波输出信号波形如图3所示。

图3 原始双频波形与三种滤波仿真输出波形

三种滤波方法等效,但数据长度和信号相位上有区别。filter滤波保持数据长度为2048个点,实际上前31个与滤波器长度减1一致的数据没有用,conv则保留了2048+N长度的数据,频域输出需要在前后各补一定长度数据才能得到一致的相位关系。

FFT分块实现

上述仿真采用连续的一段2048采样点数据进行,实际采样数据会持续进入处理模块,因此采用频域滤波需要分块缓存数据并分块计算。数据分块需要前后至少各交叠一个滤波器的长度,通过仿真可以大致了解交叠与不交叠的区别。假定每块数据包含256个点,整个2048个数据不交叠包含8块,交叠数据前后至少各加N,即256+62=318个采样点。滤波信号输出结果如图4所示。

图4 分块数据是否交叠得到的滤波波形

通过图4可知,不交叠数据会导致得到的滤波信号出现阶段性的跳变,这是由于在分块边界点,下一分块数据卷积运算时,没有使用到上一分块数据的末尾数据,导致卷积求和时能量有缺失,图4中不交叠数据的断点为8个,正好对应数据分为8块。当至少交叠一个滤波器阶数时,前后分块数据均参与卷积求和,因此整体信号能够连续。此外,数据跳变与采用时域卷积还是频域乘积计算无关。

小结

常用的滤波、相关、卷积等运算都涉及到一组数据的乘加运算,计算某个时间点所需要用到之前的数据长度,对应延时长度,也对应数字域的相对带宽,滤波器输出跳变问题是由于数据分块导致计算分块边界点数据时,没有用到之前分块数据的点进行卷积求和,采用数据分块交叠可以避免出现该类问题。

  • 58
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值