解决FFT低频滤波时长对应变上升段信号处理结果影响的方法
问题描述
图1所示的应变时域数据存在显著高频噪声,重点关注图2中幅值可截断为1e4的应变上升阶段。采用FFT基低频滤波时,发现滤波区域的时长选择对滤波结果影响显著,该如何解决?
原始数据图示


原始数据文件
信号数据存储于20250310signal1.mat文件中
原始滤波代码
clc;clear;close all; %% load data load('20250310signal1.mat'); t=ttt'; y=yyy'; %% fs = fix(1/(t(2)-t(1))); n = length(y); Y = fft(y); f = (0:n-1)*(fs/n); %% Low-pass filtering (retain DC and low-frequency components) cutoff = 12500; % cut-off frequency Y_filtered = Y; Y_filtered(f > cutoff) = 0; %% Inverse FFT to obtain filtered signal y_filtered = ifft(Y_filtered, 'symmetric'); %% Plot results figure; plot(t, y);hold on; plot(t, y_filtered); xlabel('Time (s)'); ylabel('Amplitude'); legend('data','filtered data')
解决方案
FFT基滤波对时长敏感的核心原因是纯FFT硬截断会引发频谱泄漏,且全局滤波无法适配局部信号特征,可通过以下方案解决:
1. 分段滤波+窗函数抑制泄漏
针对关注的上升阶段单独处理,加窗后再做FFT滤波,减少边界效应:
clc;clear;close all; load('20250310signal1.mat'); t=ttt'; y=yyy'; fs = fix(1/(t(2)-t(1))); % 定位应变上升阶段(根据图2实际范围调整时间阈值) t_start = 0.002; t_end = 0.005; idx = t >= t_start & t <= t_end; y_segment = y(idx); t_segment = t(idx); n_segment = length(y_segment); % 加汉宁窗抑制频谱泄漏 window = hann(n_segment); y_windowed = y_segment .* window; % FFT滤波 Y = fft(y_windowed); f = (0:n_segment-1)*(fs/n_segment); cutoff = 12500; Y_filtered = Y; Y_filtered(f > cutoff) = 0; y_filtered_segment = ifft(Y_filtered, 'symmetric'); % 恢复窗函数对幅值的影响 y_filtered_segment = y_filtered_segment ./ window; % 绘制结果 figure; plot(t_segment, y_segment, 'b', t_segment, y_filtered_segment, 'r'); xlabel('Time (s)');ylabel('Amplitude'); legend('原始上升段数据','滤波后数据');
2. 用FIR/IIR滤波器替代纯FFT截断
FIR滤波器能实现更平滑的频率响应,避免FFT硬截断的振铃效应,对时长敏感度更低:
clc;clear;close all; load('20250310signal1.mat'); t=ttt'; y=yyy'; fs = fix(1/(t(2)-t(1))); cutoff = 12500; % 设计FIR低通滤波器(阶数越高过渡带越窄) order = 100; b = fir1(order, cutoff/(fs/2), 'low'); % 用filtfilt滤波避免相位偏移 y_filtered = filtfilt(b, 1, y); % 绘制上升阶段结果 t_start = 0.002; t_end = 0.005; idx = t >= t_start & t <= t_end; figure; plot(t(idx), y(idx), 'b', t(idx), y_filtered(idx), 'r'); xlabel('Time (s)');ylabel('Amplitude'); legend('原始上升段数据','滤波后数据');
3. 自适应滤波追踪时变特征
若上升阶段频率特征随时间变化,用LMS自适应滤波自动跟踪信号,无需固定滤波时长:
clc;clear;close all; load('20250310signal1.mat'); t=ttt'; y=yyy'; fs = fix(1/(t(2)-t(1))); % 构造参考信号(用原始信号延迟模拟噪声参考) delay = 5; x = [zeros(delay,1); y(1:end-delay)]; % LMS自适应滤波设置 mu = 0.001; % 收敛步长 order = 30; % 滤波器阶数 [y_filtered, ~] = lms(y, x, order, mu); % 绘制上升阶段结果 t_start = 0.002; t_end = 0.005; idx = t >= t_start & t <= t_end; figure; plot(t(idx), y(idx), 'b', t(idx), y_filtered(idx), 'r'); xlabel('Time (s)');ylabel('Amplitude'); legend('原始上升段数据','滤波后数据');
核心思路总结
- 优先针对关注的上升阶段局部数据处理,避免全局FFT滤波的适配问题
- 用窗函数或FIR/IIR滤波器,解决FFT硬截断带来的频谱泄漏和振铃问题
- 信号时变特征明显时,用自适应滤波替代固定参数的频域滤波
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

