y=awgn(x,snr,px_dBW)
给信号x添加噪声功率为某个值的高斯白噪声。
snr为信噪比,单位dB。
px_dBW为信号x的指定功率(注意,是指定功率,而不是x本身的功率),单位dBW。
缺省时为0dBW,即:
awgn(x,snr)=awgn(x,snr,0)
‘measured’为根据x自动计算出来的本身功率,即用x本身的功率当作指定功率:
px_W= norm(x)^2/length(x)(信号的功率计算请参见本人的另一边文章)
px_dBW=10log10(px_W/1W)
有了信噪比snr和信号的指定功率px_dBW,就可以计算出来要添加的高斯白噪声的功率了,就是开篇的某个值。
有了高斯白噪声的功率pn_W,那高斯白噪声序列n本身也可以得到了。
matlab中的randn()函数产生功率为1的高斯分布,则功率为pn_W的高斯分布为
验证:
对两边求功率(平方运算),左边为构造序列的功率,右边为pn_W乘以randn()序列的功率。上面已经说过,randn()序列的功率为1,所以该构造序列的功率就是pn_W,这个构造序列n就是要叠加到原始信号上的高斯白噪声。
matlab代码如下:
%% 信号xt=0:0.01:10;x=sin(2*pi*t);subplot(3,2,[1 2]);plot(t,x);title('x');%% 对比1% 信噪比和信号指定功率snr=20;px_dBW=0;% 调用awgn函数直接计算y1=awgn(x,snr,px_dBW);subplot(3,2,3);plot(t,y1);title(['awgn(x,',num2str(snr),',',num2str(px_dBW),')']);% 调用randn函数产生噪声序列再叠加pn_W=10^((px_dBW-snr)/10);n=sqrt(pn_W)*randn(1,length(x));y2=x+n;subplot(3,2,4);plot(t,y2);title('信号叠加噪声');%% 对比2% 信噪比和信号指定功率snr=10;px_dBW=10;% 调用awgn函数直接计算y1=awgn(x,snr,px_dBW);subplot(3,2,5);plot(t,y1);title(['awgn(x,',num2str(snr),',',num2str(px_dBW),')']);% 调用randn函数产生噪声序列再叠加pn_W=10^((px_dBW-snr)/10);n=sqrt(pn_W)*randn(1,length(x));y2=x+n;subplot(3,2,6);plot(t,y2);title('信号叠加噪声');
图形:
可以看出,两种方法直接调用awgn和先用randn得到噪声序列再叠加对信号的畸变程度相同。
并且符合公式结果:
px_dBW越大/snr越小,则噪声的功率越大,信号的畸变越明显。