利用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库对信号进行降噪,通过频谱分析和频域滤波的步骤,可以有效地去除信号中的噪声。
