Как использовать Numpy.FFT на импульсном сигнале - PullRequest
0 голосов
/ 14 февраля 2019

Я только начинаю учить numpy.fft, поэтому заранее извиняюсь.У меня есть массив, состоящий из 1000 элементов 1 и 0, представляющих 1000 мс импульсного входа, состоящего из истинных и ложных.Я хотел выполнить rfft для этого массива.Для простого примера я создал этот массив, который имеет 1 на каждый 3-й элемент и 0 в противном случае:

freq = 3
for j in range(0, 1000):
    if freq != 0 and (((j + 1) % freq) == 0):
        arr3hz.append(1)
    else:
        arr3hz.append(0)

Я ожидал, что rfft как-то даст мне 3 Гц, я использовал этот код:

n = len(arr3hz)
d = 1 / 1000
hs = np.fft.rfft(arr3hz)
fs = np.fft.rfftfreq(n, d)
amps = np.absolute(hs)

for j in range(0, len(fs)):
    fw.write("Freq: %d Amp: %f\n" % (fs[j], amps[j]))

В моем письменном файле я просто вижу элементы со случайной частотой со случайными амплитудами, которые я не смог понять.Что не так с моим использованием numpy.rfft?Я также не был уверен, что использовать для n и d, а также для такого массива.

1 Ответ

0 голосов
/ 14 февраля 2019

Здесь происходит несколько вещей.

  1. Первый блок дает период 3 мс, то есть частоту 333,33 Гц
  2. Среднее значение не равно нулю, поэтому также будет нольчастотная составляющая.
  3. 1000 мс не делится на 3 мс.Дискретное преобразование Фурье предполагает, что весь сигнал повторяется с периодом, равным длине окна (1000 мс).Это означает, что у вас есть 332 интервала 3 мс и 1 интервал 4 мс.Поскольку он не является периодическим при 333 Гц, будет разброс частот.

Вы использовали правильные значения для n и d.
В общем, я нахожу этоболее полезно построить вывод, чем распечатать значения.

import matplotlib.pyplot as plt
plt.plot(fs, amps)

см.

pulse_freq_plot

...