numpy - FFT实部/虚部/绝对部分解释

标签 numpy signal-processing fft complex-numbers dft

我目前正在学习离散傅立叶变换,并且我正在与numpy一起玩以更好地理解它。

我尝试绘制“ sin x sin x sin”信号,并获得了具有4个非零点的干净FFT。我天真地告诉自己:“好吧,如果我绘制出具有这些幅度和频率的“正弦+罪恶+正弦+正弦”信号,我应该获得相同的“正弦x正弦x正弦”信号,对吗?

好吧...不完全是

(第一个是“ x”信号,第二个是“ +”信号)



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

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

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



现在,我很困惑。这一切我该怎么办?我从数学的角度了解了DFT。我知道复杂的值来自单位圆。我什至不得不了解希尔伯特空间,以了解它的工作原理(这很痛苦!而且我只是从头开始)。我只想了解这些实/虚图在数学世界之外是否具有任何具体含义:


abs(fft):频率+幅度
实数(fft):?
虚数(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()

最佳答案

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

关于numpy - FFT实部/虚部/绝对部分解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25624548/

相关文章:

python - 如何生成随机值的N维数组?

c - 在矩阵中映射相邻子区域并计算每个子区域的质心

java 方波

python - 如何使用 2 个 pandas DataFrame 计算 IOU(重叠)

python - 如何使用 numpy.delete 过滤项目? (为某些人工作,但不为其他人工作)

python - 变维数组

python - 如何从python中的fft信号中找到感兴趣频率的bin号?

c++ - 如何在 CUDA 中分别获取复数矩阵的实部和虚部?

audio - 通过限制频率范围来提高 FFT 输出的频率分辨率?

python - 两个数组之间的余弦距离计算 - Python