关键词

详解Numpy fft()(快速傅里叶变换)函数的作用与使用方法

Numpy fft()函数是对一维或者二维的数组进行快速傅里叶变换(FFT),其函数原型为:numpy.fft.fft(a, n=None, axis=-1, norm=None),参数含义如下:

  • a:接受一个实数组或复数数组
  • n:可选项,表示傅里叶变换的长度,如果不指定则默认为a的长度
  • axis:可选参数,表示进行傅里叶变换的轴,默认情况下,对于一维的数组,进行傅里叶变换的轴为最后一个,对于二维的数组,进行傅里叶变换的轴为第二个
  • norm:可选项,表示归一化的方式,如果为None则不归一化,如果是"ortho",表示按照奥斯特洛夫方式(Ostrogradsky)归一化

经过快速傅里叶变换后,可以得到原始信号在频域上的分解,进而用于信号处理、滤波、谱分析等诸多应用。

下面我们通过两个例子来说明numpy.fft.fft()的使用方法。

例子1

我们通过一个简单的例子来说明如何使用numpy.fft.fft()计算一个一维数组的傅里叶变换,并绘制出原始信号与频谱图。

import numpy as np
import matplotlib.pyplot as plt

#生成一个长度为256的实数组
x = np.linspace(0, 2*np.pi, 256)
y = np.sin(x) + 0.5*np.sin(3*x) + 0.2*np.sin(5*x)

#计算傅里叶变换
y_fft = np.fft.fft(y)

#计算相应的频率
freq = np.fft.fftfreq(len(y), x[1] - x[0])

#绘制原始信号
plt.subplot(211)
plt.plot(x, y)

#绘制频谱图
plt.subplot(212)
plt.plot(freq, np.abs(y_fft))

plt.show()

运行上述代码,得到的结果如下图所示:

从图中可以看出,原始信号是由三个正弦波叠加而成,绿色的曲线表示频谱图,横轴表示频率,纵轴表示幅值,蓝色线条显示了频谱中的主要频率成分。

例子2

我们称计算一个二维数组的傅里叶变换,并绘制出原始图像与频谱图。

import numpy as np
import matplotlib.pyplot as plt

# 生成一个二维数组作为示例数据
data = np.random.random((256, 256))

# 计算二维傅里叶变换
fft = np.fft.fft2(data)

# 计算频谱图
magnitude_spectrum = 20 * np.log(np.abs(fft))

# 绘制原始图像和频谱图
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.imshow(data, cmap='gray')
ax1.set_title('Original Image')
ax2.imshow(magnitude_spectrum, cmap='gray')
ax2.set_title('Magnitude Spectrum')
plt.show()

解释一下代码:

首先,我们使用Numpy的random函数生成一个256x256的随机数组,作为示例数据。

然后,我们使用fft2函数计算二维傅里叶变换。这个函数返回一个与输入数组相同大小的数组,其中包含了复数的傅里叶系数。

接下来,我们计算频谱图。这里使用了Numpy的abs函数计算复数的模,然后使用log函数取对数,并乘以20,以得到更好的可视化效果。

最后,我们使用Matplotlib绘制出原始图像和频谱图。imshow函数用于显示图像,其中cmap='gray'参数指定了灰度颜色映射。set_title函数用于设置图像的标题。我们使用subplots函数创建一个包含两个子图的图像,并将它们分别赋值给ax1和ax2变量。最后,我们调用show函数显示图像。

运行上述代码,得到的结果如下图所示:

本文链接:http://task.lmcjl.com/news/17128.html

展开阅读全文