跳转至

MATLAB 傅里叶变换

傅里叶变换是信号处理和数据分析中最重要的工具之一。其核心思想是将一个信号(通常在时域或空域中)分解为其组成成分的频率谱。MATLAB 提供了两大类截然不同的方法来进行傅里叶变换:数值(离散)变换符号(连续)变换

  • 数值傅里叶变换:

    • 适用场景: 处理离散的、有限长度的信号序列,例如来自传感器采样的数据。
    • 核心算法: 快速傅里叶变换 (FFT),用于高效计算离散傅里叶变换 (DFT)。
    • 特点: 结果是数值频谱,计算速度极快,是实际应用中的主力。
  • 符号傅里叶变换:

    • 适用场景: 当你知道函数的精确数学表达式,并希望得到其傅里叶变换的解析表达式时。
    • 核心算法: 应用微积分的积分法则进行符号运算。
    • 特点: 结果是精确的符号表达式,用于理论分析。需要 Symbolic Math Toolbox

数值傅里叶变换 (离散)

fft - 快速傅里叶变换

  • 功能 使用快速傅里叶变换 (FFT) 算法计算一个向量或矩阵的离散傅里叶变换 (DFT)。

  • 数学原理 对于一个长度为 \(N\) 的信号序列 \(x(n)\)(其中 \(n=1, 2, \dots, N\)),其 DFT 定义为:

    \[ X(k) = \sum_{n=1}^{N} x(n) e^{-\mr{i} \tm \frac{2\pi}{N} (k-1)(n-1)} \]

    其中 \(k=1, 2, \dots, N\)。结果 \(X(k)\) 是一个复数序列,其幅度和相位分别代表了信号在各个频率分量上的强度和相位。

  • 语法

    Y = fft(X)
    Y = fft(X, n)
    Y = fft(X, n, dim)
    

  • 语法说明

    • fft(X): 返回向量 X 的 DFT。如果 X 是矩阵,则对每一列进行变换。
    • fft(X, n): 指定变换的长度 n。如果 n > length(X),则对 X 进行零填充;如果 n < length(X),则对 X 进行截断。
    • fft(X, n, dim): 沿着指定的维度 dim 进行变换。
  • 示例

    % 1. 创建信号:一个 50Hz 和一个 120Hz 的正弦波叠加
    Fs = 1000;            % 采样频率
    T = 1/Fs;             % 采样周期
    L = 1500;             % 信号长度
    t = (0:L-1)*T;        % 时间向量
    S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
    
    % 2. 执行 FFT
    Y = fft(S);
    
    % 3. 计算双边频谱 P2,然后计算单边频谱 P1
    P2 = abs(Y/L);
    P1 = P2(1:L/2+1);
    P1(2:end-1) = 2*P1(2:end-1);
    
    % 4. 定义频域 f 并绘图
    f = Fs*(0:(L/2))/L;
    figure;
    plot(f, P1);
    title('fft 示例 - 信号的单边振幅谱');
    xlabel('频率 (f/Hz)');
    ylabel('|P1(f)|');
    

ifft - 快速傅里叶逆变换

  • 功能 计算离散傅里叶逆变换 (IDFT),将信号从频域转换回时域。

  • 数学原理 对于一个频域序列 \(X(k)\),其 IDFT 定义为:

    \[ x(n) = \frac{1}{N} \sum_{k=1}^{N} X(k) e^{\mr{i} \tm \frac{2\pi}{N} (k-1)(n-1)} \]
  • 语法

    X = ifft(Y)
    X = ifft(Y, n)
    X = ifft(Y, n, dim)
    

  • 示例

    % 延续上一个 fft 的示例
    % Y 是 S 的 FFT 结果
    
    % 使用 ifft 将频域信号 Y 转换回时域
    s_reconstructed = ifft(Y);
    
    figure;
    plot(t(1:100), S(1:100), 'b-', 'DisplayName', '原始信号');
    hold on;
    plot(t(1:100), s_reconstructed(1:100), 'r--', 'DisplayName', 'ifft 重构信号');
    legend;
    title('ifft 逆变换示例');
    xlabel('时间 (t/s)');
    ylabel('信号幅度');
    

