MATLAB 的采样时如何选择额外的点?u p f i r d nupfirdn

信息处理 matlab 卷积 下采样 有限脉冲响应
2022-02-09 20:07:20

我有一个 512 个样本长的信号,我曾经upfirdn对其进行过滤和下采样 2 倍。我认为这会产生一个 256 个样本长的变量,但结果却是 261。

MATLAB 帮助说明了这一点:

输出的长度yout, 是 ceil(((length(xin)-1)*p+length(h))/q)

(其中xin是信号,h是滤波器,p是上采样率,q是下采样率),如果你计算出来(滤波器长度为 10),实际上是 261。

我想知道的是它在下采样时如何选择点,以便我可以upfirdn用另一种语言重现行为(长篇大论,不重要)。这个公式是从哪里来的?

2个回答

该函数执行上采样、过滤和下采样。额外样本的原因是由于 fir 滤波器延迟。如果您只想重现此行为以进行下采样,则应执行以下步骤:

  1. 获取您的输入信号,并在末尾xin添加零。length(h)-1这是因为滤波器的延迟。
  2. 用于filter(h,1,xin_padded);过滤信号。
  3. 对滤波后的信号进行下采样。

如果您进行直接卷积,则输出长度将为 512+10-1= 521。现在对于抽取点,如果您采用点 1、3、5、7 ... 521,那么这将为您提供 (521+1)/2 = 261 分。

要在 matlab 中针对 upfirdn() 输出对其进行测试,只需执行以下操作:

out=conv(xin,h);
out2 = out(1:2:end);

将 out2 的输出与 upfirdn() 进行比较 - 仅由于数值实现可能存在一些小的差异,但差异应该非常小。这不是最有效的方法,但它可以明确地向您展示正在发生的事情。更有效的实现是使用多相滤波器。基本上,多相实现只是使您免于计算在抽取步骤中丢弃的输出。