使用NumPy进行傅里叶变换:基础概念与实践应用

简介: 使用NumPy进行傅里叶变换:基础概念与实践应用

在数据分析和信号处理领域,傅里叶变换是一种不可或缺的工具,它能够将信号从时域转化为频域,揭示出信号内在的频率成分。在Python科学计算生态中,NumPy作为基础的数值计算库,提供了对傅里叶变换的强大支持。本文将深入浅出地介绍如何使用NumPy执行快速傅里叶变换(Fast Fourier Transform, FFT),并展示一些实际应用案例。一、傅里叶变换简介傅里叶变换是一种数学上的分析工具,它将一个函数(或信号)从时域(或空间域)转换到频域,揭示了函数或信号的不同频率成分及其相对强度。这个概念最初由法国数学家约瑟夫·傅里叶提出,经过不断发展,现在已经成为物理学、工程学、计算机科学、信号处理、图像处理等领域的重要基石。傅里叶变换的基本思想:任何一个满足一定条件的连续或离散信号,无论多么复杂,都可以表示为一组正弦波(或余弦波)的叠加。傅里叶变换就是找到这组正弦波的具体参数——频率、幅度和相位,从而将原信号分解为其频率成分的组合。连续傅里叶变换(Continuous Fourier Transform,CFT)的公式定义如下:对于一个连续时间信号 �(�)f(t),它的傅里叶变换为F(ω

fd0d6a5c4b6f3a8ab760adaec92a8ae5.png

其中,j 是虚数单位,ω 是角频率,t 是时间变量。

离散傅里叶变换(Discrete Fourier Transform,DFT)应用于离散信号,其公式定义如下:对于一个有限长的离散信号序列x[n] �[�],其DFT为 X[k]

3a21dd3a2e8abe827b59b9f13de641bd.png

其中,N 是信号序列的长度,k 是频率索引,n 是时间索引。

快速傅里叶变换(Fast Fourier Transform,FFT)是一种高效计算DFT的算法,极大地降低了计算复杂度。傅里叶变换的主要性质和应用包括:

  • 频谱分析:识别信号中的基频和谐波成分,分析噪声分布。
  • 信号滤波:在频域中对信号进行过滤,去除不需要的频率成分。
  • 信号压缩和编码:利用信号的频域特性进行数据压缩,例如在音频和视频编码中。
  • 图像处理:通过对图像进行傅里叶变换,可以实现图像的频率域滤波、图像去噪和图像压缩等任务。

二、NumPy中的傅里叶变换NumPy通过numpy.fft模块提供了一系列的傅里叶变换函数,我们可以轻松地进行傅里叶变换。举一个简单的例子,用FFT求下式的离散傅里叶变换。

4c89026a9c2aa4d312ee32e4f2946b86.png


import numpy as npimport matplotlib.pyplot as plt
# 创建一个离散时域信号t = np.linspace(0, 1, 1000, endpoint=False)f_t = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 10 * t)
# 计算离散傅里叶变换(DFT)f_k = np.fft.fft(f_t)
# DFT的结果实际上包含了负频率部分,但我们通常只关心0到采样率一半的频率范围# 所以我们只取前半部分,并且因为对称性,我们还可以除以2N_half = len(f_k) // 2xfrequencies = np.arange(N_half) * 1000 / len(t)  # 频率轴
# 取绝对值以得到幅度谱amplitudes = abs(f_k[:N_half]) / len(t)
# 绘制结果plt.figure(figsize=(12, 6))plt.subplot(2, 1, 1)plt.title("Time Domain Signal")plt.plot(t, f_t)plt.xlabel("Time (s)")plt.ylabel("Amplitude")
plt.subplot(2, 1, 2)plt.title("Frequency Domain Signal")plt.stem(xfrequencies, amplitudes)plt.xlabel("Frequency (Hz)")plt.ylabel("Amplitude")#plt.xlim(0,500)
plt.tight_layout()plt.show()

这里np.fft.fft()返回的是信号的离散傅里叶变换结果,其长度与原信号相同,但包含了正负频率分量。运行结果为:

fbee31dc321a092e2cfa8f005d5b2ac6.png

三、理解FFT结果1.  幅度谱:通常关注的是幅度信息,可以通过np.abs()获取各频率分量的幅度值。

amplitudes = np.abs(fft_result)/len(t)

2. 频率轴调整:由于FFT的结果默认是对半区间频率分布,若要获得实际对应的频率,需要根据采样率和样本点数进行调整。


# DFT的结果实际上包含了负频率部分,但我们通常只关心0到采样率一半的频率范围# 所以我们只取前半部分,并且因为对称性,我们还可以除以2N_half = len(f_k) // 2xfrequencies = np.arange(N_half) * 1000 / len(t)  # 频率轴

从图中,我们可以看到模拟信号中的两个频率值f=5和f=10,已全部显示在FFT后的图谱中四、多维傅里叶变换NumPy同样支持二维及更高维度的数据进行傅里叶变换,例如图像数据:


import numpy as npimport matplotlib.pyplot as pltfrom PIL import Image
# 加载图像并转为灰度image=Image.open("Lenna.png").convert("L")
# 对图像进行归一化处理image=np.array(image)/255.0
# 计算二维傅里叶变换ft_image = np.fft.fft2(image)
# 取其幅度谱(通常在显示频谱时,我们只关心幅度而非相位)magnitude_spectrum = np.abs(ft_image)
# 对幅度谱取平方根以改善视觉效果magnitude_spectrum_sqrt = np.sqrt(magnitude_spectrum)
# 将结果转换回uint8以便于显示magnitude_spectrum_sqrt_uint8 = ((20 * magnitude_spectrum_sqrt / magnitude_spectrum_sqrt.max()).astype(np.uint8))
# 显示原图像和其幅度谱fig, axs = plt.subplots(1, 2, figsize=(10, 5))
axs[0].imshow(image, cmap='gray')axs[0].set_title('Original Image')
axs[1].imshow(magnitude_spectrum_sqrt_uint8, cmap='gray')axs[1].set_title('Magnitude Spectrum')
for ax in axs:    ax.set_axis_off()
plt.show()

1614588e29c70b8bac0c6894583c762a.png

Lenna经过FFT后全黑了 五、结语本期,我们通过NumPy对各种类型的数据进行傅里叶变换,无论是单维时间序列数据还是多维图像数据,都能利用这一强大工具来洞察其背后的频率特性,从而服务于诸如滤波、去噪、特征提取等多种实际场景。在科学研究和工程实践中,掌握和灵活运用NumPy中的傅里叶变换功能具有重要意义。

相关文章
|
3月前
|
机器学习/深度学习 数据处理 计算机视觉
NumPy实践宝典:Python高手教你如何轻松玩转数据处理!
【8月更文挑战第22天】NumPy是Python科学计算的核心库,专长于大型数组与矩阵运算,并提供了丰富的数学函数。首先需安装NumPy (`pip install numpy`)。之后可通过创建数组、索引与切片、执行数学与逻辑运算、变换数组形状及类型、计算统计量和进行矩阵运算等操作来实践学习。NumPy的应用范围广泛,从基础的数据处理到图像处理都能胜任,是数据科学领域的必备工具。
54 0
|
15天前
|
机器学习/深度学习 算法 数据挖掘
NumPy有哪些应用场景
【10月更文挑战第22天】NumPy有哪些应用场景
62 2
|
3月前
|
存储 计算机视觉 Python
NumPy 在图像处理中的应用
【8月更文第30天】NumPy 是 Python 中用于科学计算的核心库之一,它提供了高效的数组操作功能。在图像处理领域,NumPy 的数组结构非常适合存储和操作图像数据。本文将详细介绍如何使用 NumPy 进行图像处理,包括加载图像、显示图像、像素操作、颜色空间转换和简单的滤波器应用等。
89 0
|
3月前
|
机器学习/深度学习 Serverless 数据处理
《零基础实践深度学习》 Numpy 线性代数 应用举例 张量表示
这篇文章介绍了NumPy在线性代数中的应用,包括矩阵操作和文件读写功能,并提供了使用NumPy进行图片处理和激活函数计算的示例,同时探讨了飞桨框架中张量(Tensor)的使用和与NumPy数组的转换。
|
5月前
|
数据采集 算法 BI
解析numpy中的iscomplex方法及实际应用
在 NumPy 中,iscomplex 函数用于检查数组中的每个元素是否为复数。这个函数在处理包含复数数据的数组时非常有用,尤其是在科学计算和工程领域,这些领域经常需要区分实数和复数。 在数学和工程领域,复数是一种基本的数值类型,它们扩展了实数系统,包含了实部和虚部。在 NumPy 中,复数由 numpy.complex128 或 numpy.complex64 类型表示。numpy.iscomplex 函数提供了一种简便的方式来检查数组中的元素是否为复数。这对于数据类型判断、数据清洗和后续的数值分析非常重要。
|
4月前
|
数据采集 机器学习/深度学习 数据处理
数据科学家的秘密武器:Pandas与NumPy高级应用实战指南
【7月更文挑战第14天】Pandas与NumPy在数据科学中扮演关键角色。Pandas的DataFrame和Series提供高效数据处理,如数据清洗、转换,而NumPy则以ndarray为基础进行数值计算和矩阵操作。两者结合,从数据预处理到数值分析,形成强大工具组合。示例展示了填充缺失值、类型转换、矩阵乘法、标准化等操作,体现其在实际项目中的协同效用。掌握这两者,能提升数据科学家的效能和分析深度。**
43 0
|
6月前
|
数据挖掘 数据处理 索引
Python数据分析面试:NumPy基础与应用
【4月更文挑战第16天】了解并熟练运用NumPy是衡量Python数据分析能力的关键。本文探讨了面试中常遇到的NumPy问题,包括数组创建、属性、索引切片、数组运算、统计函数以及重塑和拼接,并提供了相关代码示例。同时强调了易错点,如混淆Python列表与NumPy数组、误解广播规则等,提醒在数据处理中注意性能和内存效率。掌握这些知识点将有助于提升数据分析面试表现和技能。
132 5
|
6月前
|
缓存 编译器 API
NumPy与其他语言(如C/C++)的接口实践
【4月更文挑战第17天】本文介绍了NumPy与C/C++的接口实践,包括Python与C/C++交互基础、NumPy的C API和Cython的使用。通过案例展示了如何将C++函数与NumPy数组结合,强调了内存管理、类型匹配、错误处理和性能优化的最佳实践。掌握这些技能对于跨语言交互和集成至关重要。
|
6月前
|
数据挖掘 数据处理 Python
金融数据分析与NumPy的高效实践
【4月更文挑战第17天】本文介绍了NumPy在金融数据分析中的高效应用。通过三个案例展示了NumPy如何用于时间序列分析(计算股票日收益率)、风险度量计算(VaR和CVaR)以及相关性和协整性分析。NumPy的多维数组操作和统计函数大大提升了金融分析的效率,使其成为Python金融分析的重要工具。随着金融科技发展,NumPy在金融领域的角色将更加关键。
|
6月前
|
算法 数据挖掘 数据处理
《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)
《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)
75 0