在filter()中使用来自lowpass()的Matlab digitalfilter对象

在filter()中使用来自lowpass()的Matlab digitalfilter对象,matlab,Matlab,我需要多次执行低通滤波操作(每次的截止频率和采样频率相同) 似乎lowpass()是一个缓慢的操作,如果我重用创建的过滤器对象,我可以加快它的速度。lowpass()的帮助说明: [Y,D]=低通(…)返回用于滤波信号的数字滤波器D。[…]调用筛选器(D,X)以筛选数据 然而,当我尝试以这种方式使用filter对象时,我得到的结果与lowpass()返回的结果不同。我希望在本例中,lp1和lp2是相同的: % Test input data x = rand([200,1]); % Lowpas

我需要多次执行低通滤波操作(每次的截止频率和采样频率相同)

似乎
lowpass()
是一个缓慢的操作,如果我重用创建的过滤器对象,我可以加快它的速度。
lowpass()
的帮助说明:

[Y,D]=低通(…)返回用于滤波信号的数字滤波器D。[…]调用筛选器(D,X)以筛选数据

然而,当我尝试以这种方式使用filter对象时,我得到的结果与
lowpass()
返回的结果不同。我希望在本例中,
lp1
lp2
是相同的:

% Test input data
x = rand([200,1]);
% Lowpass filter, and save the filter object to df:
[lp1, df] = lowpass(x,50,1000);
% Reuse the filter object:
lp2 = filter(df, x);

% Plot to show that they are clearly different results
figure;plot(lp1);hold on;plot(lp2);

我也尝试过使用
filtfilt()
,但这并没有产生相同的结果。

如果您希望在这个特定场景中获得与低通相同的输出,并且如果时间不在您这边,请快速使用filter对象df:lp3=conv(x,df.coverties,'same')

说明:您使用lowpass.m设计的滤波器是一个有限脉冲响应滤波器(FIR),它可以移相。再看看代码片段生成的图中的两条曲线,您会发现filter.m生成的曲线本质上是lowpass.m生成的版本的右移版本。你可以试着纠正一下,看。然而,令人惊讶的是,lowpass.m自动纠正了延迟,而粗略阅读文档并没有发现这一点

Filt.m执行两次过滤,一次在正向,然后在反向,另外“…最小化启动和结束瞬态…”。由于这种往复过滤基本上消除了延迟,但也更难过滤,因此根据定义,结果将不同于低通.m和filter.m

从长远来看,最好是投入一些时间从下到上设计滤波器(Matlab文档在这方面非常优秀),而不是使用相对较新的方便的包装函数,如lowpass,它似乎在后台做一些不需要的事情

% Test input data
x = rand([200,1]);
t = 1:200;
% Lowpass filter, and save the filter object to df:
[lp1, df] = lowpass(x,50,1000);
% Reuse the filter object:
lp2 = filter(df, x);
% Convolution of time series with filter coefficients
lp3 = conv(x, df.Coefficients, 'same');

% Plot 
figure(1), clf;
subplot(2,1,1)
% Plot lp3 with a tiny offset so we can discern it from lp1
plot(t, lp1, t, lp2, t, lp3+0.01)
legend('lowpass.m','filter.m','convolution')

% Use filtfilt to obtain zero-lag, doubly filtered version (for comparison)
lp4 = filtfilt(df, x);
subplot(2,1,2)
plot(t, lp1, t, lp4)
legend('lowpass.m','filtfilt.m')