首先,我认为了解我们拥有 BPSK 系统的东西是很重要的:
BPSK 系统的星座是 [-A , A] 在这种情况下 [-1,1] SNR 将在 0 db 到 40 db 之间变化
我认为答案就在这个函数中:
y = awgn( ... ); 来自 matlab 中心:
y = awgn(x,snr) 将高斯白噪声添加到矢量信号 x。标量 snr 指定每个样本的信噪比,以 dB 为单位。如果 x 是复数,则 awgn 会添加复数噪声。此语法假定 x 的功率为 0 dBW。
y = awgn(x,snr,sigpower) 与上面的语法相同,只是 sigpower 是 x 的功率,单位为 dBW。
y = awgn(x,snr,'measured') 与 y = awgn(x,snr) 相同,只是 awgn 在添加噪声之前测量 x 的幂。
你使用 y = awgn(x,snr,'measured'),所以你不用担心,因为 matlab 为你携带了所有东西,测量信号的功率,然后用获得所需的方差应用到通道噪声SNR 比。
让我们看看这怎么会发生
SNRbit = Eb/No = A^2/No = dmin^2 /4N0
the constelation [A,-A] in this case is [-1,1] so
10 log10(A^2/N0) = 10 log10(1/N0) = SNRbitdb
SNRlineal = 10^(0.1*SNRdb)
所以这样:
noise_var=0.5/(EbN0_lin); % s^2=N0/2
信号会是这样的
y = s + sqrt(noise_var)*randn(1,size);
所以在你的情况下,我会像你一样生成信号:
>> N = 100; %number of samples
>> s = 2*round(rand(N,1))-1; %bpsk modulation
然后准备一个 SNR 从 0 到 40 db
>> SNR_DB = 0:1:40;
之后计算所有可能的信号:
>> y = zeros(100,length(SNR_DB));
>> for i = 1:41
y(:,i) = awgn(s,SNR_DB(i),'measured');
end
此时,查看信号的最佳方法是使用这样的星座图:
>> scatterplot(y(:,1));
>> scatterplot(y(:,41));
你可以看到一个坏信号 0 db 噪声等于信号的功率,一个非常好的信号信号大于 40 DB 噪声。Eb/No = 功率信号-功率噪声分贝,所以0表示功率噪声等于信号功率,40分贝表示信号功率大于噪声功率
然后为您绘制计算mse,matlab为此提供了一个功能
err = immse(X,Y) 说明
例子
err = immse(X,Y) 计算数组 X 和 Y 之间的均方误差 (MSE)。X 和 Y 可以是任意维度的数组,但必须具有相同的大小和类别。
所以有了这个:
>> for i = 1:41
err(i) = immse(s,y(:,i));
end
>> stem(SNR_DB,err)
对于绘图,由于我们在 db 中工作,因此使用对数轴应该更好