在Python中确定数组的频率

y33*_*33t 9 python text-processing fft transform

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

    -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
Run Code Online (Sandbox Code Playgroud)

这些数字放在文本文件中.我正在尝试读取文本文件并确定此信号的频率.该数据从数字示波器捕获.我可以在范围显示中看到频率,但我也想通过在Python中处理它来验证它.我在PC端使用Python从设备捕获数据.

即使我可以在Python中做一些低级的东西,我也是文本处理的新手.我想我需要先将文件中的数据加载到数组中,然后执行FFT或更简单的算法,该算法将产生以Hz为单位的整数.

从理论上讲,我知道如何进行傅里叶分析,我可以用任何特定信号在纸上进行分析.我不知道从哪里开始在给定数据集的Python.我已经尝试过scipy-numpy的文档,但对我来说效果不好.

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

Dav*_*d Z 13

从您的问题中不清楚文件中的值到底是什么.但假设它们表示连续的电压样本,您可以使用将文件加载到Numpy数组中

import numpy as np
data = np.array([float(f) for f in file(filename).read().split()])
Run Code Online (Sandbox Code Playgroud)

然后将傅立叶变换计算为

import numpy.fft as fft
spectrum = fft.fft(data)
Run Code Online (Sandbox Code Playgroud)

然后,您可以将FFT的幅度绘制为

freq = fft.fftfreq(len(spectrum))
plot(freq, abs(spectrum))
Run Code Online (Sandbox Code Playgroud)

您所看到的内容应与示波器上显示的内容相匹配.

如果要识别频谱中的主导频率,则必须将阵列切割到某个阈值,例如:

threshold = 0.5 * max(abs(spectrum))
mask = abs(spectrum) > threshold
peaks = freq[mask]
Run Code Online (Sandbox Code Playgroud)

freq(并且因此也是peaks)的内容是以采样率为单位的频率.例如,如果示波器每微秒对波形进行采样,则其值freq以兆赫为单位.因此,如果您输入理想的1 kHz信号,您可以使用例如

t = arange(4e6) / 1e6 # sampling times in seconds
data = sin(2 * pi * 1000 * t)
Run Code Online (Sandbox Code Playgroud)

你会得到一个0.001 MHz的峰值,因此你会发现peaks = array([-0.001, 0.001]).