Определение частоты массива в Python - PullRequest
9 голосов
/ 21 декабря 2011

У меня есть образец файла, заполненный числами с плавающей запятой следующим образом:

    -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. Я получаю данные с устройства с Python на стороне ПК.

Несмотря на то, что я могу делать некоторые вещи низкого уровня в Python, я полностью новичок в обработке текста. Я полагаю, мне нужно сначала загрузить данные в файл в массив, а затем выполнить БПФ или более простой алгоритм, который даст целое число в Гц.

Теоретически я знаю, как выполнить анализ Фурье, и я могу сделать это на бумаге для любого заданного сигнала. Я понятия не имею, с чего начать в Python для данного набора данных. Я уже попробовал документацию по scipy-numpy, но у меня это не получилось.

Буду признателен за советы опытных пользователей.

1 Ответ

12 голосов
/ 21 декабря 2011

Из вашего вопроса не ясно, что именно представляют значения в файле. Но если предположить, что они указывают последовательные выборки напряжения, вы можете загрузить файл в массив 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)

Затем вы можете построить величины БПФ как

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 кГц, что вы можете сделать, например, с

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

вы получите пик на 0,001 МГц, и соответственно вы обнаружите, что peaks = array([-0.001, 0.001]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...