傅里叶变换去噪.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #开发时间:2024/6/12 14:23
  2. import numpy as np
  3. import pandas as pd
  4. from scipy.fft import fft, ifft
  5. import matplotlib.pyplot as plt
  6. from matplotlib import rcParams
  7. # 傅里叶变换去噪
  8. def fft_denoise(signal, cutoff_freq, fs):
  9. signal_fft = fft(signal)
  10. frequencies = np.fft.fftfreq(len(signal), 1/fs)
  11. signal_fft[np.abs(frequencies) > cutoff_freq] = 0
  12. return ifft(signal_fft).real
  13. plt.rcParams['xtick.direction'] = 'in'
  14. plt.rcParams['ytick.direction'] = 'in'
  15. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
  16. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
  17. config = {
  18. "font.family": 'serif',
  19. "font.size": 20,
  20. "mathtext.fontset": 'stix',
  21. "font.serif": ['Times New Roman'], # 宋体
  22. 'axes.unicode_minus': False # 处理负号
  23. }
  24. rcParams.update(config)
  25. # 读取信号
  26. fs = 1000
  27. noisy_signal = pd.read_csv('noisy_signals_time.csv')
  28. # 检查是否包含时间列
  29. if 'time' in noisy_signal.columns:
  30. time_column = noisy_signal['time'].values.reshape(-1, 1)
  31. other_columns = noisy_signal.drop(columns='time')
  32. else:
  33. time_column = None
  34. other_columns = noisy_signal
  35. # 应用去噪方法
  36. cutoff_freq = 10 # 截止频率
  37. denoised_signals = pd.DataFrame()
  38. for column in other_columns.columns:
  39. denoised_signals[column] = fft_denoise(other_columns[column].values, cutoff_freq, fs)
  40. # 如果有时间列,将其添加回去
  41. if time_column is not None:
  42. denoised_signals.insert(0, 'time', time_column)
  43. # 保存去噪后的信号到CSV文件
  44. denoised_signals.to_csv('denoise_fft.csv', index=False)
  45. # 绘图
  46. plt.figure(figsize=(12, 10))
  47. # 绘制原始信号和去噪后信号(这里只绘制第一列作为示例)
  48. plt.subplot(2, 1, 1)
  49. plt.plot(noisy_signal.iloc[:, 1], label='Noisy Signal')
  50. plt.legend()
  51. plt.subplot(2, 1, 2)
  52. plt.plot(denoised_signals.iloc[:, 1], label='FFT Denoised')
  53. plt.legend()
  54. plt.tight_layout()
  55. plt.show()