将Matlab spectrogram转为plt.specgram,如何生成500×500功率谱密度矩阵?
Matlab spectrogram 转 Python plt.specgram 功率谱密度矩阵形状匹配方案
问题背景
将Matlab中基于spectrogram的频谱分析代码转为Python的plt.specgram后,可视化图像相似,但输出的功率谱密度矩阵P形状不一致:
- Matlab代码及结果:
这里Matlab的第一个参数Fs = 50*10^6; N = 500; [~,~,~,P] = spectrogram(X, Fs/N, 0, N, Fs, 'centered'); % P 的形状为 500×500Fs/N是信号分割的帧长,而非窗函数本身。 - Python代码及结果:
差异原因:Python的Fs = 50 * 10**6 nfft = 500 P, freq , t, img = plt.specgram(x, NFFT=nfft , Fs=Fs, noverlap=0, window = np.hanning(nfft )) % P 的形状为 500×100000plt.specgram默认用NFFT值作为帧长分割信号,与Matlab的帧长逻辑不匹配。
解决方案
要生成500×500的P矩阵,需对齐Matlab的帧分割规则,并处理频谱中心化:
- 计算匹配的帧长:Matlab中使用的帧长为
win_len = Fs / N = 50e6 / 500 = 100000 - 调整Python参数:在
plt.specgram中指定nperseg参数为计算出的帧长,同时保持其他参数与Matlab对齐:import numpy as np import matplotlib.pyplot as plt Fs = 50 * 10**6 nfft = 500 win_len = int(Fs / nfft) # 帧长设置为100000 # 调用specgram,指定帧长、FFT点数、无重叠 P, freq, t, img = plt.specgram( x, NFFT=nfft, Fs=Fs, noverlap=0, window=np.hanning(nfft), nperseg=win_len, # 关键参数:设置与Matlab一致的帧长 mode='psd' ) # 匹配Matlab的'centered'选项,将频谱中心化 P = np.fft.fftshift(P, axes=0) freq = np.fft.fftshift(freq) - 验证结果:此时
P的形状将变为500×500,与Matlab输出一致。
关键说明
plt.specgram的nperseg参数用于定义每个分析帧的长度,默认等于NFFT,这是导致形状差异的核心原因。- Matlab的
'centered'参数会将频谱中心移至0频率,Python中需通过np.fft.fftshift手动实现该效果。
内容的提问来源于stack exchange,提问作者sleli
相关产品推荐
相关产品推荐

