MATLAB中pwelch()输出转幅值响应及幅值偏差问题解析
关于MATLAB pwelch()幅值偏差的解释
你的问题核心在于对功率谱密度(PSD)的物理意义和**窗函数的等效噪声带宽(ENBW)**理解不到位,以下是具体解释和修正方案:
问题根源
你得到的0.605偏差和需要乘以的1.65系数,本质是两个因素共同作用的结果:
- pwelch的输出是单位频率的功率(PSD),而非直接的幅值谱;
- 汉明窗会展宽信号的频域带宽,需要用等效噪声带宽修正功率到幅值的转换。
关键推导
对于幅值为$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
相关产品推荐
相关产品推荐

