巴特沃斯滤波行为异常 - MATLAB

信息处理 matlab fft 频谱 自由度 巴特沃思
2022-02-07 05:48:24

我是信号处理的新手,但我试图了解巴特沃斯滤波器的工作原理。为此,我做了以下事情:我假设采样频率为 100Hz,并希望在奈奎斯特频率的一半之后衰减所有内容。我使用的代码如下

[b,a] = butter(2,0.5);
fs = 100; %Sampling frequency
t = 0:1/fs:1-1/fs;
y=0.123*sin(2*pi*20*t+0.234)+0.123*sin(2*pi*10*t); %Pair of sine curves
plot(abs(fft(y))) %This behaves as expected, with two peaks at 10 and 20
dataOut = filter(b, a, y);
figure,
plot(abs(fft(dataOut))) 

我希望第二个图与第一个图相同,因为无论如何都没有高于巴特沃斯滤波器截止频率的频率。但是,对于低于 25Hz 的所有分量,信号都会人为地膨胀(少量),然后变为零。请参阅下面的原始信号和滤波后的信号。

原始频谱

滤波频谱

这是正常行为吗?如果是这样,它实际上是在我的通带中增加了噪音,不是吗?此外,如果我使用更高阶的巴特沃斯滤波器,这种效果会更糟。

2个回答

您观察到的效果主要是由于光谱泄漏它是 DFT 的一个属性,它仅与巴特沃斯滤波器间接相关。y请注意,在 DFT 窗口内有整数个正弦分量的周期。这就是为什么您在频域中看到两个漂亮的峰值而没有任何泄漏的原因。如果y只截断几个样本,即使没有巴特沃斯滤波器,也会出现频谱泄漏,因为现在信号的周期不再与 DFT 窗口对齐:

plot(abs(fft(y(1:97)))) 在此处输入图像描述

Butterworth 滤波器的输出信号在收敛到其稳态之前显示出一些瞬态。所以它不是纯粹的正弦曲线,而且——更重要的是——强正弦曲线分量的周期数与 DFT 窗口的长度不一致。如果您移除初始瞬态并且确保 DFT 窗口与正弦曲线的周期对齐,您将获得两个完美的频谱峰值:

plot(abs(fft(dataOut(11:100)))) 在此处输入图像描述

巴特沃斯滤波器在通带中具有平坦的幅度响应,这通常被称为最大平坦幅度响应。低通滤波器的通带通常是幅度响应“下降”3 dB 或通带幅度的 -3 dB 的频率。这个频率通常被称为低通滤波器的截止频率。

您可以使用语法“freqz(b,a,1024,100)”检查滤波器的频率响应,其中 b 和 a 是巴特沃斯滤波器系数,1024 是计算频率响应的点数(介于 0 Hz 和奈奎斯特频率;这里的奈奎斯特频率为 50 Hz)。点数(在这种情况下为 1024)是任意的。

您设计了一个二阶滤波器。结果,幅度响应的衰减将比具有更高阶的滤波器更平缓。这意味着低阶滤波器的截止频率以下的频率将比高阶滤波器衰减更多。请参阅下面的两个频率响应,一个用于二阶滤波器,另一个用于八阶滤波器。

二阶巴特沃斯滤波器(wc=0.5 pi 弧度/样本

八阶巴特沃斯滤波器(wc=0.5 pi 弧度/样本

如果您想知道滤波器应用于每个音调频率(即分别为 20 Hz 和 10 Hz)的特定衰减量,您可以过滤复合信号的每个音调分量并确定其在稳态下的幅度过滤器响应的一部分。请记住,您已将两种音调的幅度定义为 0.123。

为了澄清起见,最后一点说明。您使用的归一化截止值为 0.5 pi 弧度/样本。这意味着滤波器的以赫兹为单位的截止频率将为 0.5 * 50 Hz -> 25 Hz。

FFT 是一个很好的数值工具,但它也有很多缺陷。缩放和频谱泄漏可能是最常见的两个。