我想对我拥有的一些数据执行 FFT。通过加载 scipy 包,我使用 rfft 和 rfftfreq,但是当涉及到绘图时,输出不是应有的结果。当我说它没有显示它应该显示的内容时,我的意思是当我根据频率绘制 FFT 幅度时,频率峰值没有出现在它应该出现的位置(例如 600 Hz),而是出现了为零,其他一切都持平。我的代码如下:
# Load data from the file
with open('25HZ.txt', 'r', encoding="utf-8") as f:
t = []
a = []
for i in f:
columns = i.strip().split('\t')
if len(columns) >= 2:
t.append(float(columns[0]))
a.append(float(columns[1]))
f.close()
# Remove duplicates in t and a
t_sin = []
a_sin = []
for i in range(len(t)):
if t[i] not in t_sin:
t_sin.append(t[i])
a_sin.append(a[i])
t_sin = np.array(t_sin)
a_sin = np.array(a_sin)
# Plot the original data
plt.plot(t_sin, a_sin, '.-')
plt.xlabel('Time (s)', fontsize='14')
plt.ylabel('Wavelength (nm)', fontsize='14')
plt.title('Original Data')
plt.grid(True)
plt.show()
n = len(a_sin) # number of signal samples
Ts = 0.001 # sampling period
Fs = 1 / Ts # sampling frequency
yf = rfft(a_sin, axis=0)
xf = rfftfreq(n, Ts)
# Plot
plt.plot(xf, np.abs(yf))
plt.xlabel('Frequency (Hz)', fontsize='14')
plt.ylabel('FFT Amplitude', fontsize='14')
plt.title('Frequency Spectrum')
plt.grid(True)
plt.show()
我正在做的是从 .txt 文件加载一些数据,创建相同的列表,其中我删除了重复的数据,因为在采样信号时,有时会同时保存相同的数据。然后我使用这些函数来执行 FFT 及其相应的频率。
根据rfftfreq的文档,它接受数据大小作为第一个参数。
参数
n:int - 窗口长度。
d:标量,可选 - 样本间距(采样率的倒数)。默认为 1。
xp:array_namespace,可选 - 返回数组的命名空间。默认值为 None,其中使用 NumPy。
device:设备,可选 - 返回数组的设备。仅当 xp.fft.rfftfreq 实现设备参数时有效。
在你的代码中,你应该有
yf = rfft(a_sin.size, axis=0)