我有一列离散数据存储在shuju.txt文件中,采样时间为4ms,给我把他们进行fft的python代码,并绘制时域和频域图
时间: 2024-09-26 17:05:28 浏览: 33
如何matlab 读取同一个文件中的多个txt 文档.pdf
在Python中,你可以使用`numpy`库来进行离散傅立叶变换(DFT),以及`matplotlib`库来绘制时域和频域图。首先,你需要读取文本文件中的数据,然后计算DFT,最后利用`specgram`函数展示波形。假设数据是以二维数组的形式存储,每一行代表一个时间点,我们可以按如下步骤操作:
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat, wavfile
# 读取数据
with open('shuju.txt', 'r') as file:
data = [float(line) for line in file]
# 将数据转换为二维数组(假设每一行是一帧)
data_2d = np.array(data).reshape(-1, len(data) // (1/0.004)) # 采样率假设为1/0.004 Hz
# 计算离散傅立叶变换
fft_result = np.fft.fft(data_2d)
# 获取实际频率范围
fs = 1 / 0.004 # 采样频率
freqs = np.linspace(0, fs / 2, len(fft_result) // 2 + 1)
# 绘制时域和频域图
fig, axs = plt.subplots(nrows=2)
axs[0].plot(data_2d)
axs[0].set_title('Time Domain')
axs[0].set_xlabel('Samples')
axs[0].set_ylabel('Amplitude')
# 取对数缩放以便更好地查看低频部分
plt.psd(fft_result, Fs=fs, NFFT=None, detrend='constant', axis=-1)
axs[1].semilogy(freqs, 20 * np.log10(np.abs(fft_result[:len(freqs)]))) # 20*log10处理是为了dB单位
axs[1].set_title('Frequency Domain (dB)')
axs[1].set_xlabel('Frequency (Hz)')
axs[1].set_ylabel('Magnitude (dB)')
plt.tight_layout()
plt.show()
阅读全文