在时域和频域中过滤信号

问题描述 投票:0回答:1

我正在尝试在频域中进行过滤。我有参数 a,b (M 阶分子 b 和 N 阶分母 a )。在时域中我可以执行以下操作:

y_time_domain = lfilter(b, a, sig_noise)

噪声数据中的sig_noise。

如何过滤FFT后的sig_noise?

python time-series fft
1个回答
0
投票

我相信您需要的第一步是了解滤波器的频率响应。根据我的理解,“lfilter”只是根据您提供的“b”和“a”滤波器系数向量创建一个滤波器。这些向量来自 Z 域中传递函数的分子和分母中的系数。因此,也接受“b”和“a”的“freqz”应该描述相同的行为。请注意,还有相位响应,但我不想让这篇文章变得太复杂。

当您对数据应用滤波器时,您可以想象曲线(如图所示)乘以信号的频谱。这相当于通过卷积在时域中应用滤波器。您只需将“b”和“a”放入代码中即可查看其响应。从那里,您可以开始计算截止频率等。

或者您可以完全跳过滤波器,简单地在频域中对信号进行阈值处理,以消除不需要的频率……但这并不那么容易。通过这样做,您将添加当您转换回时域时将出现的伪像。你必须通过数学来理解为什么会出现这种情况。 (阈值将在频域中模拟方波脉冲,这将在时域中产生正弦响应)。

fs = None
b = [1, 1]
a = [2]

# Frequency Characteristics
w, h = signal.freqz(b, a)

# plot
plt.figure()
if fs is None:   
    plt.plot(w, np.abs(h)**2)
    plt.xlim([0, np.pi])
    plt.xlabel('Normalized Frequency (rad/sample)')
else:
    plt.plot(w*fs/(2*np.pi), np.abs(h)**2)
    plt.xlim([0, fs/2])
    plt.xlabel('Frequency (Hz)')
plt.ylabel('Frequency Response')
plt.title('Digital Filter Frequency Response')
plt.show()

© www.soinside.com 2019 - 2024. All rights reserved.