我正在尝试计算以下高斯的傅立叶变换:
# sample spacing
dx = 1.0 / 1000.0
# Points
x1 = -5
x2 = 5
x = np.arange(x1, x2, dx)
def light_intensity():
return 10*sp.stats.norm.pdf(x, 0, 1)+0.1*np.random.randn(x.size)
fig, ax = plt.subplots()
ax.plot(x,light_intensity())
我在空间频域中创建了一个新数组(高斯的傅立叶变换是高斯的,因此这些值应该相似)。我绘图并得到这个:
fig, ax = plt.subplots()
xf = np.arange(x1,x2,dx)
yf= np.fft.fftshift(light_intensity())
ax.plot(xf,np.abs(yf))
为什么会分成两个高峰?
最佳答案
这里有一些建议:
使用np.fft.fft
fft从0 Hz开始
归一化/缩放
例:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def light_intensity(x, signal_gain, noise_gain):
signal = norm.pdf(x, 0, 1)
noise = np.random.randn(x.size)
return signal_gain * signal + noise_gain * noise
def norm_fft(y, T, max_freq=None):
N = y.shape[0]
Nf = N // 2 if max_freq is None else int(max_freq * T)
xf = np.linspace(0.0, 0.5 * N / T, N // 2)
yf = 2.0 / N * np.fft.fft(y)
return xf[:Nf], yf[:Nf]
x1 = 0.0
x2 = 5.0
N = 10000
T = x2 - x1
x = np.linspace(x1, x2, N)
y = light_intensity(x, 10.0, 0.0)
xf, yf = norm_fft(y, T, T / np.pi)
fig, ax = plt.subplots(2)
ax[0].plot(x, y)
ax[1].plot(xf, np.abs(yf))
plt.show()
或者,有噪音:
或者,如果您想享受频域中的对称性:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
def light_intensity(x, signal_gain, noise_gain):
signal = norm.pdf(x, 0, 1)
noise = np.random.randn(x.size)
return signal_gain * signal + noise_gain * noise
def norm_sym_fft(y, T, max_freq=None):
N = y.shape[0]
b = N if max_freq is None else int(max_freq * T + N // 2)
a = N - b
xf = np.linspace(-0.5 * N / T, 0.5 * N / T, N)
yf = 2.0 / N * np.fft.fftshift(np.fft.fft(y))
return xf[a:b], yf[a:b]
x1 = -10.0
x2 = 10.0
N = 10000
T = x2 - x1
x = np.linspace(x1, x2, N)
y = light_intensity(x, 10.0, 0.0)
xf, yf = norm_sym_fft(y, T, 4 / np.pi)
fig, ax = plt.subplots(2)
ax[0].plot(x, y)
ax[1].plot(xf, np.abs(yf))
plt.show()