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函数显示图像。
运行上述代码,得到的结果如下图所示:
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Numpy fft()(快速傅里叶变换)函数的作用与使用方法 - Python技术站