首先需要明确SNR、EbN0之间的转换,通过EbN0得到SNR。这个可以看我另一篇文章:
链接: link
拿到SNR之后可以开始下一步,
首先明确:
MATLAB中对调制后的数据求模的平方再取平均求得的是信号的功率,公式如下:
平均功率 P = (1/N) * Σ|s(n)|^2 ,
其中 N 是采样点数量,s(n) 是信号的离散时间序列。****
为什么该式得到的是功率而不是能量呢,因为这是一个采样点单位时间的能量求和,所以不用再除以Tb啥的了,反而是能量应该用这个P乘以Tb去获得比特能量Eb。
同时:
**高斯白噪声的能量方差(σ^2)**就是噪声功率。在高斯白噪声模型中,噪声是一个随机过程,其每个样本都服从独立同分布的高斯分布。噪声的方差(即能量的方差)可以表示为: σ^2 = E[(n(t) - μ)^2],其中 n(t) 是噪声信号,μ 是噪声的均值,E[] 表示期望操作。 对于高斯白噪声,通常假设噪声均值为零(μ = 0)。因此,噪声的方差就是噪声信号的平均功率。
获得了SNR,首先SNR = S/N,(dB到实数的转换这里就略去了)
就可以得到N,那么N = (S/SNR);
那么在matlab中如果想要加入一个EbN0(dB)这么大的噪声时,
这里默认SNR已经获得了
SNR = 5;#举例
signal = randi([0 1],1,10000);
#这一步之间可以加上编码以及调制等等过程
S = mean(signal.^2); #信号功率
N = S/SNR;#噪声功率
# 如果是实数过程
signal_noise = signal + sqrt(N)*randn(1,length(signal ));#加噪过程
# 如果是复数过程
signal_noise = signal + sqrt(N/2)*randn(1,length(signal ))+ sqrt(-1)*sqrt(N/2)*randn(1,length(signal ));#加噪过程
这样就获得了一个EbN0,或者说为信噪比为SNR的加噪信号,当然直接用awgn得到的效果是一样的,但是有些时候不是有限制不让用comm嘛,主要是要理解这两个之间的关系,才能得心应手。