带有numpy随机集的怪异FFT图

时间:2019-03-15 01:12:10

标签: python numpy fft intel-mkl

以下代码:

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)

为什么随机设置的FFT会得出一个特定的数字?


(感谢Paul Panzer和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 个答案:

答案 0 :(得分:2)

这是恒定或零频率模式,本质上是信号的平均值。您是从单位间隔中均匀采样的,因此平均值约为0.5。一些fft实施会通过点数来缩放此比例以节省乘法。

答案 1 :(得分:2)

FFT输出中的大值恰好是与DC分量相对应的第一个值。这表明输入在整个数据集上的平均值非零。

实际上,如果您仔细查看输入数据,可能会注意到这些值始终在0到1之间,平均值约为0.5。这与rand函数实现相一致,该函数实现提供了从[0,1)上的均匀分布中提取的伪随机样本。

您可以通过用减去平均值来确认这种情况

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

,请注意,较大的初始值b[0]应该接近零。