12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- import numpy as np
- import pandas as pd
- import matplotlib.font_manager
- import matplotlib.pyplot as plt
- matplotlib.use("TkAgg")
- def isLocalMax(data: "np.ndarray", idx: "int", win: "int" = 10) -> "bool":
- if idx < win or idx > data.size - win:
- return False
- for i in range(1, win + 1):
- if data[idx] < data[idx - i] or data[idx] < data[idx + i]:
- return False
- return True
- def getFreqAndAmple(
- data: "np.ndarray",
- count: "int" = 10,
- hold: "int" = 500,
- win: "int" = 10,
- img: "bool" = False
- ) -> "np.ndarray":
- time = np.linspace(0, 0.38 * data.size / 128, data.size)
- fft = np.fft.fft(data)
- frq = np.fft.fftfreq(data.size, time[1] - time[0])
- pFrq = frq[:frq.size // 2]
- pFft = np.abs(2.0 / data.size * fft[:fft.size // 2])
- result, idx = np.zeros((count, 2)), 0
- for i in range(win, pFft.size - win):
- if isLocalMax(pFft, i, win) and pFft[i] > hold:
- result[idx][0], result[idx][1] = pFrq[i], pFft[i]
- idx += 1
- if idx >= count:
- break
- print(result)
- if img:
- # 绘制原始信号
- plt.subplot(2, 1, 1)
- plt.plot(time, data)
- plt.title('Raw Frequency')
- plt.xlabel('Frequency (Hz)')
- plt.ylabel('Magnitude')
- # 绘制频率信号
- plt.subplot(2, 1, 2)
- plt.plot(pFrq, pFft)
- plt.title('Positive Frequency')
- plt.xlabel('Frequency (Hz)')
- plt.ylabel('Magnitude')
- plt.show()
- return result
- def main():
- file = "data/csv/ac/电动车波形2.csv"
- data = pd.read_csv(file, header=None)
- signal = data[0].to_numpy().flatten()[:128]
- getFreqAndAmple(signal, count=10, hold=180, win=3, img=True)
- if __name__ == "__main__":
- main()
|