古典的なスペクトラムアナライザモデル
ChristophRauscherの「FundamentalsofSpectrum Analysis」で説明されている、古典的なスペクトラムアナライザの数値モデルを再現しようとしています。
古典的なモデルは、いくつかの局部発振器で構成されています(周波数掃引点の数による)。LO信号は、分析された信号と1つずつ混合する必要があります。次に、積をローパスフィルターのインパルス応答で畳み込む必要があります。最終的に、フィルタリングされた各信号のパワーを計算する必要があります。したがって、これらの値を掃引周波数に対してプロットできます。
スペクトル分析で最も一般的なIFバンドパスフィルターはガウスであるため、同等のものとしてガウスローパスを使用します。
結果のスペクトルは悪く見えます(図を参照)。3dB帯域幅は再現されません。キャリア周波数付近で歪んだガウス形式。
助言がありますか?
Matlab MWE:
clear variables;
close all;
%% Signal properties
fc = 1e6; % Carrier frequency, Hz
fs = 10e6; % Sampling frequency, Hz
%% Spectrum analyzer specification
span = 100e3; % Span window, Hz
center = 1e6; % Center frequency, Hz
sweep = 1e-3; % Sweep time, s
rbw = 10e3; % Resolution filter bandwidth, Hz
points = 501; % Sweep points
%% Signal synthesis
samples = sweep*fs+1;
% Time scale
time = linspace(0, sweep, samples);
% The signal
signal = cos(2*pi*fc*time);
%% Gaussian filter design
order = ceil(fs/2/rbw)*10;
alpha = 10;
cutoff = rbw/2;
window = gausswin(order+1, alpha);
b = fir1(order, cutoff/(fs/2), 'low', window, 'scale');
%% Signal analysis
start = center - span/2;
stop = center + span/2;
freqs = linspace(start, stop, points);
power = 10*log10(sum(signal.^2)/samples*(samples-1-order))-3;
product = zeros(samples, points);
values = zeros(1,points);
for i = 1:points
product(:,i) = (signal.*cos(2*pi*freqs(i)*time))';
product(:,i) = filter(b,1,product(:,i));
values(i) = 10*log10(sum(product((order+1):end,i).^2))-power;
end;
plot(freqs,values);
xlim([start stop]);
ylim([-120 0]);
grid on;
回答
問題は、OPが「Zero-IF」アーキテクチャでスペクトラムアナライザをシミュレートしているため、スイープ信号が入力信号に近づくと画像の問題が発生することだと思います(どちらも実際の信号であるため)。積は実際のLOでベースバンドにダウンコンバートされ、ローパスガウスフィルターを通過するため、非常に低い周波数の実際の正弦波としてDCセンターに近づくと、結果として得られる信号のサイクル数はますます少なくなります(最終的には部分的なサイクルになります)。 )これにより、電力推定値の変動が大きくなります。代わりに複素LOを使用することにより、結果の信号のエンベロープは一定であり、その変動を排除します(または、ベースバンド複素信号の2つの実数成分を観察することにより)$e^{j\omega t} = \cos(\omega t) + j\sin(\omega t)$ 検出器で一定の電力を維持するために、一方の部分サイクルが減少し、もう一方が増加していることがわかります)。
LOをOPのコード内の複雑な信号に変更し、実際のZero-IFレシーバーの従来のアーキテクチャと一致させることで、これが当てはまることを確認しました。
product(:,i) = (signal.*exp(-j*2*pi*freqs(i)*time))';
パワーには複素共役積を使用します(これはabs(x)を使用して行うこともできます。^ 2)
values(i) = 10*log10(sum(product((order+1):end,i).*(conj(product((order+1):end,i)))))-power;
その結果:
もう1つのオプション(シミュレーションにはお勧めしません!-同一であることを証明する必要がない限り)は、フィルターをローパスフィルターからバンドパスフィルターに移動し、LOをオフセットして次のようにすることです。 IF周波数はフィルターを通過します(従来のスペクトラムアナライザーアーキテクチャと一致します)。
シミュレーションの目的で、私は常に、処理にかなり時間がかかる実際のキャリアではなく、複雑な信号を使用して同等のベースバンド信号をシミュレートします。
さらに、このプロセスは、FFTを使用して1回の操作で実行できます。これは、大幅に高速であり、このような定常入力の場合、同じ結果が得られます。ガウスフィルターは、FFTを実行する前に、時間領域の波形にガウスウィンドウを乗算することで実装できます。非定常信号の場合、掃引時間の影響を適切にエミュレートするために、さらに追加を行うことができます。
帯域幅に関しては、OPのコードで使用されるガウスウィンドウは $\alpha = 10$ 以下から計算すると、5.64ビンの等価ノイズBWがあります。
$$\text{ENBW} = N\frac{\sum (w[n]^2)}{(\sum w[n])^2} \tag{1} \label{1}$$
とはいえ、サンプリングレートが10e6、ターゲット解像度の帯域幅が10KHzの場合、これには次の時間キャプチャが必要になります。
$$N = 5.64 \times (10e6/10e3) = 5640 \text{ samples}$$
これは、次のように、その長さのウィンドウ関数から直接係数を選択することにより、OPのコード内の10KHz解像度BWのガウスフィルターの持続時間にも一致します。
b = gaussian(5640, 10)
\ ref {1}のようにウィンドウから直接計算でき、のレンガ壁フィルターと同じ電力を正確に示すため、3 dB BWではなく等価ノイズ帯域幅(ENBW)を解像度BWとして使用します。ホワイトノイズ源の帯域幅。ENBWは、3 dB帯域幅よりもわずかに高くなっています(5%程度ですが、ウィンドウによって異なります)。
最近、DSP OnlineConferenceでfredharrisが繰り返し述べたように(https://www.dsponlineconference.com/)、ガウスウィンドウは最良の選択ではありません。彼が詳述したように、ガウス分布がスペクトル分析にしばしば選択される理由は、ガウス分布が最小の時間帯域幅積を持っていると信じられているため、時間と周波数の局所化が最小であるためです。ただし、これは、無限の時間サポートを必要とする真のガウス分布にのみ当てはまり、その場合にのみ当てはまります。$t \rightarrow \pm\infty$ 結果として、達成可能な最小の時間帯域幅積BT $BT = 0.5$。時間制限されたウィンドウのガウス応答を切り捨てると(実際の実装に必要な場合)、切り捨てられたガウス$BT>0.5$ また、期間が有限の場合に使用できる最小BTウィンドウ関数ではなくなりました。
有限時間サポートの下で最小時間BW積を持つウィンドウは、DPSS(Digital Prolate-Spheroid Sequence)ウィンドウであり、それに非常に近いのはカイザーウィンドウであり、どちらもMATLAB、Octave、およびPythonscipy.signalで使用できます。これらのウィンドウでは、阻止帯域の減衰も減少します。これは、多くのアプリケーションにとっても魅力的です。詳細については、以下を参照してください。https://ccrma.stanford.edu/~jos/sasp/Slepian_DPSS_Window.html 、 https://www.dsprelated.com/freebooks/sasp/Kaiser_DPSS_Windows_Compared.html#fig:dpsstest そして https://ieeexplore.ieee.org/document/543677