如何在Python中进行FFT?

问题描述 投票:0回答:1

图片说明

我想对我拥有的一些数据执行 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 及其相应的频率。

python scipy transform fft
1个回答
0
投票

根据rfftfreq的文档,它接受数据大小作为第一个参数。

参数

n:int - 窗口长度。

d:标量,可选 - 样本间距(采样率的倒数)。默认为 1。

xp:array_namespace,可选 - 返回数组的命名空间。默认值为 None,其中使用 NumPy。

device:设备,可选 - 返回数组的设备。仅当 xp.fft.rfftfreq 实现设备参数时有效。

在你的代码中,你应该有

yf = rfft(a_sin.size, axis=0)
© www.soinside.com 2019 - 2024. All rights reserved.