信号处理实战:5种常见信号的傅里叶变换速查手册(附MATLAB验证代码)
很多工程师和学生在学习信号与系统时,都会遇到一个共同的困境:公式推导得头头是道,一到实际项目里,面对一个具体的信号,却不知道它的频谱长什么样,或者理论结果和仿真对不上号。我自己在早期做通信系统仿真时,就经常卡在“这个脉冲的频谱公式是什么来着?”或者“为什么我仿出来的幅频特性和书上画的不一样?”这类问题上。后来我发现,与其死记硬背一长串公式,不如建立一个清晰的“信号-频谱”映射库,并掌握一套用MATLAB快速验证的方法。这篇文章,就是把我这些年积累的实战经验整理成册,重点不是复述教材,而是告诉你,在真实的工程开发或数据分析中,如何快速定位、应用并验证这五种最核心信号的傅里叶变换。
这份手册面向的是已经了解傅里叶变换基本概念,但需要在项目开发、算法调试或学术研究中快速应用的电子工程师、通信算法工程师以及相关专业的高年级学生。我们将聚焦于五个工程中极其常见且具有代表性的信号:矩形脉冲、单位冲激、复指数衰减、正弦/余弦以及符号函数。对于每一种信号,我们不仅会回顾其频谱的数学表达式,更重要的是,我会分享如何在MATLAB中准确地生成信号、计算其离散傅里叶变换(DFT/FFT),并通过技巧性的后处理,让仿真结果无限逼近理论上的连续时间傅里叶变换(CTFT),从而解决“理论不会用”的痛点。你会发现,掌握了这套方法,频谱分析将从一个抽象的理论概念,变成一个可以直观操作和验证的实用工具。
1. 工程基石:矩形脉冲与Sa函数频谱
在数字通信、雷达信号处理或任何涉及信号截断的场景里,矩形脉冲(Rectangular Pulse)几乎无处不在。比如,你用一个有限时间长度的窗去采样一段信号,这个窗本身就是一个矩形脉冲。它的频谱特性直接决定了信号截断后带来的频谱泄漏程度。
矩形脉冲的数学定义很简单:在时间区间 [-τ/2, τ/2] 内幅度为 A,其余时间为0。它的连续时间傅里叶变换(CTFT)是一个经典的Sa函数(抽样函数),其表达式为:
X(jω) = Aτ * Sa(ωτ/2) = Aτ * [sin(ωτ/2) / (ωτ/2)]
这个公式的优美之处在于,它明确揭示了时域宽度 τ 与频域主瓣宽度之间的反比关系:τ 越大(脉冲越宽),频谱的主瓣就越窄;反之,τ 越小(脉冲越窄),频谱就展得越宽。这是一个非常基础的时频权衡关系。
注意:在MATLAB中,没有内置的
sinc函数默认定义是sin(πx)/(πx),这与我们工程上常用的Sa(x) = sin(x)/x有所不同。计算时需特别注意换算。
理论公式记住了,但在MATLAB里怎么验证呢?直接对连续的矩形脉冲做CTFT是不可能的,我们必须通过离散化来逼近。这里的关键在于理解“如何设置仿真参数才能让离散结果足够接近理论连续谱”。以下是一个完整的验证步骤和代码示例:
% 矩形脉冲频谱验证
clear; close all; clc;
% 1. 定义参数
A = 2; % 脉冲幅度
tau = 3; % 脉冲宽度(秒)
fs = 100; % 采样率 (Hz),必须足够高以满足奈奎斯特条件
T_total = 10; % 总仿真时间(秒),要远大于脉冲宽度以近似无限长时域
% 2. 生成时间序列和矩形脉冲信号
t = -T_total/2 : 1/fs : T_total/2; % 时间向量,以0为中心
rect_pulse = A * (abs(t) <= tau/2); % 生成矩形脉冲
% 3. 计算DFT(使用FFT)并调整以获得双边频谱
N = length(rect_pulse); % 信号点数
f = (-N/2 : N/2-1) * (fs / N); % 频率向量(Hz)
X = fftshift(fft(rect_pulse, N)) / fs; % FFT并归一化,近似CTFT
% 4. 计算理论频谱 (Sa函数)
omega = 2 * pi * f; % 角频率 (rad/s)
% 注意:避免除零,使用 sinc 函数定义进行转换
% 理论值: X_theory = A * tau * sin(omega*tau/2) ./ (omega*tau/2)
% 利用关系: sin(x)/x = π * sinc(x/π)
X_theory = A * tau * pi * sinc(omega*tau/(2*pi)); % 使用MATLAB sinc函数
X_theory(isnan(X_theory)) = A * tau; % 处理 omega=0 处的极限值(主瓣峰值)
% 5. 绘图对比
figure('Position', [100, 100, 1200, 500]);
subplot(1,2,1);
plot(t, rect_pulse, 'LineWidth', 2);
xlabel('时间 t (秒)'); ylabel('幅度');
title('时域矩形脉冲');
grid on; xlim([-5, 5]);
subplot(1,2,2);
plot(f, abs(X), 'b-', 'LineWidth', 1.5, 'DisplayName', 'MATLAB FFT结果');
hold on;
plot(f, abs(X_theory), 'r--', 'LineWidth', 2, 'DisplayName', '理论频谱 (Sa函数)');
xlabel('频率 f (Hz)'); ylabel('幅度谱 |X(f)|');
title('频域幅度谱对比');
legend('Location', 'best'); grid on;
xlim([-5, 5]); % 聚焦在主瓣和几个旁瓣
运行这段代码,你会看到仿真得到的幅度谱(蓝色实线)与红色的理论Sa函数曲线几乎完全重合。这里有几个实操要点决定了成败:
- 采样率
fs:必须远高于信号最高频率分量。对于矩形脉冲,理论上频谱无限宽,但能量主要集中在主瓣内。通常fs至少是(10/tau)的几倍以上,才能较好地捕捉频谱形状。 - 总时长
T_total:必须足够长,使得信号在时间轴两端基本衰减到零。这模拟了信号在无限时域上的积分,是DFT逼近CTFT的前提。如果T_total太小,会因时域截断引入额外的频谱泄漏。 - 归一化因子
/fs:对FFT结果除以采样率fs,是将基于离散样本的求和近似还原为连续时间积分的关键一步,使得FFT结果的幅度量纲与CTFT理论值匹配。 - 频率向量
f的生成:使用fftshift和正确的频率向量计算,是获得以零频为中心的双边频谱的标准做法。
通过这个案例,你不仅验证了公式,更重要的是掌握了一套从连续理论到离散仿真的通用方法。下次当你需要分析一个门控信号或者评估窗函数性能时,就可以直接套用这个流程。
2. 理想采样与频域冲击:单位冲激与常数信号
单位冲激函数 δ(t) 和常数信号 1 构成了傅里叶变换中另一对极具对称美的组合。它们在理论上代表了两种极端:无限的时间集中和无限的频率集中。在工程上,δ(t) 常用来模拟理想的瞬时冲击或采样操作,而常数信号则代表直流分量。
它们的变换对非常简洁:
- 时域冲激,频域平坦:
δ(t) ⇔ 1这意味着一个理想的时间点冲击包含了所有频率成分,且每个频率分量的幅度和相位都相同(均为1)。这解释了为什么用脉冲去激励一个系统,可以测出该系统的频率响应(冲激响应)。 - 时域平坦,频域冲激:
1 ⇔ 2πδ(ω)一个幅度恒为1的直流信号,其能量全部集中在零频处,在频域表现为一个强度为2π的冲激函数。这里的2π因子来源于我们使用角频率ω(rad/s)的定义。
在MATLAB中,我们无法真正生成连续的 δ(t),但可以通过一个幅度很大、宽度很窄的矩形脉冲来近似。验证这对变换的关键,在于观察当脉冲宽度趋于无限窄时,其频谱如何趋于平坦。下面我们通过一个动态演示来观察这个极限过程:
% 观察冲激函数近似及其频谱变化
figure('Position', [100, 100, 10

&spm=1001.2101.3001.5002&articleId=153957959&d=1&t=3&u=ae67264eed1c4a4c83fe337976388931)
9050

被折叠的 条评论
为什么被折叠?



