Matlab 比例信号中的分数延迟

信息处理 matlab 有限脉冲响应 延迟
2022-02-17 17:20:19

我正在尝试编写一个函数,该函数接受一个输入信号并将其延迟一个非整数索引。该函数基于 Matlab 中已有的理想带限分数延迟滤波器技术,通过调用函数designFracDelayFIR

我真的不明白为什么输出信号不是输入信号的延迟版本,而是它的缩放版本,幅度要低得多。此外,比例因子似乎取决于所使用的分数延迟。

输入序列是 4000 个样本的音频信号,采样频率 Fs=8 kHz。

下面的代码展示了函数的实现

function [y] = fractionaDelaySequence(fd,x)

%design fractional delay filter
[h,i0,bw] = designFracDelayFIR(fd)
fdf = dsp.FIRFilter(h);

y = fdf(x);

subplot(2,1,1);
stem(x(1:256));
title('Input Sequence');
xlabel('n')
subplot(2,1,2)
stem(y(1:256));
title('FIR Output Sequence');
xlabel('n')

end

编辑:作为进一步的测试,我给函数作为信号输入一个由 1 后跟 1023 个零构成的单位脉冲,并设置 fd=1/3。我希望将相同的脉冲作为输出延迟所需的量,但我得到的是输入的非延迟和按比例缩小的版本,如下图所示。该函数返回 i0=24 和 bw=0.9033。

在此处输入图像描述

在此处输入图像描述

4个回答

MathWorks 回复了我。

问题是dsp.FIRFilter期望信号是列向量。

如果我做

x = [1 ones(1,1023)]';
fd = 1/3;

%design fractional delay filter
[h,i0,bw] = designFracDelayFIR(fd);
fdf = dsp.FIRFilter(h);

y = fdf(x);

subplot(2,1,1);
stem(x(1:256));
title('Input Sequence');
xlabel('n')
subplot(2,1,2)
stem(y(1:256));
title('FIR Output Sequence');
xlabel('n')

确保它x是一个列向量,那么结果如下(这是预期的)。

修改后的输出

貌似Matlab模块dsp.FIRFilter有bug,解决方法是替换

y = fdf(x);

y = filter(h,1,x)

感谢@Hilmar 的支持。

正如评论者在这里所问的那样,快速写下有助于解决问题的评论。

对于一般用途,我们将其视为“我的代码没有按照我的预期进行,我该如何调试?”

  1. 从已知答案的简单输入信号开始
  2. 逐步与已知的良好参考进行比较,在所有之前的步骤都完全验证之前不要进行下一步

在这种特殊情况下,我们

  1. 将输入简化为简单的 delta
  2. 证实分数延迟脉冲响应看起来“合理”。
  3. 将过滤器操作与已知的良好参考进行比较filter()

原来是第三项,班级似乎出了点问题dsp.FIRFilter()它要么是代码中的错误,要么是文档中的错误。

我认为您需要使用列向量而不是行向量。DSP 将每列视为单个通道。