FFT实/虚/ abs部分解释

时间:2014-09-02 13:26:19

标签: numpy signal-processing fft complex-numbers dft

我目前正在学习离散傅立叶变换,而且我正在玩numpy来更好地理解它。

我试图策划一个" sin x sin x sin"信号并获得具有4个非零点的干净FFT。我天真地告诉自己:"好吧,如果我策划了一个"罪恶+罪恶+罪恶+罪恶"有这些幅度和频率的信号,我应该得到相同的" sin x sin x sin"信号,对吧?

嗯......不完全是

(首先是" x"信号,第二个是" +"信号)

enter image description here

两者共享相同的幅度/频率,但不是相同的信号,即使我可以看到它们有一些相似之处。

好的,因为我只绘制了FFT的绝对值,我想我丢失了一些信息。

然后我绘制了两个信号的实部,虚部和绝对值:

enter image description here

现在,我很困惑。我该怎么办?我从数学的角度阅读有关DFT的内容。我知道复杂的价值来自单位圈。我甚至不得不了解希尔伯特的空间,以了解它是如何工作的(这很痛苦!......而且我只是划伤了表面)。我只想了解这些真实/虚构的情节是否在数学世界之外有任何具体的意义:

  • abs(fft):频率+幅度
  • real(fft):?
  • imaginary(fft):?

代码:

import numpy as np
import matplotlib.pyplot as plt
N = 512 # Sample count
fs = 128 # Sampling rate
st = 1.0 / fs # Sample time
t = np.arange(N) * st # Time vector

signal1 = \
1   *np.cos(2*np.pi * t) *\
2   *np.cos(2*np.pi * 4*t) *\
0.5 *np.cos(2*np.pi * 0.5*t)

signal2 = \
0.25*np.sin(2*np.pi * 2.5*t) +\
0.25*np.sin(2*np.pi * 3.5*t) +\
0.25*np.sin(2*np.pi * 4.5*t) +\
0.25*np.sin(2*np.pi * 5.5*t)



_, axes = plt.subplots(4, 2)

# Plot signal
axes[0][0].set_title("Signal 1 (multiply)")
axes[0][0].grid()
axes[0][0].plot(t, signal1, 'b-')

axes[0][1].set_title("Signal 2 (add)")
axes[0][1].grid()
axes[0][1].plot(t, signal2, 'r-')

# FFT + bins + normalization
bins = np.fft.fftfreq(N, st)    
fft  = [i / (N/2) for i in np.fft.fft(signal1)]
fft2 = [i / (N/2) for i in np.fft.fft(signal2)]

# Plot real
axes[1][0].set_title("FFT 1 (real)")
axes[1][0].grid()
axes[1][0].plot(bins[:N/2], np.real(fft[:N/2]), 'b-')

axes[1][1].set_title("FFT 2 (real)")
axes[1][1].grid()
axes[1][1].plot(bins[:N/2], np.real(fft2[:N/2]), 'r-')

# Plot imaginary
axes[2][0].set_title("FFT 1 (imaginary)")
axes[2][0].grid()
axes[2][0].plot(bins[:N/2], np.imag(fft[:N/2]), 'b-')

axes[2][1].set_title("FFT 2 (imaginary)")
axes[2][1].grid()
axes[2][1].plot(bins[:N/2], np.imag(fft2[:N/2]), 'r-')

# Plot abs
axes[3][0].set_title("FFT 1 (abs)")
axes[3][0].grid()
axes[3][0].plot(bins[:N/2], np.abs(fft[:N/2]), 'b-')

axes[3][1].set_title("FFT 2 (abs)")
axes[3][1].grid()
axes[3][1].plot(bins[:N/2], np.abs(fft2[:N/2]), 'r-')

plt.show()

4 个答案:

答案 0 :(得分:19)

对于每个频率仓,幅度 sqrt(re^2 + im^2)会告诉您相应频率的分量幅度。 阶段 atan2(im, re)告诉您该组件的相对阶段。除非您对数据窗口中心周围的对称属性感兴趣(甚至是奇数),否则实部和虚部本身并不是特别有用。

答案 1 :(得分:6)

对于某个参考点,例如固定时间窗口的中心,相同频率的正弦波和余弦波看起来会不同(相对于任何固定时间参考点具有不同的起始相位)。它们也将在数学上与任何整数周期宽度正交,因此可以表示变换的独立基矢量分量。

FFT结果的实部是每个频率分量与余弦波相似的程度,虚部,每个分量与正弦波的相似程度。正弦和余弦分量的各种比率允许人们构造任意或所需相位的正弦波,从而使FFT结果完整。

单独的量级无法区分正弦和余弦波之间的差异。 IFFT(图像(FFT))会使具有与纯余弦不同相位的任何信号的重建搞乱。与IFFT(re(FFT))和纯正弦波(相对于FFT孔径窗口)相同。

答案 2 :(得分:1)

您可以将信号1(由三个cos函数的乘积组成)转换为四个cos函数的总和。这与函数2有所不同,函数2是四个正弦函数的总和。

cos函数是偶函数cos(-x)== cos(x)。 偶函数的傅立叶变换纯粹是真实的。 这就是为什么函数1的fft的虚部的图只包含接近零(1e-15)的值的原因。

正弦函数是奇函数sin(-x)== -sin(x)。 奇函数的傅立叶变换是纯虚数。 这就是为什么函数2的fft实部的图只包含接近于零(1e-15)的值的原因。

如果您想更详细地了解FFT和DFT,请阅读电气工程信号分析教科书。

答案 3 :(得分:0)

尽管...您现在必须是一个好专家:) 对于其他人:请注意 with this set of Correct mathematical equation 因此将总和更正为:

    signal1 = \
1   *np.cos(2*np.pi * t) *\
2   *np.cos(2*np.pi * 4*t) *\
0.5 *np.cos(2*np.pi * 0.5*t)

signal2 = \
0.25*np.cos(-2*np.pi * 2.5*t) +\
0.25*np.cos(2*np.pi * 3.5*t) +\
0.25*np.cos(-2*np.pi * 4.5*t) +\
0.25*np.cos(2*np.pi * 5.5*t)

现在给出以下结果

(Now results are)

重点是真实部分也应该相同