我知道我不是第一个遇到这个问题的人,但我没有找到正确的答案,所以我希望你能帮助我。
在一个电路模拟器中,我在时域中模拟了我的电路,并将一个信号保存在一个 .txt 文件中(其中包含时间和信号值)。基于该 .txt 文件,我想生成一个 FFT 以查看频域中的信号。
不幸的是,电路模拟器的时间步长可变,这让我很难获得正确的 FFT 值(此时双面或单面是第二优先级)
我设法从我的数据中得到了一些 FFT,但我在验证它的正确性时遇到了困难,因此感谢任何关于此事的帮助。我的模拟文件给了我不同的平均值和 RMS 值,因此造成了混乱。谢谢你。下面给出了我的 .txt 文件的链接(因为我在这里找不到直接上传 txt 文件的方法): https ://file.io/PXuD9sWR
我的 Python 代码:
import numpy as np
from scipy.fftpack import fft
import matplotlib.pyplot as plt
import pandas as pd
buckstruct = pd.read_csv('buck.txt', sep = '\\t', engine='python')
bucktime = buckstruct.iloc[:,0]
bucktime = bucktime.values.tolist()
buckcurrent = buckstruct.iloc[:,1]
buckcurrent = buckcurrent.values.tolist()
bucktime_flt = []
buckcurrent_flt = []
# Filter out the start-up transient. Save only steady state values
for i in range(len(bucktime)):
if bucktime[i] > 0.002:
bucktime_flt.append(bucktime[i])
buckcurrent_flt.append(buckcurrent[i])
plt.plot(bucktime_flt, buckcurrent_flt)
buckfft = fft(buckcurrent_flt)
buckfft_flt = []
# Double the amplitude for harmonics as a first step to converter from two-sided to single-sided FFT
for i in range(len(buckfft)):
if i == 0:
buckfft_flt.append(1.0/len(bucktime_flt)*abs(buckfft[i]))
else:
buckfft_flt.append(2.0/len(bucktime_flt)*abs(buckfft[i]))
plt.plot(buckfft_flt)