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 的高通滤波器。
反之则不然!
按照您的建议,使用 highpass
和 lowpass
函数可以轻松完成此操作。他们正在自动处理填充。如果你愿意,你可以设计自己的数字滤波器,但使用上面提到的 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);
这给出了以下图表:
输入输出数据
滤波器的频率响应(幅度和相位)。
希望以上解释对您有所帮助!
我需要过滤一些信号,消除低于 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 的高通滤波器。
反之则不然!
按照您的建议,使用 highpass
和 lowpass
函数可以轻松完成此操作。他们正在自动处理填充。如果你愿意,你可以设计自己的数字滤波器,但使用上面提到的 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);
这给出了以下图表:
输入输出数据
希望以上解释对您有所帮助!