Странный БПФ сюжет с случайным множеством - PullRequest
4 голосов
/ 15 марта 2019

код ниже:

import numpy as np 
from numpy import random_intel
import mkl_fft
import matplotlib.pyplot as plt

n = 10**5
a = np.random_intel.rand(n)
b = mkl_fft.fft(a)
plt.scatter(b.real,b.imag)
plt.show()
print(b)
for i in b :
    if i.real > n/2:
        print("Weird FFT Number is ",i)

Результат: output

Вы видите:

Weird FFT Number is  (50020.99077289924+0j)

Почему БПФ со случайным набором вышел одним конкретным числом?


(Спасибо Полу Панцеру и SleuthEye)

С mkl_fft.fft(a-0.5) конечный результат: final result


[2019/03/29 обновлено]

С нормализованными данными все прошло хорошо

b = mkl_fft.fft((a - np.mean(a))/np.std(a))

Среднее значение (a - np.mean(a))/np.std(a) близко к нулю

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Большое значение на выходе БПФ оказывается самым первым, соответствующим компоненту постоянного тока.Это указывает на то, что вход имеет ненулевое среднее значение по всему набору данных.

Действительно, если вы посмотрите ближе на входные данные, вы можете заметить, что значения всегда находятся между 0 и 1, со средним значением около 0,5.Это согласуется с реализацией функции rand, которая предоставляет псевдослучайные выборки, взятые из равномерного распределения по [0, 1).

Это можно подтвердить, вычтя среднее значение из

b = mkl_fft.fft(a - np.mean(a))

и отмечая, что большое начальное значение b[0] должно быть около нуля.

2 голосов
/ 15 марта 2019

Это режим постоянной или нулевой частоты, который по сути является средним значением вашего сигнала. Вы производите выборку равномерно из единичного интервала, поэтому среднее значение составляет ~ 0,5. Некоторые реализации fft масштабируют это с количеством точек, чтобы сохранить умножение.

...