You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB中pwelch()输出转幅值响应及幅值偏差问题解析

关于MATLAB pwelch()幅值偏差的解释

你的问题核心在于对功率谱密度(PSD)的物理意义和**窗函数的等效噪声带宽(ENBW)**理解不到位,以下是具体解释和修正方案:

问题根源

你得到的0.605偏差和需要乘以的1.65系数,本质是两个因素共同作用的结果:

  1. pwelch的输出是单位频率的功率(PSD),而非直接的幅值谱;
  2. 汉明窗会展宽信号的频域带宽,需要用等效噪声带宽修正功率到幅值的转换。

关键推导

对于幅值为$A$的正弦信号,其平均功率为$\frac{A^2}{2}$。这个功率等于PSD峰值乘以信号在频域占据的带宽——也就是窗函数的等效噪声带宽(ENBW):
$$\frac{A^2}{2} = \text{pxx}_{\text{peak}} \times \text{ENBW}$$

汉明窗的ENBW系数约为1.36,即:
$$\text{ENBW} = 1.36 \times \frac{fs}{N_{\text{win}}}$$
其中$N_{\text{win}}$是窗的点数(即welch_win_len*fs)。

整理后得到正确的幅值计算式:
$$A = \sqrt{2 \times \text{pxx}_{\text{peak}} \times \text{ENBW}}$$

而你的处理是$\sqrt{\text{pxx}/\text{welch_win_len}}$,其中welch_win_len = N_win/fs,代入后等价于$\sqrt{\text{pxx} \times \frac{fs}{N_{\text{win}}}}$。对比正确公式,两者的比值为$\sqrt{2 \times 1.36} \approx 1.65$——这就是你需要乘以的修正系数。

修正后的代码

fs = 200;
win_len = 5;
t = 1/fs:1/fs:win_len;
welch_win_len = 3;
N_win = welch_win_len*fs; % 窗的点数
NFFT = length(t);

% 目标信号
amplitude = 1;
target_f = 10;
x = amplitude*sin(2*pi*target_f*t);

%% Welch方法:正确的幅值转换
[pxx, f_welch] = pwelch(x, welch_win_len*fs, fs/2, NFFT, fs);

% 汉明窗的等效噪声带宽系数
hamming_enbw = 1.36;
ENBW = hamming_enbw * fs / N_win;
% 计算正确幅值
welch_amplitude = sqrt(2 * pxx * ENBW);

figure
plot(f_welch, welch_amplitude);
title('Welch方法得到的正确幅值谱');
ylim([0, 1.2]);

%% FFT幅值谱对比
FFT = 2*abs(fft(x))/NFFT;
FFT = FFT(1:end/2+1);
FFT(1) = FFT(1)/2;
FFT(end) = FFT(end)/2;

f = linspace(0, fs/2, NFFT/2+1);
figure
plot(f, FFT)
title('FFT得到的幅值谱');
ylim([0, 1.2]);

内容的提问来源于stack exchange,提问作者Seonghun Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 17:24:51