评估使用dsp.FIRFilter创建的过滤器

时间:2014-12-08 14:42:53

标签: matlab

在下面的代码中,我根据已知的分子系数创建一个简单的移动平均值(SMA)。 MatLab可以做到这一点非常酷,因为我有许多已知的系数,我想用fvtool看一下。 fvtool的结果看起来完全合理。

然后我想要一些输入数据通过过滤器运行,所以我生成InData,绘制它并使用'步骤'在过滤器中运行它。这就是它变得奇怪的地方:

1)第一次运行步骤时,输出数据的幅度减小。如果我突出显示最后2行并点击F9,则重复计算并增加振幅。有趣的是,要达到全幅度,总是需要长度' F9命令。

2)数据的相位在图中看起来不正确。一个简单的移动平均线有一个步长输入的长度延迟,如fvtool所示,但它在OutData中没有延迟。

也许使用step isn是不是正确的方法呢?我对MatLab很新,这是我到目前为止发现的唯一方式。如何在一次运行中正确执行此操作?

注意:我完全对任何从代码本身的已知系数创建系统对象过滤块的方法开放。

谢谢!

%Create SMA filter
Length = 10;
N = repmat(1/Length, 1, Length);
SMA = dsp.FIRFilter('Numerator', N);
%View filter properties
fvtool(SMA);

%Create some data to run through filter
t=0:0.01:2;
InData = chirp(t,4,8,15);

%Plot input data
figure
plot(t, InData);
axis([0 2 -2 2]);
hold on;

%Run filter and add result to plot
OutData = step(SMA, InData);
plot(t, OutData);

1 个答案:

答案 0 :(得分:0)

dsp.FIRFilter过滤输入列。每列输入被视为用于过滤多通道输入的单独通道。在您的情况下,因为您使用了行向量,所以每个样本都作为单独的通道进行过滤。您基本上分别为每个输入样本获得了第一个过滤输出样本。

要过滤整个输入,您应该通过转置输入来使输入成为列向量。

InData = chirp(t,4,8,15).';