欢迎访问宙启技术站
智能推送

利用scipy.fftpack库进行信号降噪

发布时间:2023-12-17 04:30:58

使用scipy.fftpack库进行信号降噪可以通过频域滤波的方式实现。下面是一个使用例子,包括生成带有噪声的信号、进行傅里叶变换、滤波、逆傅里叶变换的过程。

首先,引入必要的库:

import numpy as np
from scipy import fftpack
import matplotlib.pyplot as plt

接下来,生成一个带有噪声的信号。我们可以使用numpy库的随机数生成函数来生成一个正弦信号,并添加一些高斯噪声:

# 生成信号
duration = 1.0                      # 信号时长
sampling_freq = 1000.0              # 采样频率
t = np.arange(0, duration, 1/sampling_freq)
signal_freq = 5.0                   # 正弦信号频率
signal = np.sin(2 * np.pi * signal_freq * t)
# 添加高斯噪声
noise = np.random.normal(0, 0.5, len(t))
noisy_signal = signal + noise

生成的信号具有5Hz的正弦信号,并添加了服从均值为0、标准差为0.5的高斯噪声。

接下来,我们使用fftpack库的fft函数对信号进行傅里叶变换,并计算频谱:

# 进行傅里叶变换
signal_fft = fftpack.fft(noisy_signal)
freqs = fftpack.fftfreq(len(t), 1/sampling_freq)
# 计算频谱振幅
amplitudes = np.abs(signal_fft)

通过傅里叶变换,我们可以获取信号的频谱振幅。

接下来,我们可以使用频域滤波的方法对信号进行降噪。在本例中,我们采用阈值滤波的方法,将低于某个阈值的振幅对应的频率成分置零:

# 设置阈值
threshold = 10
# 将低于阈值的频谱振幅置零
signal_fft[np.abs(signal_fft) < threshold] = 0

通过将低于阈值的频谱振幅置零,我们滤除了低于该阈值的频率成分。

最后,我们将滤波后的频谱通过逆傅里叶变换恢复到时域,并可视化处理结果:

# 进行逆傅里叶变换
filtered_signal = fftpack.ifft(signal_fft)
# 可视化结果
fig, axs = plt.subplots(3, 1, sharex=True)
axs[0].plot(t, noisy_signal)
axs[0].set_xlabel("Time [s]")
axs[0].set_ylabel("Signal")
axs[1].plot(freqs, amplitudes)
axs[1].set_xlabel("Frequency [Hz]")
axs[1].set_ylabel("Amplitude")
axs[2].plot(t, filtered_signal)
axs[2].set_xlabel("Time [s]")
axs[2].set_ylabel("Filtered Signal")
plt.show()

在图中, 行是添加噪声的原始信号,第二行是傅里叶变换后的频谱振幅,第三行是经过滤波后的信号。

这个例子展示了如何使用scipy.fftpack库对信号进行降噪,通过频谱分析和频域滤波的步骤,可以有效地去除信号中的噪声。