显示电平

扫频式频谱仪的运行过程是:

  1. 输入信号进入频谱仪;
  2. 频谱仪把某个频率附近的信号变换到中频;
  3. 经过一个中频滤波器,带宽为 RBW;
  4. 检波并显示电平;
  5. 本振继续扫频,得到频谱曲线。

当频谱仪扫到某个频点 时,实际测到的是 附近一段频谱范围内的信号,近似代表 RBW 滤波器通带内的总功率,即信号功率谱密度 PSD 与 RBW 滤波器响应 的加权积分

对于单载波,理想情况下,单载波的显示电平不随频谱仪 RBW 变化。

对于调制波,如果功率谱密度在 RBW 范围内近似均匀分布,则

因此,扫频式频谱仪本质上是通过一个有限带宽的滤波器观察频谱。

仿真

  • 单音信号,不同 RBW 下频谱宽度变化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
close all; clear; clc;

f_span = 10e6;
N = 65536;
f = linspace(-f_span/2, f_span/2, N);
gauss_filter = @(f, RBW) exp(-log(2) * (2*f/RBW).^2);

f0 = 0; P0_dBm = -20;
RBW_list = [1e3, 10e3, 100e3];
figure;
for k = 1:length(RBW_list)
RBW = RBW_list(k);
H = gauss_filter(f - f0, RBW);
spectrum_dBm = P0_dBm + 20 * log10(H + eps);

subplot(length(RBW_list),1,k);
plot(f/1e6, spectrum_dBm, 'LineWidth', 1.5);
grid on;
xlim([-0.5, 0.5]);
ylim([-100, 0]);
xlabel('Frequency Offset / MHz');
ylabel('Power / dBm');
title(['RBW = ', num2str(RBW/1e3), ' kHz']);
end
  • 双音信号:RBW 对分辨率的影响
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
close all; clear; clc;

f_span = 10e6;
N = 65536;
f = linspace(-f_span/2, f_span/2, N);
gauss_filter = @(f, RBW) exp(-log(2) * (2*f/RBW).^2);


delta_f = 500e3;
f1 = -delta_f/2; f2 = delta_f/2;

P_tone_dBm = -20;
RBW_list = [50e3, 500e3, 1e6];

figure;
for k = 1:length(RBW_list)
RBW = RBW_list(k);
H1 = gauss_filter(f - f1, RBW);
H2 = gauss_filter(f - f2, RBW);
P1_mW = 10^(P_tone_dBm/10) * H1.^2;
P2_mW = 10^(P_tone_dBm/10) * H2.^2;

P_total_mW = P1_mW + P2_mW;
spectrum_dBm = 10*log10(P_total_mW + eps);

subplot(length(RBW_list),1,k);
plot(f/1e6, spectrum_dBm, 'LineWidth', 1.5);
grid on;

xlim([-2.5, 2.5]);
ylim([-100, 0]);
xlabel('Frequency Offset / MHz');
ylabel('Power / dBm');

title(['\Delta = ', num2str(delta_f/1e3), ' kHz,RBW = ', num2str(RBW/1e3), ' kHz,']);
end
  • 噪声底随 RBW 的变化,弱单音信号在不同 RBW 下的可见性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
close all; clear; clc;

f_span = 10e6;
N = 65536;
f = linspace(-f_span/2, f_span/2, N);
gauss_filter = @(f, RBW) exp(-log(2) * (2*f/RBW).^2);

thermal_noise_dBm_Hz = -174; % dBm/Hz,290 K
NF = 20;
RBW_noise = logspace(1, 6, 300); % 10Hz~1MHz

% Noise Floor = -174 dBm/Hz + NF + 10log10(RBW)
noise_floor_dBm = thermal_noise_dBm_Hz + NF + 10 * log10(RBW_noise);

figure;
semilogx(RBW_noise, noise_floor_dBm, 'LineWidth', 2);
grid on;
xlabel('RBW / Hz');
ylabel('Noise Floor / dBm');
title('Noise VS RBW');


P_weak_dBm = -110; f_weak = 0;
RBW_weak_list = [1e3, 10e3, 1e5];

figure;
for k = 1:length(RBW_weak_list)
RBW = RBW_weak_list(k);

noise_dBm = thermal_noise_dBm_Hz + NF + 10*log10(RBW);

H = gauss_filter(f - f_weak, RBW);
signal_mW = 10 ^ (P_weak_dBm / 10) * H.^2;
noise_mW = 10 ^ (noise_dBm / 10) * ones(size(f));

total_mW = signal_mW + noise_mW;
spectrum_dBm = 10 * log10(total_mW + eps);

subplot(length(RBW_weak_list),1,k);
plot(f/1e6, spectrum_dBm, 'LineWidth', 1.3);
hold on;
yline(noise_dBm, '--r', 'Noise Floor');
grid on;
xlim([-1, 1]);
ylim([-150, -60]);
xlabel('Frequency Offset / MHz');
ylabel('Power / dBm');
title(['RBW = ', num2str(RBW/1e3), ' kHz,Noise Floor = ', num2str(noise_dBm,'%.1f'), ' dBm']);
end
  • 宽带信号 Marker 显示电平随 RBW 变化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
close all; clear; clc;

f_span = 10e6;
N = 65536;
f = linspace(-f_span/2, f_span/2, N);
gauss_filter = @(f, RBW) exp(-log(2) * (2*f/RBW).^2);

thermal_noise_dBm_Hz = -174; % dBm/Hz,290 K
NF = 20;

PSD_dBm_Hz = -120;
signal_BW = 2e6;
PSD_mW_Hz = 10 ^ (PSD_dBm_Hz / 10);
signal_psd = zeros(size(f));
signal_psd(abs(f) <= signal_BW/2) = PSD_mW_Hz;

figure;
RBW_wide_list = [10e3, 100e3, 1e6];
for k = 1:length(RBW_wide_list)
RBW = RBW_wide_list(k);
noise_dBm = thermal_noise_dBm_Hz + NF + 10*log10(RBW);
H = gauss_filter(f, RBW);
H_power = H.^2;

df = f(2) - f(1);
H_power = H_power / sum(H_power * df) * RBW;

marker_power_mW = conv(signal_psd, H_power, 'same') * df;
marker_power_dBm = 10*log10(marker_power_mW + eps);

subplot(length(RBW_wide_list),1,k);
plot(f/1e6, marker_power_dBm, 'LineWidth', 1.5);
grid on; hold on;
xlim([-3.5, 3.5]);
ylim([-160, -40]);

xl = xlim;
patch([xl(1), xl(2), xl(2), xl(1)], ...
[-160, -160, noise_dBm, noise_dBm], ...
[0.8 0.8 0.8], ...
'EdgeColor', 'none', ...
'FaceAlpha', 0.4);
yline(noise_dBm, '--r', 'Noise Floor', 'LineWidth', 1.2);

xlabel('Frequency Offset / MHz');
ylabel('Marker Power / dBm');
title(['BW = ', num2str(signal_BW/1e6), ' MHz,RBW = ', num2str(RBW/1e3), ' kHz']);
end