在Python中确定数组的频率

时间:2011-12-20 22:02:32

标签: python transform fft text-processing

我有一个填充浮点数的示例文件,如下所示:

    -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的文档,但对我来说效果不好。

我希望有经验的用户提供指导。

1 个答案:

答案 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])