10ウィンドウを平均して(オーバーラップしていない?)スペクトルを計算して、8192または8193の周波数(0からナイキストまで)で2乗された振幅を取得しているようですが、一部のアルゴリズムでは、ビン8192でナイキスト周波数をドロップする場合があります。
最初に確認することは、ピークが右のビンにあることです。サンプリングレートとは何とも言わなかったが、ビン743はサンプリングレートの743/16384倍になる。信号が実際に800 Hzである場合、Fsは約17640サンプル/秒になります。それは間違っているようです。テスト信号はおそらく8000、16000、22050、32000、44100、または48000などの標準レートになります。Fs= 22050の場合、ピークはビン800/22050 * 16384 = 594で鋭くなります。
チェックする別の基準は、信号の総エネルギーが時間領域と周波数領域の両方でほぼ同じであることです。Pythonでの例を次に示します。
In [1]: NFFT = 2048; N = 10*NFFT; n = arange(N); Fs = 22050
In [2]: x = 0.4*cos(2*pi*400/Fs*n) + 0.6*cos(2*pi*800/Fs*n)
In [3]: y,freqs = psd(x, NFFT=NFFT, Fs=Fs, pad_to=16384) # PSD by Welch's Method
In [4]: sum(x**2)/Fs # time-domain energy
Out[4]: 0.24149869319296949
In [5]: sum(y) * N/16384 # frequency-domain energy
Out[5]: 0.24148752834391252
Fs = 22050サンプル/秒でサンプリングされた2つの正弦波で構成される入力信号xは、サイズNFFT = 2048サンプルの10個の重複しないウィンドウに分割されます。psd(パワースペクトル密度)の呼び出しは、10の16384ポイントDFTの絶対値の2乗の平均としてスペクトルyを計算します(xは実数値なので、実際には8193ポイントです)。
psd関数はyを信号の合計長ではなくDFTサイズにスケーリングしたため、計算された周波数領域エネルギーのスケーリング係数はN / 16384です。これが問題であるかどうかは、システムがPSDの正規化を処理する方法によって異なります。別のオプションの正規化は、1 / Fによるスケーリングです。これは、元のアナログ信号にエネルギーを一致させます。デフォルトの正規化は、ライブラリに十分に文書化されているはずです。