显示电平
扫频式频谱仪的运行过程是:
- 输入信号进入频谱仪;
- 频谱仪把某个频率附近的信号变换到中频;
- 经过一个中频滤波器,带宽为 RBW;
- 检波并显示电平;
- 本振继续扫频,得到频谱曲线。
当频谱仪扫到某个频点
时,实际测到的是 附近一段频谱范围内的信号,近似代表 RBW
滤波器通带内的总功率,即信号功率谱密度 PSD 与 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
|
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; NF = 20; RBW_noise = logspace(1, 6, 300);
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
|
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; 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
|