fftshift - 零频分量中心化

  • 功能fftfft2 的输出进行重新排列,将零频分量移动到频谱的中心。这对于可视化频谱非常重要。

  • 原理 fft 的输出结果中,直流分量(0 Hz)位于数组的第一个元素,然后是正频率,最后是负频率。fftshift 通过循环移位将数组的两半进行交换,使得零频位于中心,两侧分别是正负频率。

  • 语法

    Y = fftshift(X)
    Y = fftshift(X, dim)
    

  • 示例

    Fs = 100;
    t = -5:1/Fs:5;
    x = sin(2*pi*5*t);
    
    Y = fft(x);
    Y_shifted = fftshift(Y);
    
    f_unshifted = (0:length(Y)-1)*Fs/length(Y);
    f_shifted = (-length(Y)/2:length(Y)/2-1)*Fs/length(Y);
    
    figure;
    subplot(2,1,1);
    plot(f_unshifted, abs(Y));
    title('fft 输出 (零频在左侧)');
    
    subplot(2,1,2);
    plot(f_shifted, abs(Y_shifted));
    title('fftshift 输出 (零频在中心)');
    xlabel('频率 (Hz)');
    

ifftshift - 逆零频移位

  • 功能 fftshift 的逆操作。在进行 ifft 之前,如果频谱是中心化的,需要用 ifftshift 将其恢复到 fft 的原始排列顺序。

  • 语法

    X = ifftshift(Y)
    X = ifftshift(Y, dim)
    

fft2, ifft2 - 二维快速傅里叶变换

  • 功能 计算矩阵的二维 DFT 及其逆变换,广泛用于图像处理和分析。

  • 数学原理 二维 DFT 是对二维信号(如图像)在两个方向上分别应用一维 DFT:

    \[ X(k_x, k_y) = \sum_{n_x=1}^{N_x} \sum_{n_y=1}^{N_y} x(n_x, n_y) e^{-\mr{i} \tm 2\pi \left[ \frac{k_x-1}{N_x}(n_x-1) + \frac{k_y-1}{N_y}(n_y-1) \right]} \]
  • 示例

    I = imread('cameraman.tif');
    F = fft2(I);
    F_shifted = fftshift(F);
    magnitude_spectrum = log(1 + abs(F_shifted));
    
    figure;
    subplot(1,2,1); imshow(I); title('原始图像');
    subplot(1,2,2); imshow(magnitude_spectrum, []); title('二维 FFT 幅度谱');
    

fftn, ifftn - N维快速傅里叶变换

  • 功能 计算 N 维数组的 DFT 及其逆变换,是 fftfft2 的通用化版本。

  • 语法

    Y = fftn(X)
    X = ifftn(Y)
    

符号傅里叶变换 (连续)

fourier - 符号傅里叶变换

  • 功能 计算连续时间函数的解析傅里叶变换 (需要 Symbolic Math Toolbox)。

  • 数学原理 连续时间傅里叶变换 (FT) 定义为:

    \[ F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-\mr{i} \tm \omega \tm t} \,\d{t} \]
  • 语法

    F = fourier(f)
    F = fourier(f, transVar)
    F = fourier(f, var, transVar)
    

  • 语法说明

    • fourier(f): 使用默认变量 t 和变换变量 w
    • fourier(f, transVar): 指定变换后的频率变量为 transVar
    • fourier(f, var, transVar): 指定原始函数的自变量为 var,变换后的频率变量为 transVar
  • 示例

    syms t w
    
    % 定义一个高斯脉冲函数
    f = exp(-t^2);
    
    % 计算其傅里叶变换
    Fw = fourier(f, t, w);
    
    disp('高斯脉冲的傅里叶变换是:');
    disp(Fw); % 结果是另一个高斯函数: pi^(1/2)*exp(-w^2/4)
    
    figure;
    subplot(2,1,1);
    fplot(f, [-5, 5], 'LineWidth', 2);
    title('原始函数 f(t)');
    
    subplot(2,1,2);
    fplot(Fw, [-5, 5], 'LineWidth', 2);
    title('傅里叶变换 F(\omega)');
    

ifourier - 符号傅里叶逆变换

  • 功能 计算连续频域函数的解析傅里叶逆变换 (需要 Symbolic Math Toolbox)。

  • 数学原理 傅里叶逆变换 (IFT) 定义为:

    \[ f(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} F(\omega) e^{\mr{i} \tm \omega \tm t} \d{\omega} \]
  • 语法

    f = ifourier(F)
    f = ifourier(F, transVar)
    f = ifourier(F, var, transVar)
    

  • 示例

    syms t w
    
    % 定义一个频域的 sinc 函数
    Fw = 2*sin(w)/w; % 这是矩形脉冲的傅里叶变换结果
    
    % 对其进行逆变换
    ft = ifourier(Fw, w, t);
    
    disp('sinc(w) 函数的傅里叶逆变换是:');
    disp(ft); % 结果应为一个矩形脉冲
    
    figure;
    fplot(ft, [-3, 3], 'LineWidth', 2);
    title('ifourier 逆变换结果 - 矩形脉冲');
    ylim([-0.2 1.2]);