Matlab fft()

2025年3月17日 | 阅读 7 分钟

MATLAB 的 FFT 函数

MATLAB 是科学和工程领域广泛使用的强大工具,它提供了许多用于信号处理和分析的函数。MATLAB 工具库中的一个基本函数是 fft(),它代表快速傅里叶变换 (Fast Fourier Transform)。FFT 是一种数学算法,用于将信号从时域转换到频域,从而能够有效地分析信号的频率分量。

什么是 FFT?

计算离散傅里叶变换 (DFT) 及其逆变换的一种流行方法是快速傅里叶变换。与传统的 DFT 相比,它大大降低了计算复杂度,这使其适用于大型数据集和实时应用。通过将信号分解为其各个频率,FFT 提供了对信号频谱内容的重要见解。

傅里叶变换 (Fourier Transform): 傅里叶变换,简称 FT,是一种数学工具,它将信号分解为各个频率。它通过用信号中存在的每个频率的幅度和相位来表示信号,从而提供这些信息。

离散傅里叶变换 (Discrete Fourier Transform, DFT): 这种离散傅里叶变换用于计算离散序列或信号的频域表示。它从有限的、均匀间隔的函数样本序列计算出一系列复数,这些复数在频域中表示信号。

FFT 算法: FFT 算法是一种高效的 DFT 实现,与传统的 DFT 方法相比,它可以更快地计算 DFT,尤其适用于长序列。当 N 是序列中的样本数时,它将计算 DFT 所需的操作次数从 O(N²) 降低到 O(NlogN)。

应用: FFT 在信号处理、图像处理、音频处理、通信和科学计算等领域得到了广泛应用。它可用于频谱分析、滤波、卷积、相关性计算以及许多其他任务。

性质: FFT 保留了 DFT 的线性、时移、频移、卷积和相关性等性质。这使得在频域中高效地计算这些操作成为可能。

MATLAB 中 fft() 的语法

其中

X 是输入信号,通常是一个表示离散时域样本的向量。

Y 是输出,表示输入信号的离散傅里叶变换。

语法变体

该函数使用快速傅里叶变换 (FFT) 算法计算信号 f 的离散傅里叶变换 (DFT)。

返回频域信号 F

指定点数

使用 n 点的 FFT 算法计算信号 f 的 DFT

返回 n 点的频域信号 F。默认情况下,F 的大小与 f 相同。

指定维度

沿由 dim 指定的维度计算信号 f 的 FFT 算法的 DFT。

沿 dim 维度返回频域信号 F。

其他说明

f: 输入信号或数组。

n: DFT 的点数。默认情况下,它是 f 的大小。

dim: 应用 FFT 的维度。此参数是可选的,在处理多维数组时很有用。如果未指定,则 FFT 将应用于第一个非单例维度。

示例用法

输出

Matlab fft()

基本用法

在 MATLAB 中使用 fft() 非常简单。将要分析的信号作为输入参数传递给函数。

示例

输出

Matlab fft()

在此示例中,x 代表一个合成信号,由三个频率分别为 100 Hz、200 Hz 和 300 Hz 的正弦分量组成。通过应用 fft(),我们得到 Y,它包含有关这些频率分量的幅度和相位的相关信息。

需要了解

如果 f 是向量: 函数 fft(f) 计算向量 f 的傅里叶变换,并将 F 作为结果生成。

如果 f 是矩阵,fft(f) 分别处理矩阵 f 的每一列,计算每一列的傅里叶变换。生成的输出 F 将是每一列的傅里叶变换。

如果 f 是多维数组,fft(f) 将沿第一个非单例数组维度上的值视为向量。它计算沿此维度的每个向量的傅里叶变换。生成的输出 F 将保留数组结构,并沿适当的维度计算傅里叶变换。

解释输出

fft() 的输出产生一个复值向量 Y,表示输入信号 x 的离散傅里叶变换。为了可视化频谱内容,我们通常绘制幅度谱或功率谱。这可以通过使用 abs() 来计算 Y 中复数值的幅度来实现。

示例

输出

Matlab fft()

此代码绘制了 FFT 输出的幅度谱相对于频率。它有助于可视化信号中存在的不同频率分量的幅度。

高级用法和选项

虽然 fft() 的基本用法足以满足许多应用的需求。

MATLAB 提供了额外的选项来根据特定需求定制 FFT 计算。

指定 FFT 长度: 默认情况下,MATLAB 的 fft() 使用大于或等于输入信号长度的最小 2 的幂来计算 FFT。

  • 但是,用户可以使用语法 Y = fft(X, N) 显式指定 FFT 长度,其中 N 是所需的 FFT 长度。

窗函数: 在计算 FFT 之前对输入信号应用窗函数可以减少频谱泄漏,提高频率分辨率,尤其是在分析有限持续时间信号时。

  • MATLAB 提供了各种窗函数,例如 Hamming、Hanning 和 Blackman。
  • 用户可以在调用 fft() 之前通过逐元素乘法 (.*) 应用窗函数。

双边频谱 vs. 单边频谱: 默认情况下,MATLAB 的 FFT 函数计算双边频谱,其中包括正频和负频。

  • 然而,对于实值信号,频谱是对称的,分析正频率就足够了,从而有效地将计算量减半。
  • 用户可以通过仅考虑 FFT 输出的前半部分来实现这一点。

频率分箱: 在分析 FFT 输出时,了解频率分辨率至关重要,频率分辨率由采样频率和 FFT 长度决定。

  • MATLAB 提供了 fftshift() 等函数来重新排列 FFT 输出以使零频率分量居中,并提供 fftfreq() 来计算相应的频率分箱。

示例

输出

Matlab fft()

在此示例中,我们显式将 FFT 长度指定为 1024,并在计算 FFT 之前对输入信号应用了 Hanning 窗。生成的单边幅度谱提供了信号频率内容的更清晰表示。

示例

输出

Matlab fft()
Matlab fft()

此版本简化了变量名,并为代码的每个部分提供了更清晰的注释。它生成三个正弦波,在时域中绘制它们,计算它们的 FFT,并在每个波形的频域中绘制单边幅度谱。

  • MATLAB 的 fft() 函数及其高级选项相结合,使用户能够对信号进行深入的频谱分析,从而更深入地理解其特性。

通过利用窗函数、频率分箱和单边频谱计算等功能,MATLAB 用户可以从其数据中提取有意义的见解,从而在各个领域做出明智的决策。