带有 numpy 随机集的奇怪 FFT 图

Weird FFT plot with numpy random set

代码如下:

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)

结果是:

您可以看到:

Weird FFT Number is  (50020.99077289924+0j)

为什么使用随机集的 FFT 会得出一个特定的数字?


(感谢 Paul Panzer 和 SleuthEye)

mkl_fft.fft(a-0.5)最后的结果是:


[2019/03/29 更新]

使用标准化数据一切顺利

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

(a - np.mean(a))/np.std(a)的平均值接近于零

那是恒定或零频率模式,本质上是信号的平均值。您从单位间隔均匀采样,因此平均值约为 0.5。一些 fft 实现将其与点数进行缩放以保存乘法。

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

实际上,如果您仔细观察输入数据,您可能会注意到这些值始终介于 0 和 1 之间,平均值约为 0.5。这与 rand 函数实现一致,后者提供从 [0, 1] 上的均匀分布中抽取的伪随机样本。

您可以通过用

减去平均值来确认是这种情况
b = mkl_fft.fft(a - np.mean(a))

并注意到较大的初始值 b[0] 应该接近于零。