题主没有给出采样频率,或采样时间,数据中没有,我们就假定采样时间为 0.01s。
第一步, 电压信号读入,然后傅里叶分析,得到原信号频谱图。从图中第三个子图可以看到 ,基波信号都在0.05Hz以下,所以用一阶低通滤波器就可以了。
第二步,使用 一阶低通滤波器,然后plot。
下面分别为 截至频率,0.1,0.2Hz的滤波器, 源码放在下面了,可以尝试调一调。
这里的一个基本概念就是 :
一阶低通滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。
一阶低通滤波的算法公式为:
Y(n)=αX(n)+(1-α)Y(n-1)
Y(n)=α[X(n)-Y(n-1)]+Y(n-1)
式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。
一个关键公式是:
FilterFactor=CutoffFrequency*2pi*SampleTime
clc;clear;close all;
%%Import data
Data=xlsread('data.xlsx');
fs=100; % sample frequency is 100Hz
N=length(Data);
t=[0:1/fs:(N-1)/fs]';
subplot(221);
plot(t,Data);
title('Filtering data')
subplot(223);
plot((-N/2:N/2-1)*fs/N,abs(fftshift(fft(Data,N)))*2/N)%plot spectrum,X axis is frequency
title('Filtering spectrum')
axis([0 0.5 0 .2]);
%%Filter
OutputData(1)=Data(1);
CutoffFreq=0.1;%Cutoff frequency
FilterFactor=2*3.14*1/fs*CutoffFreq;
for i=2:length(Data)
OutputData(i)=FilterFactor*Data(i)+(1-FilterFactor)*OutputData(i-1);%one order low pass filter
end
subplot(222);
plot(t,OutputData')
title('Filtered data(cutoff frequency 0.1Hz)')
axis([0 160 0.4 1.8]);
subplot(224);
plot((-N/2:N/2-1)*fs/N,abs(fftshift(fft(OutputData,N)))*2/N)%%plot spectrum,X axis is frequency
axis([0 0.5 0 .2]);
title('Filtered frequency')