【发布时间】:2018-08-23 09:48:50
【问题描述】:
通过一个简单的 FFT 运行来学习操作,我创建了一个包含 100 个元素的 NumPy 数组,该数组中的正弦波只有一个周期。使用此代码:
...
n = 100
x = np.fromfunction(lambda a: np.sin(2 * np.pi * a / n), (n,), dtype=float)
res = np.fft.fft(x)
...
res 中的结果在 2 个不同的索引值处显示非零幅度:
idx real imag abs
--- ---------- ---------- ----------
...
1: 0 -50.000 50.000
...
99: 0 50.000 50.000
我只希望在索引 1 处看到一个非零振幅。
为什么索引 1 和 99 的幅度都非零,我该如何从数学上理解这一点?
补充:也许高频实际上代表aliased频率,根据Nyquist rate,采样率太低。
【问题讨论】:
-
请注意,SciPy 还具有
rfft函数,用于处理实数(而不是复数)。 -
@DietrichEpp:谢谢,在scipy.fftpack.rfft 找到它。
-
您可以将其视为混叠,但采样率并不太低……请记住,输入中只有一个周期的信号,因此奈奎斯特频率是 50 倍那。这里发生的是您的输入确实实际上包含两个不同复数频率的总和,一个在 f=+Fs/100,一个在 f=-Fs/ 100。复杂信号的虚部相互抵消,留下一个实值正弦波。混叠告诉我们,f=-Fs/100 处的信号将在 f=+Fs*99/100 处混叠,但这不是采样率高低的问题。
-
当我说“复频率”时,我有点不准确。频率本身并不复杂,但复杂的傅立叶变换适用于不是正弦和余弦的信号,而是正弦和余弦的复值组合。由于复数有相位,我们可以认为正频率是相位随时间增加的信号,负频率是相位随时间减少的信号。 dsp.stackexchange.com/questions/4825/why-is-the-fft-mirrored
-
@DietrichEpp:再次感谢。您的 cmets 将我带到 The Scientist and Engineer's Guide to Digital Signal Processing, Chapter 12: The Fast Fourier Transform,它很好地描述了不同类型的实数与复数 FFT,以及有关实施的信息。