我目前正在过滤一些数据,但在从大趋势中过滤较小的频率时遇到了麻烦。反向 FFT 似乎在开始和结束时有很大的尖峰。这是过滤较小频率之前和之后的数据。
我研究了数学现象,它被称为吉布斯现象。有没有办法解决这个问题,以清除一些重叠频率的数据而不产生这种效果。或者是否有一种解决方法可以使尖峰尽可能小。
顺便说一句,这是代码:
fourier_transformation= np.fft.fft(Sensor_4)
frequencies = np.fft.fftfreq(len(time), d=1/Values_per_second)
fourier_transformation[np.abs(frequencies) > 0.18] = 0
Sensor_4 = np.fft.ifft(fourier_transformation)
完全正确,在过滤后的信号中观察到的“振铃”是吉布斯现象造成的。当使用具有非连续性的急剧截止频率在频域中截断信号时,就会发生这种情况(例如,使用
frequencies > 0.18
设置为零的情况)。
可以通过几种方法减少或减轻吉布斯现象的影响:
1. 使用窗函数:
- 这是在频域中平滑截止频率的最常用方法。通过将的信号与窗函数相乘,可以衰减截止频率附近的突变,从而减少振铃。
-
有许多不同的窗函数可用,每种窗函数都有其优缺点。一些常见的窗口包括:
- 汉明窗: 具有良好的整体性能,是不错的起点。
- 汉宁窗: 类似于汉明窗,但中心波瓣略宽。
- 布莱克曼窗: 在主瓣中具有更大的衰减,但过渡区域更宽。
-
在的代码中,可以通过以下方式实现汉明窗:
```python import numpy as np
fourier_transformation = np.fft.fft(Sensor_4) frequencies = np.fft.fftfreq(len(time), d=1/Values_per_second)
# 生成汉明窗并将其应用于傅里叶变换 window = np.hamming(len(Sensor_4)) fourier_transformation = fourier_transformation * window
fourier_transformation[np.abs(frequencies) > 0.18] = 0 Sensor_4 = np.fft.ifft(fourier_transformation) ```
2. 增加截止频率处的过渡区域:
- 不要在的截止频率处进行突然的跳跃,而是创建一个从通带来阻带的更平滑的过渡。这可以通过使用在截止频率附近逐渐滚降的滤波器来实现。
- 这将减少振铃的幅度,但它也会使滤波器的截止频率不那么尖锐。
3. 使用不同的滤波器设计技术:
-
正在使用一种非常简单的矩形滤波器(也称为理想低通滤波器)的频域方法。还有其他滤波器设计技术,如 FIR 或 IIR 滤波器,它们可以创建具有不同特性的滤波器,并且可以最大限度地减少振铃。这些滤波器可以在频域或时域中实现。
-
以下是使用 scipy.signal 库设计 FIR 低通滤波器并将其应用于的数据的示例:
```python import numpy as np from scipy.signal import firwin, lfilter
# 定义滤波器参数 order = 100 # 滤波器阶数(越高,截止越陡峭) cutoff_freq = 0.18 # Hz 中的截止频率
# 设计 FIR 低通滤波器 taps = firwin(order, cutoff_freq, fs=Values_per_second)
# 使用设计的滤波器对信号进行滤波 Sensor_4_filtered = lfilter(taps, 1.0, Sensor_4) ```
最佳方法将取决于的具体应用和要求。在许多情况下,使用窗函数是一个很好的起点。它相对容易实现,并且可以显着减少振铃的量。
标签:python,numpy,fft From: 78788533