fft.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.font_manager
  4. import matplotlib.pyplot as plt
  5. matplotlib.use("TkAgg")
  6. def isLocalMax(data: "np.ndarray", idx: "int", win: "int" = 10) -> "bool":
  7. if idx < win or idx > data.size - win:
  8. return False
  9. for i in range(1, win + 1):
  10. if data[idx] < data[idx - i] or data[idx] < data[idx + i]:
  11. return False
  12. return True
  13. def getFreqAndAmple(
  14. data: "np.ndarray",
  15. count: "int" = 10,
  16. hold: "int" = 500,
  17. win: "int" = 10,
  18. img: "bool" = False
  19. ) -> "np.ndarray":
  20. time = np.linspace(0, 0.38 * data.size / 128, data.size)
  21. fft = np.fft.fft(data)
  22. frq = np.fft.fftfreq(data.size, time[1] - time[0])
  23. pFrq = frq[:frq.size // 2]
  24. pFft = np.abs(2.0 / data.size * fft[:fft.size // 2])
  25. result, idx = np.zeros((count, 2)), 0
  26. for i in range(win, pFft.size - win):
  27. if isLocalMax(pFft, i, win) and pFft[i] > hold:
  28. result[idx][0], result[idx][1] = pFrq[i], pFft[i]
  29. idx += 1
  30. if idx >= count:
  31. break
  32. print(result)
  33. if img:
  34. # 绘制原始信号
  35. plt.subplot(2, 1, 1)
  36. plt.plot(time, data)
  37. plt.title('Raw Frequency')
  38. plt.xlabel('Frequency (Hz)')
  39. plt.ylabel('Magnitude')
  40. # 绘制频率信号
  41. plt.subplot(2, 1, 2)
  42. plt.plot(pFrq, pFft)
  43. plt.title('Positive Frequency')
  44. plt.xlabel('Frequency (Hz)')
  45. plt.ylabel('Magnitude')
  46. plt.show()
  47. return result
  48. def main():
  49. file = "data/csv/ac/电动车波形2.csv"
  50. data = pd.read_csv(file, header=None)
  51. signal = data[0].to_numpy().flatten()[:128]
  52. getFreqAndAmple(signal, count=10, hold=180, win=3, img=True)
  53. if __name__ == "__main__":
  54. main()