Skip to content

MATLAB - 傅里叶变换

傅里叶变换(Fourier Transform)是信号处理的基石,它就像一个数学棱镜,将信号(如随时间变化的声波)分解为其组成频率。这使您能够分析信号中存在哪些频率以及它们的强度。MATLAB 为解析(符号)和数值傅里叶变换提供了强大的工具。

fourier 函数是 Symbolic Math Toolbox(符号数学工具箱)的一部分。它用于查找数学表达式的精确解析傅里叶变换。这适用于理论研究,不适用于处理测量的数值数据。

F = fourier(f) % Transform f with default variables
F = fourier(f, u) % Use u as the transform variable instead of w
F = fourier(f, v, u) % Treat f as a function of v, transform to u
% 需要 Symbolic Math Toolbox
syms t w a
% 定义函数 f(t)
f = exp(-a * t^2);
% 计算其傅里叶变换 F(w)
F = fourier(f, t, w);
% 显示结果
disp('Function f(t):');
disp(f);
disp('Fourier Transform F(w):');
disp(F);
% --- 输出 ---
% Function f(t):
% exp(-a*t^2)
%
% Fourier Transform F(w):
% (pi^(1/2)*exp(-w^2/(4*a)))/a^(1/2)

该结果表明高斯函数的傅里叶变换是另一个高斯函数。

fft(快速傅里叶变换)函数是实际信号处理的主力。它计算数值数据(例如音频信号、传感器读数或图像像素)的离散傅里叶变换 (DFT)。

Y = fft(X)
Y = fft(X, n)
Y = fft(X, n, dim)
  • Y = fft(X):计算向量或矩阵 X 的 DFT。如果 X 是矩阵,它将处理每一列。
  • Y = fft(X, n):计算 n 点 DFT。如果信号 X 短于 n,则用零填充;如果长于 n,则截断。
  • Y = fft(X, n, dim):沿指定维度 dim 计算 DFT。

让我们找出由 50 Hz 和 120 Hz 正弦波组成并被随机噪声破坏的信号的频率分量。这是通信和数据分析中的常见任务。

%% 步骤 1:创建信号
Fs = 1000; % 采样频率 (Hz)
T = 1/Fs; % 采样周期 (s)
L = 1500; % 信号长度
t = (0:L-1)*T; % 时间向量
% 创建一个包含两个频率(50 Hz 和 120 Hz)的信号
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
% 添加零均值随机噪声
X = S + 2*randn(size(t));
% 绘制时域中的带噪声信号
figure;
plot(1000*t(1:100), X(1:100)); % 绘制前 100 毫秒
title('Noisy Signal in Time Domain');
xlabel('t (milliseconds)');
ylabel('X(t)');
%% 步骤 2:计算 FFT
Y = fft(X);
%% 步骤 3:计算双边和单边频谱
% fft 的输出是复数且对称的。我们需要对其进行处理。
P2 = abs(Y/L); % 计算双边频谱 P2
P1 = P2(1:L/2+1); % 计算单边频谱 P1
P1(2:end-1) = 2*P1(2:end-1); % 将除了直流分量和奈奎斯特频率之外的所有频率的功率加倍
%% 步骤 4:定义频域并绘图
% 为 x 轴创建频率向量
f = Fs*(0:(L/2))/L;
figure;
plot(f, P1);
title('Single-Sided Amplitude Spectrum of X(t)');
xlabel('f (Hz)');
ylabel('|P1(f)|');
grid on;
axis([0 200 0 1.2]); % 关注相关频率范围

运行此代码时,您将得到两个图:

  1. 一个随时间变化的嘈杂、混乱的信号图,其中隐藏了底层正弦波。
  2. 一个频率频谱图,在 50 Hz 和 120 Hz 处有两个清晰的峰值,揭示了隐藏在噪声中的原始频率。120 Hz 处的峰值更高,对应于其在原始信号中更高的振幅。
  • 频率轴:不要将 FFT 输出与采样索引 1:L 对比绘图。始终计算并使用示例中所示的正确频率向量 f。
  • 归一化:fft 的原始输出会随信号长度而缩放。通过长度 L 进行归一化以获得正确的幅值。
  • 单边频谱:对于实值信号,FFT 是对称的。通常只需分析输出的前半部分(单边频谱)。请记住将幅值乘以 2,以解释另一半的能量。
  • fftshift:对于某些分析,将零频率(直流)分量置于图的中心会很有用。fftshift 函数可用于为此目的重新排列 fft 输出。