Highpass Lowpass 滤波信号,去除边缘伪影 Matlab

Highpass Lowpass filter signal, remove edge artifacts Matlab


我需要过滤一些信号,消除低于 0.7 HZ 和高于 4 HZ 的频率(如参考文献中所建议的那样。

我正在对其中一个信号(第二个子图)进行尝试:

我正在添加 link 以及此处使用的示例信号 exampleSignal

我的信号是“ydata”。为了高通我试过的信号:

vidInfo.frameRate = 29.9293;
highPassedSig = highpass(ydata,4,vidInfo.frameRate) % vidInfo.frameRate

在我看来,有一些严重的边缘伪影。 如果我消除前 50 个和后 50 个样本,这就是信号的中心部分:

为了消除边缘伪影,我尝试让信号在开始和结束时变长。我尝试了两种方法:1) 零填充,2) 将信号的第一个和最后 50 个样本加倍。零填充不起作用。我在 mathworks 上找到了第二种方法的一些代码:

R=0.1; % 10% of signal
Nr=50;
N=size(ydata,1);
NR=min(round(N*R),Nr); % At most 50 points
for i=1:size(ydata,2)
    ydata1(:,i)=2*ydata(1,i)-flipud(ydata(2:NR+1,i));  % maintain continuity in level and slope
    ydata2(:,i)=2*ydata(end,i)-flipud(ydata(end-NR:end-1,i));
end
sigToHighPass=[ydata1;ydata;ydata2];
% Do filtering
highPassedSig = highpass(sigToHighPass,4,vidInfo.frameRate);
highPassedSig = highPassedSig(NR+1:end-NR,:)

这是结果:

看起来边缘瑕疵已被移除。此时,我尝试将低通滤波器应用于高通滤波数据。

   N=size(highPassedSig,1);
NR=min(round(N*R),Nr); % At most 50 points
for i=1:size(highPassedSig,2)
    highPassedSig1(:,i)=2*highPassedSig(1,i)-flipud(highPassedSig(2:NR+1,i));  % maintain continuity in level and slope
    highPassedSig2(:,i)=2*highPassedSig(end,i)-flipud(highPassedSig(end-NR:end-1,i));
end
sigToLowPass=[highPassedSig1;highPassedSig;highPassedSig2];
% Do filtering
lowPassedSig = lowpass(sigToLowPass,0.7,vidInfo.frameRate);
lowPassedSig=lowPassedSig(NR+1:end-NR,:)

这是结果 再一次,看起来有一些严重的边缘伪影。

我也试过其他方法。例如:

d = designfilt('lowpassfir', 'FilterOrder', 5, 'CutoffFrequency', 0.7, 'SampleRate', vidInfo.frameRate);
lowPassedSig = filter(d, ydata);

这是结果(子图 3):


有谁知道我该如何处理这个问题?
谢谢, 詹卢卡

我在你的方法中看到的根本问题是你 miss-interpreting 你的 cut-off 频率。如果你想去除低于 0.7 Hz 和高于 4 Hz 的频率,你需要:

  • cut-off 频率为 4 Hz 的低通滤波器。
  • cut-off 频率为 0.7 Hz 的高通滤波器。

反之则不然! 按照您的建议,使用 highpasslowpass 函数可以轻松完成此操作。他们正在自动处理填充。如果你愿意,你可以设计自己的数字滤波器,但使用上面提到的 cut-off 频率 :)

满足您要求的 matlab 代码是:

ydata = load("signaldata.mat","-mat");
ydata = ydata.ydata;

f = 29.9293;

lp = 0.7;
hp = 4;

[y_hp,d_hp] = highpass(ydata,lp,f);
[y_lphp,d_lp] = lowpass(y_hp,hp,f);

%% plot result
x = (1:length(ydata))/f;
figure;
subplot(3,1,1);
plot(x,ydata);
legend("Original");
subplot(3,1,2);
plot(x,y_hp);
legend("Highpass");
subplot(3,1,3);
plot(x,y_lphp);
xlabel('Time [s]');
legend("Lowpass");

%% plot filters
figure;
[h,w] = freqz(d_hp);
subplot(2,2,1);
title('Highpass');
loglog(w/pi*f/2,abs(h));
subplot(2,2,3);
semilogx(w/pi*f/2,angle(h)/pi*180);
[h,w] = freqz(d_lp);
subplot(2,2,2);
title('Lowpass');
loglog(w/pi*f/2,abs(h));
subplot(2,2,4);
semilogx(w/pi*f/2,angle(h)/pi*180);

这给出了以下图表: 输入输出数据 滤波器的频率响应(幅度和相位)。

希望以上解释对您有所帮助!