【问题标题】:Determining frequency of an array in Python在 Python 中确定数组的频率
【发布时间】:2012-01-24 20:04:19
【问题描述】:

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

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

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

【问题讨论】:

标签: python transform fft text-processing


【解决方案1】:

从您的问题中不清楚文件中的值究竟代表什么。但假设它们表示连续的电压样本,您可以使用

将文件加载到 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])

【讨论】:

  • 是的,文件中存储的值是电压。当我按照您的建议进行操作时,出现以下错误:ValueError: setting an array element with a sequence.
  • 当文件中并非所有行都具有相同的列数时会发生这种情况。试试修改后的版本。
  • 以下更正; freq = np.fft.fftfreq(len(spectrum)) 我提供了一个 1Khz 信号来验证操作,结果是; 0.00000000e+00 2.45098039e-05 4.90196078e-05 ..., 7.35294118e-05 -4.90196078e-05 -2.45098039e-05 我错过了什么?
  • 文件中的数据是电压值,freq变量应该是频率,单位是赫兹,1KHz信号应该是1.000e+03。
  • 我的意思是,你打印出什么给你“ 0.00000000e+00 2.45098039e-05 4.90196078e-05 ..., 7.35294118e-05 -4.90196078e-05 -2.45098039e-05 “?请注意,freq 不是以 Hz 为单位的(除非您的示波器每秒仅采样一次),这可能是造成混淆的原因之一。查看我的最新编辑。
猜你喜欢
  • 2017-11-14
  • 2012-06-15
  • 1970-01-01
  • 2016-09-17
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
相关资源
最近更新 更多