你没有进行相移。
您所做的是添加一个 6000 向量,例如 P,其值为常数 P(i) = j π 到 V , v 的 FFT。
让我们写成 Ṽ = V + P。
由于 FFT(和 IFFT)的线性,您所说的 back_again 是
ṽ = IFFT(Ṽ) = IFFT(V) + IFFT(P) = v + p
当然,p = IFFT(P) 是区别values-back_again — 现在,让我们看看 p 是什么...
In [51]: P = np.pi*1j*np.ones(6000)
...: p = np.fft.ifft(P)
...: plt.plot(p.real*10**16, label='real(p)*10**16')
...: plt.plot(p.imag, label='imag(p)')
...: plt.legend();
如您所见,您修改了 values,添加了 ṽ 的实部,该实部本质上是 IFFT 累积中的数字噪声(因此图中没有变化,这给了您真实的部分back_again)和一个虚构的尖峰,它的高度毫不奇怪地等于π,对于t=0。
常数的变换是 ω=0 处的尖峰,常数(在频域中)的反变换是 t=0 处的尖峰。 p>
正如我在已删除的评论中所说,如果您不为每个 FFT 项添加一个常量,而是将它们乘一个常量,您也将信号乘以相同的常数(请记住,FFT 和 IFFT 是线性的)。
要做您想做的事,您必须记住,时域中的偏移只是(周期)信号与时移尖峰的(循环)卷积,因此您必须乘以信号的 FFT通过移位尖峰的 FFT。
因为狄拉克分布 δ(ta) 的傅里叶变换是 exp(-iωa),您必须将信号的 FFT 的每一项乘以一个频率依赖项。
一个例子
一些准备工作
In [61]: import matplotlib.pyplot as plt
...: import numpy as np
In [62]: def multiple_formatter(x, pos, den=60, number=np.pi, latex=r'\pi'):
... # search on SO for an implementation
In [63]: def plot(t, x):
...: fig, ax = plt.subplots()
...: ax.plot(t, x)
...: ax.xaxis.set_major_formatter(plt.FuncFormatter(multiple_formatter))
...: ax.xaxis.set_major_locator(plt.MultipleLocator(np.pi / 2))
...: ax.xaxis.set_minor_locator(plt.MultipleLocator(np.pi / 4))
计算以n 为中心的狄拉克分布的离散FT 的函数,持续时间为N
In [64]: def shift(n, N):
...: s = np.zeros(N)
...: s[n] = 1.0
...: return np.fft.fft(s)
让我们绘制一个信号和移位的信号
In [65]: t = np.arange(4096)*np.pi/1024
In [66]: v0 = np.sin(t)
In [67]: v1 = np.sin(t-np.pi/4)
In [68]: f, a = plot(t, v0)
In [69]: a.plot(t, v1, label='shifted by $\\pi/4$');
In [70]: a.legend();
现在计算正确尖峰的 FFT(注意 π/4 = (4π)/16)、移位信号的 FFT、s.s. 的 FFT 的 IFFT。最后绘制我们的结果
In [71]: S = shift(4096//16-1, 4096)
In [72]: VS = np.fft.fft(v0)*S
In [73]: vs = np.fft.ifft(VS)
In [74]: f, ay = plot(t, v0)
In [75]: ay.plot(t, vs.real, label='shifted in frequency domain');
In [76]: ay.legend();