This repository has been archived on 2025-04-28. You can view files and clone it, but cannot push or open issues or pull requests.
CMS/5.MISC/usb读取数据画图/FFT.py
2024-11-19 17:19:21 +08:00

105 lines
3.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import numpy as np
import pylab as pl
import scipy as sc
import time
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['WenQuanYi Micro Hei'] # 显示中文
mpl.rcParams['axes.unicode_minus'] = False # 显示负号
# 从文件中读取数据后续直接使用usb省略这一步
def Read_data(data_name):
# 通过文件读取数据
# mat_data = sc.io.loadmat(data_name) # 读取文件
#
# mat_data.keys() # 获得文件分类
#
# data = mat_data["X122_DE_time"] # 提取振动数据
data = np.loadtxt(data_name)
# print(data)
# print(len(data))
return data
# 对数据进行快速傅里叶变换
def FFT(rate, number, data):
sampling_rate = rate # 采样频率
fft_size = number # FFT处理的数据样本数
time_start = time.time()
# 进行快速傅里叶变换
xs = data[:fft_size] # 从波形数据中取样fft_size个点进行运算
# 利用np.fft.fft()进行FFT计算
# rfft返回N/2+1个数据。而fft返回N个数据但这N个数据是左右对称的因此实际有效的是N/2+1个数据。
time_end1 = time.time()
xfft = sc.fft.fftn(xs)
# a = 0
# while a < fft_size:
# print(a, ":", xfft[a])
# a = a + 1
# 打印显示前5个傅里叶转换结果
# 可以看出傅里叶转换结果是复数
# 复数用y=a+bj的形式表示a为实部b为虚部
# print(xfft[:5])
# 通过下面的np.linspace计算出返回值中每个下标对应的真正的频率
# 最后除以1e3将频率单位由Hz转换为KHz
time_end2 = time.time()
freqs = np.linspace(0, int(sampling_rate), int(fft_size)) / 1000
# 对复数取绝对值(取模运算)复数的模为√a^2 + b^2
abs_xfft = abs(xfft)
time_end3 = time.time()
# a = 0
# while a < fft_size:
# print(a, ":", abs_xfft[a])
# a = a + 1
# print("Time1", time_end1 - time_start)
# print("Time2", time_end2 - time_end1)
# print("Time3", time_end3 - time_end2)
print("Time4", time_end3 - time_start)
print()
return freqs, abs_xfft
# 画出时域信号和频域信号图谱
def draw_figur(data, fft_size, freqs, abs_xfft, sampling_rate):
fig = pl.figure()
# 使用鼠标缩放图片
def call_back(event):
axtemp = event.inaxes
x_min, x_max = axtemp.get_xlim()
fanwei = (x_max - x_min) / 10
if event.button == 'up':
axtemp.set(xlim=(x_min + fanwei, x_max - fanwei))
print('up')
elif event.button == 'down':
axtemp.set(xlim=(x_min - fanwei, x_max + fanwei))
print('down')
fig.canvas.draw_idle() # 绘图动作实时反映在图像上
fig.canvas.mpl_connect('scroll_event', call_back)
fig.canvas.mpl_connect('button_press_event', call_back)
pl.subplot(3, 1, 1) # 截取幕布的一部分
np.linspace(-5, 5, 10)
pl.plot(data[:fft_size], color='r')
pl.xlabel('点数')
pl.ylabel('加速度值')
pl.title('时域信号')
pl.subplot(3, 1, 3) # 截取幕布的一部分
np.linspace(-5, 5, 10)
pl.title(f"频域信号(通道号:{sampling_rate})")
pl.ylabel("振幅")
pl.xlabel("频率(KHz)")
pl.plot(freqs, abs_xfft)
time_name = time.time()
pl.show()
# pl.savefig(f"{time_name}.png")