为什么FFT不会影响我的平滑信号?

时间:2016-09-18 16:24:23

标签: signal-processing fft

此刻我正在玩FFT,我尝试通过重新创建this example来获取噪声信号的周期。在进行实验时,我注意到在平滑了一个非常嘈杂的信号之后,fft()的结果实际上又是同一个信号 - 这是我不理解的。

这是一个可以在IPython Notebook中运行的完整示例(如果需要,可以create a notebook here并运行代码。)

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

figsize = (16,8)
n = 500
ls = np.linspace(0,2*np.pi, n)

x_target = np.sin(12*ls) + np.sin(52*ls)

x = np.sin(12*ls) + np.sin(52*ls) + np.random.rand(n) * 3.5
x = x - np.mean(x)

x_smooth = pd.rolling_mean(pd.DataFrame(x), 14).replace(np.nan, 0.0).as_matrix()
x_smooth = x_smooth - np.mean(x_smooth)

x_smooth = np.roll(x_smooth, -7)

# Getting shwifty and showing what we've got
plt.figure(figsize=(16,8))
plt.scatter(ls, x, s=3, c=[1.0,0.0,0.0,1.0])
plt.plot(ls, x_target, color=[1.0,0.0,0.0, 0.3])
plt.plot(ls, x_smooth)

plt.legend(["Target", "Smooth", "Noisy Data"])

# Target
x_fft = np.abs(np.fft.fft(x_target))
pd.DataFrame(x_fft).plot(figsize=figsize)

# Looks like it should
x_fft = np.abs(np.fft.fft(x))
pd.DataFrame(x_fft).plot(figsize=figsize)

# Plots the same signal?
x_fft = np.abs(np.fft.fft(x_smooth))
pd.DataFrame(x_fft).plot(figsize=figsize)

您可以在下面找到此脚本的结果图。

带有平滑信号的噪声数据:

enter image description here

目标函数的FFT

enter image description here

噪声数据的FFT

enter image description here

平滑数据的FFT

enter image description here

我真的不明白为什么会出现这种情况。有人可以向我解释一下,还是我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

关键区别在于:

 x_fft = np.abs(np.fft.fft(x_smooth))

 x_fft = np.abs(np.fft.fft(x_smooth.flatten()))

因为x_smooth似乎已经在某个地方获得了所有二维。它的形状是(500,1),因为np.fft.fft默认沿axis=-1工作(即最高维),它采用了500个不同的1样本信号的500个单独的FFT。 (不可思议的是,它只返回每个的DC分量,所以把它们放在一起,你最终会得到你开始时的相同信号。)

来自平滑信号的FFT实际上看起来像这样:

enter image description here