17 NumPy高级功能之傅里叶变换

在本章中,我们将深入探讨NumPy提供的傅里叶变换功能。傅里叶变换是一种强大的数学工具,用于将信号从时间域转换到频率域。它在信号处理、图像处理、工程等领域都有广泛应用。

1. 傅里叶变换基础

傅里叶变换可以被视为将信号分解为一系列正弦波的过程。这些正弦波的频率和幅度可以用来重建原始信号。对于一个连续的函数,傅里叶变换的数学表达如下:

$$
F(ω) = \int_{-\infty}^{\infty} f(t) e^{-iωt} dt
$$

在NumPy中,我们主要使用的傅里叶变换函数是numpy.fft模块中的fftifft

2. 使用NumPy进行傅里叶变换

NumPy提供了一些函数和工具来执行傅里叶变换。最常用的方法就是numpy.fft.fft(),它计算一个一维数组的离散傅里叶变换。

2.1 一维傅里叶变换

我们可以通过创建一个简单的正弦波来演示一维傅里叶变换。以下是生成正弦波并计算其傅里叶变换的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np
import matplotlib.pyplot as plt

# 生成时间序列
t = np.linspace(0, 1, 1000)
# 生成正弦波信号
f1 = 5 # 频率
signal = np.sin(2 * np.pi * f1 * t)

# 计算傅里叶变换
fft_result = np.fft.fft(signal)
# 计算频率
frequencies = np.fft.fftfreq(len(signal), d=t[1] - t[0])

# 绘制原始信号
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.plot(t, signal)
plt.title("Original Signal")
plt.xlabel("Time [s]")
plt.ylabel("Amplitude")

# 绘制傅里叶变换结果
plt.subplot(1, 2, 2)
plt.plot(frequencies, np.abs(fft_result))
plt.title("Fourier Transform")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Magnitude")
plt.xlim(0, 20) # 只显示0到20Hz
plt.grid()

plt.tight_layout()
plt.show()

在以上代码中,我们生成了一个频率为5Hz的正弦波,然后使用numpy.fft.fft()函数计算其傅里叶变换,并通过numpy.fft.fftfreq()函数生成对应的频率轴。最后,我们用Matplotlib绘制了原始信号及其傅里叶变换的幅度谱。

2.2 反傅里叶变换

我们可以使用numpy.fft.ifft()函数来计算傅里叶变换的反变换,这样可以从频率域信号恢复原始信号。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
# 使用反傅里叶变换重建信号
reconstructed_signal = np.fft.ifft(fft_result)

# 绘制重建后的信号
plt.figure(figsize=(6, 4))
plt.plot(t, reconstructed_signal.real)
plt.title("Reconstructed Signal from FFT")
plt.xlabel("Time [s]")
plt.ylabel("Amplitude")
plt.grid()
plt.show()

在这个示例中,我们使用ifft将频率域的信号回到时间域,可以看出重建后的信号与原始信号非常接近。

3. 多维傅里叶变换

除了一维傅里叶变换,NumPy还支持多维傅里叶变换。numpy.fft.fftn()可以计算多维数组的傅里叶变换,而numpy.fft.ifftn()则是其反变换。

3.1 示例:二维傅里叶变换

在图像处理领域,傅里叶变换常用于频域分析。我们可以用NumPy对一幅图像进行二维傅里叶变换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from skimage import data
from skimage.color import rgb2gray

# 加载示例图像并转为灰度
image = rgb2gray(data.astronaut())

# 进行二维傅里叶变换
fft_image = np.fft.fft2(image)
fft_image_shifted = np.fft.fftshift(fft_image)

# 计算幅度谱
magnitude_spectrum = np.log(np.abs(fft_image_shifted) + 1) # 加1防止对数为负值

# 绘制原图与傅里叶变换结果
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")

plt.subplot(1, 2, 2)
plt.imshow(magnitude_spectrum, cmap='gray')
plt.title("Magnitude Spectrum")
plt.colorbar()
plt.show()

在这个例子中,我们加载了一幅图像并将其转换为灰度图,然后计算其二维傅里叶变换并绘制出其幅度谱。

4. 总结

本章介绍了使用NumPy进行傅里叶变换的基本知识,包括一维和二维的傅里叶变换及其反变换。傅里叶变换是一个强大的工具,能够帮助我们分析信号的频域特性。通过具体的代码示例,我们可以看到如何使用NumPy简洁地实现这些功能。

在下章中,我们将继续探讨NumPy的随机数生成功能,这是信号处理和数值模拟等领域中不可或缺的一部分。

17 NumPy高级功能之傅里叶变换

https://zglg.work/numpy-zero/17/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论