Как интерпретировать этот график FFT - PullRequest
0 голосов
/ 23 января 2020

Я хочу применить преобразование Фурье с использованием функции fft к моим данным временных рядов, чтобы найти «закономерности» путем извлечения доминирующих частотных компонентов в наблюдаемых данных, ie. самые низкие 5 доминирующих частот, чтобы предсказать значение y (количество бактерий) в конце каждого временного ряда. Я хотел бы сохранить наименьшие 5 коэффициентов как функции и исключить остальные.

Мой код такой, как показано ниже:

df = pd.read_csv('/content/drive/My Drive/df.csv', sep=',') 
X = df.iloc[0:2,0:10000]

dft_X = np.fft.fft(X) 
print(dft_X) 
print(len(dft_X))
plt.plot(dft_X)
plt.grid(True)
plt.show()

# What is the graph about(freq/amplitude)? How much data did it use? 
for i in dft_X: 

    m = i[np.argpartition(i,5)[:5]]
    n = i[np.argpartition(i,range(5))[:5]]

print(m,'\n',n)

Вот вывод: enter image description here

Но я не уверен, как интерпретировать этот график. Чтобы быть точным,

1) Показывает ли график преобразованные значения входных данных? Я использовал только 2 строки данных (каждая строка - временной ряд), таким образом, данные 2x10000, почему на графике так много строк?

2) Чтобы получить значение частоты, я должен использовать np.fft.fftfreq(n, d=timestep)?

Параметры:
n: int Длина окна.

d: скаляр, опционально Интервал между выборками (обратный к частоте дискретизации). По умолчанию 1.

Возвращает:
f: ndarray Массив длины n, содержащий частоты выборки.

Как определить n (длина окна) и sample spacing ?

3) Почему преобразованные значения являются комплексными числами?

Спасибо

1 Ответ

2 голосов
/ 23 января 2020

Я отвечу в обратном порядке на ваши вопросы

3) Почему преобразованные значения представляют собой все комплексные числа?

Результатом преобразования Фурье всегда являются комплексные числа. Чтобы обойти этот факт, вы можете либо применить абсолютное значение к выходу преобразования, либо только построить реальную часть, используя:

plt.plot(dft_X.real)

2) Чтобы получить значение частоты, я должен использовать np.fft.fftfreq (n, d = временной шаг)?

Нет, «значения частоты» будут видны на выходе БПФ.

1) Показывает ли график преобразованные значения входных данных? Я использовал только 2 строки данных (каждая строка является временным рядом), таким образом, данные имеют размер 2x10000, почему на графике так много строк?

В вашем графике столько строк, потому что он создает строка для каждого столбца вашего набора данных. Примените БПФ к каждой строке отдельно (или, возможно, просто транспонируйте ваш фрейм данных), и тогда вы получите больше фактических графиков частотной области.


Follow

Будет ли использование абсолютного значения или действительной части вывода, поскольку функции для более поздней модели, будут отличаться от использования исходного вывода?

С абсолютными значениями работать легче, как правило.

Использование действительной части plot of FFT with real() Использование абсолютного значения plot of FFT using abs() Вот код Octave, который сгенерировал это:

Fs = 4000;                          % Sampling rate of signal
T  = 1/Fs;                          % Period
L  = 4000;                          % Length of signal
t  = (0:L-1)*T;                     % Time axis

freq = 1000;                        % Frequency of our sinousoid

sig   = sin(freq*2*pi*t);           % Fill Time-Domain with 1000 Hz sinusoid
f_sig = fft(sig);                   % Apply FFT

f = Fs*(0:(L/2))/L;                 % Frequency axis

figure
  plot(f,abs(f_sig/L)(1:end/2+1));  %      peak at 1kHz)
figure 
  plot(f,real(f_sig/L)(1:end/2+1)); % main peak at 1kHz)

В моем примере вы можете видеть, что абсолютное значение не возвращало шума на частотах, отличных от синусоиды с частотой 1 кГц, которую я генерировал, в то время как реальная часть имела больший пик на 1 кГц, но также имел гораздо больший шум. 1047 * Что касается эффектов, я не знаю, что вы подразумеваете под этим.

Ожидается ли, что «значения частоты» всегда будут комплексными числами

Всегда? Нет. Ряд Фурье представляет частотные коэффициенты, при которых сумма синусов и косинусов полностью равняется любой непрерывной функции periodi c. Синусы и косинусы могут быть записаны в сложных формах по формуле Эйлера. Это наиболее удобный способ хранения коэффициентов Фурье. По правде говоря, мнимая часть вашего сигнала в частотной области представляет фазу сигнала. (т.е. если у меня есть 2 функции синуса на одной частоте, они могут иметь различные сложные формы в зависимости от временного сдвига). Однако большинство библиотек, которые предоставляют функцию FFT, по умолчанию сохраняют коэффициенты FFT в виде комплексных чисел, чтобы упростить вычисления фазы и величины.

Условно ли, что FFT использует каждый столбец набора данных при построении графика line

Я думаю, что это проблема с mathplotlib.plot, а не np.fft.

Не могли бы вы показать мне, как применять FFT для каждой строки отдельно

Есть много способов go обойти это, и я не хочу навязывать вам один путь, поэтому я предложу общее решение для итерации по каждой строке вашего фрейма данных и применения FFT к каждый конкретный c ряд. В противном случае, в вашем случае, я полагаю, что транспонирование вашего вывода может также работать.

...