我有一个填充浮点数的示例文件,如下所示:
-0.02 3.04 3.04 3.02 3.02 3.06 3.04 3.02 3.04 3.02 3.04 3.02
3.04 3.02 3.04 3.04 3.04 3.02 3.04 3.02 3.04 3.02 3.04 3.02
3.06 3.02 3.04 3.02 3.04 3.02 3.02 3.06 3.04 3.02 3.04 3.02
3.04 3.02 3.04 3.04 3.04 3.02 3.04 3.02 3.02 3.06 3.04 3.02
3.06 3.02 3.04 -0.02 -0.02 -0.02 -0.02 -0.02 -0.02 -0.04 -0.02 -0.04
这些数字放在文本文件中。我正在尝试读取文本文件并确定此信号的频率。该数据从数字示波器捕获。我可以在范围显示中看到频率,但我也想通过在Python中处理它来验证它。我在PC端使用Python从设备捕获数据。
即使我可以用Python做一些低级的东西,我也是文本处理的新手。我想我需要首先将文件中的数据加载到数组中,然后执行FFT或更简单的算法,该算法将产生以Hz为单位的整数。
理论上我知道如何进行傅立叶分析,我可以用任何特定信号在纸上进行分析。我不知道从哪里开始在给定数据集的Python。我已经尝试过scipy-numpy的文档,但对我来说效果不好。
我希望有经验的用户提供指导。
答案 0 :(得分:11)
从您的问题中不清楚文件中的值到底是什么。但假设它们表示连续的电压样本,您可以使用
将文件加载到Numpy数组中import numpy as np
data = np.array([float(f) for f in file(filename).read().split()])
然后将傅立叶变换计算为
import numpy.fft as fft
spectrum = fft.fft(data)
然后,您可以将FFT的幅度绘制为
freq = fft.fftfreq(len(spectrum))
plot(freq, abs(spectrum))
您看到的内容应与示波器上显示的内容相匹配。
如果要识别光谱中的主要频率,则必须将阵列切割到某个阈值,例如:像这样的东西:
threshold = 0.5 * max(abs(spectrum))
mask = abs(spectrum) > threshold
peaks = freq[mask]
freq
(以及peaks
)的内容是以采样率为单位的频率。例如,如果示波器每微秒对波形进行采样,则freq
中的值以兆赫为单位。因此,如果您输入理想的1 kHz信号,您可以使用例如
t = arange(4e6) / 1e6 # sampling times in seconds
data = sin(2 * pi * 1000 * t)
您将获得0.001 MHz的峰值,因此您会发现peaks = array([-0.001, 0.001])
。