The power spectrum measures the distribution of **power vs frequency components**, so its scaling preserves the correct power spectrum peak heights, while the PSD measures the distribution of **power vs unit frequency**, so its scaling preserves broadband power. 

The PSD is appropriate if one is interested in consistent **broad-band** power levels. If you want consistent **narrow-band** power levels, you should compute the power spectrum, which uses a different scaling factor. **These are the scaling factors Matlab's `welch` method applies under the hood depending on the `method` specified.**

Denote by $|X|^2$ the frequency averaged Squared Magnitude Spectrum and $w$ the window applied.

 - The PSD is: $$\frac{2|X|^2}{f_s \times S_2} \quad \texttt{with} \quad S_2 =
   \sum_{i = 0}^{N - 1} w_i^2$$
 - The Power Spectrum is: $$\frac{2|X|^2}{S_1} \quad \texttt{with} \quad S_1
   = \left(\sum_{i = 0}^{N - 1} w_i\right)^2$$

Add a little noise to your pure tone, and notice how the noise power stays the same but signal power fluctuates when you change `nsc` with the PSD, and how the opposite is true when using the Power Spectrum:

[![enter image description here][1]][1]

To replicate:

    close all
    fs = 20e7;
    sine = dsp.SineWave('Amplitude',1,'Frequency',10e6,'SampleRate',fs,'SamplesPerFrame',1000000);
    y = sine();
    y = y+ randn(length(y),1);
    
    figure(1)
    subplot 211
    title('psd')
    hold on
    subplot 212
    title('Power spectrum')
    hold on
    for method = {'psd', 'power'}
        for nsc = [500000, 50000, 5000]
            nov = floor(nsc/2);
            nff = max(256,2^nextpow2(nsc));
    
            [pxx, f] = pwelch(y,rectwin(nsc),nov,nff,fs, string(method));
            pxx = 10*log10(pxx) + 30; % also convert to dBm
            
            if strcmp(string(method), "psd")
                subplot 211
                ylabel("PSD (dBm/Hz)");
            else
                subplot 212
                ylabel("PS (dBm)");
            end
            plot(f, pxx);
            grid on;
            xlim([0 20e6]);
            xlabel("Frequency (Hz)");
            
        end
    end
    legend('nsc = 500000', 'nsc = 50000', 'nsc = 5000');

  [1]: https://i.sstatic.net/3H0fb.png