📜  Python中的 scipy.fftshift()(1)

📅  最后修改于: 2023-12-03 15:34:24.338000             🧑  作者: Mango

Python中的 scipy.fftshift()

在频域分析中,我们经常需要对信号的频谱做一些变换和处理。然而,频谱通常是在频率从0开始的情况下给出的,这使得信号的DC分量出现在频谱的中心位置,而高频分量则靠近频谱的两端位置。因此,如果不进行处理,后续的处理可能会受到干扰或者错误。为了解决这个问题,我们通常需要将频率轴上的DC分量移动到频谱的中心位置。而这个操作在Python中可以通过scipy.fftshift()函数实现。

scipy.fftshift()函数介绍

scipy.fftshift()函数可以将N维输入数组进行FFT移位操作,并返回移位后的数组。由于频谱数组是$[-k, k]$部分的离散傅里叶函数,为了更好地观察和使用,需要对其进行移位操作,此时频率轴将被转换为$[-k/2, k/2]$,使得DC分量在中心位置。

函数定义:

scipy.fft.fftshift(x, axes=None)

参数说明:

  • x : array_like
    • 包含输入值的数组。如果是实数数组,则其FFT是奇(symmetric),因此只返回$\frac{N}{2}+1$个非零输出;如果是复数数组,则其FFT是复杂(complex conjugate symmetric),因此只返回$N$个独立频率点(即,只有从DC到Nyquist频率的一半是非零的)。
  • axes : tuple of ints or None, optional
    • 进行移位的轴,默认为所有维度。

返回值:

经移位后的输入数组。

scipy.fftshift()函数示例

从以下的示例,我们可以看到scipy.fftshift()函数的各个参数和用法。

import numpy as np
from scipy.fftpack import fft, fftshift

# 创建一个示例数组
x = np.linspace(0, 1, 10, endpoint=False)
y = np.sin(2 * np.pi * 5 * x)
z = np.zeros_like(x)
data = np.concatenate((y, z))
data = fft(data)

# 原始数据的频率分布
freq = np.linspace(-0.5, 0.5, len(data))
plt.plot(freq, np.abs(data))

# 使用fftshift将数据移位,并显示新的频率分布
shifted_data = fftshift(data)
shifted_freq = np.linspace(-0.5, 0.5, len(shifted_data))
plt.plot(shifted_freq, np.abs(shifted_data))

运行上面的代码,我们将得到一个频率分布对比图。

scipy.fftshift()函数示例

其中,右图通过scipy.fftshift()函数进行了频率移位。可以看到,在左图中,频率轴从-0.5到0.5,且0处为中心位置,而在右图中,频率轴从0到1,且0.5处为中心位置。这就是移位操作的效果,即将频率轴的中心点移动到数组的中心位置。

总结

scipy.fftshift()函数能够对信号的频率轴进行移位操作,将频率轴的中心点移动到数组的中心位置。该函数常常与其他函数一起使用,如fft()函数,以便更好地分析信号的频谱。