过采样倍数带来的snr提升换算仿真

前言:用于搞不清楚过采样与没有过采样时怎么换算snr的选手通过仿真验证。最后介绍了实际接收机模型如何仿真,这部分希望对此不清楚的选手认真观看

没有成形滤波器时,\(snr\)记为\(snr_0\),有成形滤波器记为\(snr_1\),成形滤波器过采样倍数(每个符号采样点数)为\(sps\)
则换算关系为:\(snr_0=snr_1+10*\log_{10}(sps)\)

fprintf('\n');
x=randi([0 1],1000,1);
x=qammod(x,2);
sps=10;
rrc=rcosdesign(0.22,10,sps,"sqrt");
rrc=sqrt(sps)*rrc;
x=upsample(x,sps);
x=filter(rrc,1,[x;zeros(floor(length(rrc)/2),1)]);
x=x(floor(length(rrc)/2)+1:end);
noise = randn(size(x));
fprintf('信道SNR:0 dB\n\n');
fprintf('信道:噪声平均值:%.4f; 信号平均值:%.4f\n\n',rms(noise),rms(x));
noise_filter = filter(rrc,1,[noise;zeros(floor(length(rrc)/2),1)]);
noise_filter=noise_filter(floor(length(rrc)/2)+1:end);
fprintf('最佳采样点噪声平均值:%.4f\n \n',rms(noise_filter(1:sps:end)));
y = filter(rrc,1,[x;zeros(floor(length(rrc)/2),1)]);
y=y(floor(length(rrc)/2)+1:end);
fprintf('最佳采样点信号平均值:%.4f\n \n',rms(y(1:sps:end)));
snr = 20*log10(rms(y(1:10:end))/rms(noise_filter(1:sps:end)));
fprintf('过采样倍数:%3d; rx snr = %.2f dB\n',sps,snr);

运行结果为:


信道SNR:0 dB

信道:噪声平均值:0.9964; 信号平均值:0.9996

最佳采样点噪声平均值:3.2876
 
最佳采样点信号平均值:9.9935
 
过采样倍数: 10; rx snr = 9.66 dB

在实际通信系统中,过采样增益不存在,代码仿真中看到了过采样增益,原因在于对于不同过采样倍数,对应的ADC采样率不同,而代码中产生了同样的噪声功率,导致噪声谱密度降低了,看起来带来了增益。
实际上,接收机底噪谱密度为常数,与噪声温度T和接收机带宽有关,计算公式为$$P_n = 10lg (KTW) + NF$$
\(k_B\)为玻尔兹曼常数,T为噪声温度,NF为噪声系数。
噪声谱密度为$$N_0=10lg (KTW) + NF - 10lg(W) = 10lg (KT) + NF$$
下面的代码模拟了真实的ADC情况,运行后可以看到,改变Fs,会影响接收机接收到的噪声功率,但在成形滤波器后,会滤除掉带外噪声,不会影响接收端的信噪比。

fprintf('\n');
x=randi([0 3],1000,1);
x=qammod(x,4,'UnitAveragePower',1);
Fs=5e6;%采样率 Hz
Rs=5e5;%符号速率 symbol/s
sps=Fs/Rs;
beta = 0.22;
rrc=rcosdesign(beta,10,sps,"sqrt");
rrc=sqrt(sps)*rrc;
x=upsample(x,sps);
x=filter(rrc,1,[x;zeros(floor(length(rrc)/2),1)]);
x=x(floor(length(rrc)/2)+1:end);
txPowerdB = -90;%dBm
txPower = 10^(txPowerdB/10);
x=sqrt(txPower)*x;
NF=4;%dB
N0=-173.9+NF;%dBm/Hz
Pn=10^(N0/10)*Fs;
noise = (randn(size(x))+1i*randn(size(x)))*sqrt(0.5)*sqrt(Pn);
channel_snr = 20*log10(rms(x)/rms(noise));
fprintf('信道:噪声平均功率:%.2f dBm; 信号平均功率:%.2f dBm\n\n',20*log10(rms(noise)),20*log10(rms(x)));
fprintf('信道SNR:%.2f dB\n\n',channel_snr);
noise_filter = filter(rrc,1,[noise;zeros(floor(length(rrc)/2),1)]);
noise_filter=noise_filter(floor(length(rrc)/2)+1:end);
fprintf('最佳采样点噪声平均功率:%.2f dBm\n \n',20*log10(rms(noise_filter(1:sps:end))));
y = filter(rrc,1,[x;zeros(floor(length(rrc)/2),1)]);
y=y(floor(length(rrc)/2)+1:end);
fprintf('最佳采样点信号平均功率:%.2f dBm\n \n',20*log10(rms(y(1:sps:end))));
snr = 20*log10(rms(y(1:sps:end))/rms(noise_filter(1:sps:end)));
fprintf('过采样倍数: %3d; rx snr = %.2f dBm\n',sps,snr);



%%
% 对感兴趣的信号时间区域进行索引

yy=noise+x;
x_ROI = yy(:);
sampleRate = Fs; % Hz
leakage = 1;
% 计算频谱估计值
% 不带输出参数运行该函数调用以绘制结果
[Px_ROI, Fx_ROI] = pspectrum(x_ROI,sampleRate, ...
    'FrequencyLimits',[-sampleRate/2 sampleRate/2], ...
    'Leakage',leakage);
plot(Fx_ROI/1e6,10*log10(Px_ROI))
xlabel('Frequency(MHz)');
ylabel('dB')
head = sprintf('Fs = %d MHz',Fs/1e6);
title(head)

修改\(Fs\)\(2e6\)\(5e6\),绘制对应的频谱图,结果可以看到如下图。
image
代码输出结果为

% 2M
>> rrc_snr_test

信道:噪声平均功率:-107.03 dBm; 信号平均功率:-90.00 dBm

信道SNR:17.02 dB

最佳采样点噪声平均功率:-101.04 dBm
 
最佳采样点信号平均功率:-77.96 dBm
 
过采样倍数:   4; rx snr = 23.08 dBm
%5M
>> rrc_snr_test

信道:噪声平均功率:-102.83 dBm; 信号平均功率:-90.00 dBm

信道SNR:12.83 dB

最佳采样点噪声平均功率:-92.57 dBm
 
最佳采样点信号平均功率:-70.01 dBm
 
过采样倍数:  10; rx snr = 22.56 dBm
posted @ 2025-01-18 22:44  蕉太羊  阅读(131)  评论(0)    收藏  举报