MATLAB 滤波处理:去除目标频率范围实现数据去噪

本程序的主要功能是对一组流量数据进行去除目标频率范围的滤波处理,实现数据的去噪和提取目标信号。具体实现流程如下:

  1. 从Excel文件中读取数据,该数据包括时间和流量两列。
  2. 使用傅里叶变换计算原始信号的频谱,并绘制频谱图。
  3. 按照目标频率范围的设定,找到对应的频率下标,并将该频率对应的幅度谱置为0。
  4. 使用傅里叶逆变换,得到去除目标频率范围后的时间序列。
  5. 绘制还原后的时间序列图和原始时间序列图的比较图,以便观察去除目标频率范围后的效果。
clc
clear
% 从Excel文件中读取数据
filename = '测试11.xlsx';
data = xlsread(filename, 'Sheet1', 'B2:B5857'); % 读取第1列和第2列数据,第1行为标题行

load('yyk_time.mat');
t = datetime(yyk_tCopy(:,1),yyk_tCopy(:,2),yyk_tCopy(:,3),yyk_tCopy(:,4),yyk_tCopy(:,5),0);

% 计算频谱
fs = 1; % 采样频率
N = length(data);
f = (0:N-1)*(fs/N); % 频率
Y = fft(data(:,1)); % 傅里叶变换
P = abs(Y/N).^2; % 幅度谱

% 绘制频谱图
figure;
subplot(2,1,1);
plot(f(2:5856),P(2:5856))
xlabel('Frequency (Hz)')
ylabel('Power (dB)')
title('Original frequency domain')
grid on

% 去除目标频率范围
freq_low1 = 0.09; % 目标频率范围下限
freq_high1 = 0.1; % 目标频率范围上限
freq_low2 = 0.1; % 目标频率范围下限
freq_high2 = 0.9; % 目标频率范围上限
idx1 = (f >= freq_low1 & f <= freq_high1) | (f >= (fs-freq_high1) & f <= (fs-freq_low1));% 找到目标频率范围所对应的下标
idx2 = (f >= freq_low2 & f <= freq_high2) | (f >= (fs-freq_high2) & f <= (fs-freq_low2)); 
Y(idx1) = 0;
Y(idx2) = 0; % 将目标频率对应的幅度谱置为0

%绘制去除目标频率范围后的频谱图
P_filtered = abs(Y/N).^2; % 去除目标频率范围后的幅度谱
subplot(2,1,2);
plot(f(2:5856), P_filtered(2:5856))
xlabel('Frequency (Hz)')
ylabel('Power (dB)')
title('Frequency domain after filtering')
grid on

% 傅里叶逆变换,得到还原后的时间序列
data_new = ifft(Y);

% 绘制还原后的时间序列图和原始时间序列图的比较图
figure;
subplot(2,1,1);
plot(t, data_new);
xlabel('Time');
ylabel('Flow rate');
title('Restored signal');
grid on;

subplot(2,1,2);
plot(t, data);
xlabel('Time');
ylabel('Flow rate');
title('Original signal');
grid on;

在具体实现过程中,需要注意以下几点:

  1. 频率范围的设定需要根据具体数据进行调整,以确保滤波效果的准确性。
  2. 数据的采样频率需要与实际采样频率相匹配,否则会影响滤波效果。
  3. 在进行傅里叶变换和傅里叶逆变换时,需要将数据转换为复数形式,并注意频谱和时域数据的长度匹配问题。
  4. 绘图时可以使用subplot函数将多张图放在同一窗口中进行比较,以便观察滤波效果。

通过以上步骤,我们可以有效地去除目标频率范围,实现数据的去噪和目标信号的提取。

MATLAB 滤波处理:去除目标频率范围实现数据去噪

原文地址: http://www.cveoy.top/t/topic/m8Ty 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录