带通滤波器的阶跃响应

信息处理 无限脉冲响应 带通 阶跃反应
2022-02-16 23:19:24

我正在做一个虚拟低音系统,信号流如下

在此处输入图像描述

其中 NLD 表示引入奇偶次谐波的非线性器件,z^-D 是为了补偿 LPF 和 BPF 引起的群延迟。

当低通滤波信号通过 NLD 时,我需要滤除高频分量,因为不需要太高阶的谐波。但是 NLD 还引入了 DC 偏移,因此我需要一个 DC 阻断器。这就是为什么我在 NLD 之后需要一个 BPF。

我的问题是当输入信号通过我的虚拟低音算法时,它通常在一开始就包含几个静音块。这些值为零的样本在 LPF 之后仍然为零,但会被 NLD 转换为 DC 偏移,例如 0.65。现在我有一个步进函数来输入 BPF 但我的 BPF 有一个像这样的阶跃响应

在此处输入图像描述

这绝对是听得见的,尽管它只有一小段时间。这是我的 BPF 设计:

Fs = 44100;
f1 = 50;
f2 = 600;
w1 = f1*2/Fs;
w2 = f2*2/Fs;
[b, a] = butter(1, [w1, w2], 'bandpass');

是否有其他类型的 BPF 具有低阶跃响应?请告诉我如何避免它。谢谢!

2个回答

您的 BPF 的阶跃响应具有快速衰减,因此您可以通过设置滤波器状态来消除它。看看你的双二阶 BPF 的差分方程:

y[n]=0.0377x[n]+0x[n1]0.0377x[n2]+1.9240y[n1]0.9246y[n2]

自从b0=b2我们有x[n]=0.65对全部n0, 如果我们设置x[n1]=x[n2]=0.65y[n1]=y[n2]=0,我们得到一个零阶跃响应y[n]=0对全部n0.

因此,如果您使用直接形式 I 实现双二阶滤波器,只需将您的滤波器状态初始化为[0.65, 0.65, 0, 0].

如果您使用转置直接形式 II,则可以使用过滤器 states [-b0*0.65, -b0*0.65]

x = ones(2*Fs, 1) * 0.65;
z = [-b(1)*0.65, -b(1)*0.65];
[y, z] = filter(b, a, x, z);
figure; stem(y)

但会被 NLD 转换为 DC 偏移量,

这通常是一个坏主意。DC 偏移在任何音频中都是一个问题,并且很难通过任何物理模型来证明其合理性。我会认真研究算法并尝试了解为什么需要为 0 输入设置 DC 偏移。如果您绝对必须拥有它,我会在 NLD 之后使用 DC 阻塞滤波器,您可以使用零输入的 DC 偏移对其进行初始化。

请告诉我如何避免它。

如果您绝对必须这样做,则需要正确初始化过滤器的状态。如何执行此操作的过程取决于 ZR Han 描述的特定滤波器拓扑。一个更简单的选择是

% find the steady state for a unit step
[~,zi] = filter(b,a,ones(10000,1));
%  filter with initialized state
output = filter(b,a,input,zi*DCOffset);

DCOffset0 输入的 NLD 输出在哪里。如果您进行基于帧的处理,请确保跨帧保留过滤器状态。