Каково влияние аргумента n в numpy .fft.fft - PullRequest
0 голосов
/ 23 января 2020

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

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

dft_X = np.fft.fft(X)     # What should I fill in for argument n?
print(dft_X) 
print(len(dft_X))
plt.plot(dft_X)
plt.grid(True)
plt.show()

for i in dft_X: 

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

print(m,'\n',n)

В scipy do c на numpy.fft.fft указано, что

numpy .fft.fft (a , n = Нет, ось = -1, норма = Нет)

...

n: int, необязательно

Длина преобразованной оси выхода. Если n меньше длины входа, вход обрезается. Если оно больше, ввод дополняется нулями. Если n не задано, используется длина входных данных вдоль оси, заданной осью.

Но мне все еще неясно, как влияет значение аргумента n на выходные данные и как решить, что значение для использования.

Я заметил, что когда n = 10, вывод выглядит следующим образом:

# n= 10
# [-1.5       -1.11022302e-16j -0.46352549-1.42658477e+00j
#  -1.21352549-8.81677878e-01j -1.21352549+8.81677878e-01j
#  -0.46352549+1.42658477e+00j] 
#  [-1.5       -1.11022302e-16j -1.21352549-8.81677878e-01j
#  -1.21352549+8.81677878e-01j -0.46352549-1.42658477e+00j
#  -0.46352549+1.42658477e+00j]

, а когда n = 10000, вывод выглядит следующим образом:

# n= 10000
# [-4752.15448944 +4113.44846878j -5199.36419709 -1826.78753048j
#  -4659.45705354-13014.97971229j -4752.15448944 -4113.44846878j
#  -5199.36419709 +1826.78753048j] 
#  [-5199.36419709 -1826.78753048j -5199.36419709 +1826.78753048j
#  -4752.15448944 -4113.44846878j -4752.15448944 +4113.44846878j
#  -4659.45705354-13014.97971229j]

Что определяет правильное значение n для использования? Кроме того, почему выходные значения комплексных чисел? Любая помощь приветствуется.

Вот график временных рядов для справки: enter image description here

1 Ответ

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

Но мне все еще неясно, как влияет значение аргумента n на вывод и как решить, какое значение использовать.

Для «n = размер входа» результатом является простое дискретное преобразование Фурье: оно представляет сигнал длительности (T = n dt) точно в частотном пространстве. Самая низкая частотная составляющая - это синус / косинус периода волны 2T.

Для «n> size of input» выполняется преобразование исходного сигнала с добавлением нулей. Таким образом, самая низкая частота, которая может быть представлена, соответствует более длинному периоду 2T волны. Таким образом, сигнал резко обрезается до нуля. В зависимости от входного сигнала это может привести к нежелательным высокочастотным компонентам.

Для «n <размер входа» вы усекаете сигнал. Если у вас есть «стационарный сигнал», имеет смысл проанализировать более короткие выборки (возможно, с помощью окон). </p>

Что определяет правильное значение n для использования?

Это зависит от области применения и выборки (очень длинные стационарные серии, короткие измерения, ...). Если у вас нет причин использовать эту опцию, вы можете опустить n.

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

Преобразование Фурье реального сигнала сложный в общем. Это реально только для четных сигналов.

Вы можете играть с БПФ с простыми сигналами, такими как чистый синус или косинус, чтобы понять это.

...