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)\) 是一个复数序列,其幅度和相位分别代表了信号在各个频率分量上的强度和相位。
-
语法
-
语法说明
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)} \] -
语法
-
示例
fftshift - 零频分量中心化¶
-
功能 对
fft和fft2的输出进行重新排列,将零频分量移动到频谱的中心。这对于可视化频谱非常重要。 -
原理
fft的输出结果中,直流分量(0 Hz)位于数组的第一个元素,然后是正频率,最后是负频率。fftshift通过循环移位将数组的两半进行交换,使得零频位于中心,两侧分别是正负频率。 -
语法
-
示例
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的原始排列顺序。 -
语法
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]} \] -
示例
fftn, ifftn - N维快速傅里叶变换¶
-
功能 计算 N 维数组的 DFT 及其逆变换,是
fft和fft2的通用化版本。 -
语法
符号傅里叶变换 (连续)¶
fourier - 符号傅里叶变换¶
-
功能 计算连续时间函数的解析傅里叶变换 (需要 Symbolic Math Toolbox)。
-
数学原理 连续时间傅里叶变换 (FT) 定义为:
\[ F(\omega) = \int_{-\infty}^{\infty} f(t) e^{-\mr{i} \tm \omega \tm t} \,\d{t} \] -
语法
-
语法说明
fourier(f): 使用默认变量t和变换变量w。fourier(f, transVar): 指定变换后的频率变量为transVar。fourier(f, var, transVar): 指定原始函数的自变量为var,变换后的频率变量为transVar。
-
示例
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} \] -
语法
-
示例