SciPy怎么用FFT做快速傅里叶变换?

文章导读
Previous Quiz Next SciPy 中的 快速傅里叶变换 (FFT) 是一种强大的算法,旨在高效计算 离散傅里叶变换 (DFT) 及其逆变换,与标准 DFT 相比,大幅降低了计算成本。
📋 目录
  1. SciPy 中的快速傅里叶变换
  2. 快速傅里叶变换(FFT)的关键特性
  3. FFT 的应用
A A

Scipy 快速傅里叶变换 (FFT)



Previous
Quiz
Next

SciPy 中的 快速傅里叶变换 (FFT) 是一种强大的算法,旨在高效计算 离散傅里叶变换 (DFT) 及其逆变换,与标准 DFT 相比,大幅降低了计算成本。

这使得信号能够在时域和频域之间进行转换,从而支持各种类型的信号和数据分析。

SciPy 中的快速傅里叶变换

SciPy 的 scipy.fft 模块提供了一系列函数,用于执行一维、二维甚至多维 FFT。主要函数 scipy.fft.fft 用于计算输入数组的一维 FFT,而 scipy.fft.ifft 通过将频域数据转换回时域来计算 逆 FFT

对于由实数组成的数据集,我们可以使用 scipy.fft.rfftscipy.fft.irfft,这些是优化的版本,仅处理正频率,从而减少计算时间和内存使用。

对于更复杂的数据,诸如 scipy.fft.fftnscipy.fft.ifftn 等函数将这些功能扩展到多维数组,这在图像处理等任务中特别有用。

SciPy 的 FFT 函数还提供了灵活性,支持归一化、轴指定和零填充等功能。此外,scipy.fft.fftshiftscipy.fft.ifftshift 可用于将零频分量移到中心或移回边缘,从而有助于频谱可视化。

快速傅里叶变换(FFT)的关键特性

这些特性使 FFT 成为信号处理、图像分析和音频处理等多种应用中的一种多功能且强大的工具。以下是快速傅里叶变换(FFT)的关键特性 −

  • 效率: FFT 通过将离散傅里叶变换 (DFT) 的计算复杂度从 O(N)2 显著降低到 O(N log N),从而使处理大型数据集的速度大大提高。
  • 信号分析: FFT 将时域信号转换为频域表示,从而能够分析信号中不同的频率分量。
  • 逆 FFT (IFFT): 逆 FFT 函数可以从频域分量重建原始时域信号。
  • 支持实数和复数输入: FFT 可以处理实数值和复数值数据。针对实数值输入的专用版本如 rfft 进一步优化了性能。
  • 多维 FFT: fftn 和 ifftn 等函数允许将 FFT 应用于多维数据(如图像或体数据),使其在图像和 3D 数据分析中非常有用。
  • 零填充和截断: 零填充用于提高频率谱的分辨率,而截断可用于减少包含大量零的信号的计算成本。
  • 频率移位: fftshift 和 ifftshift 等函数将零频分量移到频谱中心或移回,从而便于更好地可视化频率谱。
  • 归一化选项: 多种归一化选项确保根据不同约定对 FFT 结果进行准确缩放。

示例 1

以下是一个使用 SciPy 计算信号的一维快速傅里叶变换 (FFT) 并进行可视化的简单示例 −

import numpy as np
from scipy.fft import fft, ifft
import matplotlib.pyplot as plt

# 创建一个示例信号
N = 600  # 采样点数
T = 1.0 / 800.0  # 采样间隔
x = np.linspace(0.0, N*T, N, endpoint=False)
# 创建由两种不同频率组成的信号
y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)

# 计算 FFT
yf = fft(y)

# 计算对应的频率
xf = np.fft.fftfreq(N, T)[:N//2]

# 绘制原始信号
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(x, y)
plt.title("Original Signal")
plt.xlabel("Time (s)")
plt.ylabel("Amplitude")

# 绘制 FFT (幅度谱)
plt.subplot(2, 1, 2)
plt.plot(xf, 2.0/N * np.abs(yf[:N//2]))
plt.title("FFT - Magnitude Spectrum")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")

plt.tight_layout()
plt.show()

以下是一维快速傅里叶变换(FFT)的输出 −

One Dimensional FFT

示例 2

以下是一个使用 SciPy 执行二维快速傅里叶变换 (2D FFT) 的简单示例。此示例展示了如何将 2D 图像或任何 2D 数组转换为频域,然后使用逆 2D FFT 转换回空间域 −

import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft2, ifft2, fftshift

# 创建一个示例 2D 数组 (图像)
image = np.zeros((256, 256))
image[100:150, 100:150] = 255  # 在中间创建一个白色方块

# 计算 2D FFT
fft_image = fft2(image)

# 将零频分量移到频谱中心
fft_image_shifted = fftshift(fft_image)

# 计算幅度谱
magnitude_spectrum = np.abs(fft_image_shifted)

# 逆 2D FFT 重建原始图像
reconstructed_image = ifft2(fft_image).real

# 绘制原始图像、幅度谱和重建图像
plt.figure(figsize=(12, 4))

# 原始图像
plt.subplot(1, 3, 1)
plt.title("Original Image")
plt.imshow(image, cmap='gray')
plt.axis('off')

# 幅度谱
plt.subplot(1, 3, 2)
plt.title("Magnitude Spectrum")
plt.imshow(np.log(magnitude_spectrum + 1), cmap='gray')
plt.axis('off')

# 重建图像
plt.subplot(1, 3, 3)
plt.title("Reconstructed Image")
plt.imshow(reconstructed_image, cmap='gray')
plt.axis('off')

plt.show()

以下是二维快速傅里叶变换(FFT)的输出 −

Two Dimensional FFT

FFT 的应用

SciPy 中的 Fast Fourier Transform (FFT) 由于其能够高效地将时域信号转换为频域表示,因此在各个领域具有广泛的应用。以下是 FFT 的几个关键应用 −

  • 信号处理: FFT 用于分析信号的频率内容、检测模式、滤除噪声并设计数字滤波器。它在电信、音频信号处理和雷达信号分析中至关重要。
  • 图像处理: FFT 通过将图像转换为频域来帮助图像滤波、增强和压缩,从而实现高通和低通滤波等操作。
  • 音频分析: FFT 用于音高检测、声音合成和音乐分析。它有助于从音频信号中提取频谱内容和节奏等特征。
  • 振动分析: 在机械工程中,FFT 用于分析机器的振动数据,以识别故障并预测维护需求。
  • 医学成像: FFT 用于 MRI 和其他成像技术,从原始数据重建图像、提高分辨率并滤除噪声。
  • 天文学: FFT 用于分析天文信号的频率谱,帮助检测和表征天体。