通信算法之251: 时频图谱spectrogram(如短时傅里叶变换STFT)
MATLAB 的 spectrogram
函数用于计算信号的短时傅里叶变换(STFT),生成时频图谱。以下是其核心参数的含义及作用,按输入参数和输出参数分类说明:
输入参数
参数名 | 类型 | 默认值 | 说明 |
---|---|---|---|
x | 向量 | 无 | 输入信号(必须为一维向量)。 |
window | 整数/向量 | hann(256) | 窗函数: - 若为整数 N ,表示窗长为 N 的汉宁窗;- 若为向量(如 hann(256) ),直接指定窗函数。 |
noverlap | 整数 | 窗长-1 | 重叠点数:相邻窗之间的重叠点数。增大重叠会平滑时频图,但增加计算量。 |
nfft | 整数 | max(256, 2^nextpow2(窗长)) | FFT点数: - 必须 ≥ 窗长; - 值越大,频率分辨率越高(但时间分辨率降低)。 |
fs | 标量 | 1 | 采样率(单位:Hz),用于计算频率轴 F 和时间轴 T 的实际物理单位。 |
freqrange | 字符串 | 'onesided' | 频率范围: - 'onesided' :单边谱(0~fs/2);- 'twosided' :双边谱(-fs/2~fs/2);- 'centered' :双边谱居中显示。 |
输出参数
参数名 | 类型 | 说明 |
---|---|---|
S | 矩阵 | 时频复矩阵: - 行对应频率,列对应时间; - 元素值为复数,表示幅度和相位。 |
F | 向量 | 频率轴:单位为 Hz(需指定 fs 参数)。 |
T | 向量 | 时间轴:每个时间点对应窗的中心位置。 |
P | 矩阵 | 功率谱密度(单位:dB),通过 spectrogram(..., 'power') 返回。 |
关键参数选择策略
-
窗长 (
window
)- 短窗(如 128 点):时间分辨率高,适合快速变化的瞬态信号。
- 长窗(如 512 点):频率分辨率高,适合稳态信号。
-
重叠点数 (
noverlap
)- 通常设为窗长的 50%~75%(如
noverlap = round(0.75*窗长)
)。
- 通常设为窗长的 50%~75%(如
-
FFT点数 (
nfft
)- 建议设为 2 的整数次幂(如 512、1024),以提高计算效率。
-
频率范围 (
freqrange
)- 实信号用
'onesided'
,复信号用'twosided'
或'centered'
。
- 实信号用
示例代码(带注释)
% 生成线性调频信号
fs = 1000;
t = 0:1/fs:2;
signal = chirp(t, 50, 2, 200); % 50Hz到200Hz的调频信号
% 设置参数
window = hann(256); % 汉宁窗,256点
noverlap = 192; % 重叠192点(75%重叠)
nfft = 512; % FFT点数
% 计算并绘制时频图
[s, f, t] = spectrogram(signal, window, noverlap, nfft, fs, 'yaxis');
figure;
imagesc(t, f, 20*log10(abs(s))); % 转换为dB单位
axis xy; colormap('jet'); colorbar;
xlabel('Time (s)'); ylabel('Frequency (Hz)');
title('STFT时频图(窗长256,重叠75%)');
- 如何减少频谱泄漏?
选择旁瓣衰减较大的窗函数(如blackmanharris
代替hann
)。 - 如何提高时间分辨率?
缩短窗长(牺牲频率分辨率)。 - 如何显示功率谱密度?
使用spectrogram(..., 'power')
并直接绘制P
矩阵。