1、一般方法 a、利用Matlab的函数awgn 例如正弦波加入高斯白噪声,SNR=10dB。程序:t=[1:0.1:pi];s=sin(t);r=awgn(s,10,'measured'); b、利用Matlab的函数randn 程序:SNR=10;t=[1:0.1:pi];s=sin(t);s_power=(norm(s)^2)/length(s);n_power=s_power/(10^(SNR/10));noise=sqrt(n_power)*randn(length(s),1);r=s+noise; 2、问题 a和b两段程序效果是一样的,b来自普罗克斯的书《现代通信系统使用matlab》(他的《数字通信》大大有名,该书可以从本站中下到)。问题在于s_power的计算和信号采样有关,极端的例子:sin(t)只采两点0和pi,这时计算信号功率为零,若采3点就不为零。当然采样点趋于无穷时才准确,即SNR的确为10dB,但实际仿真不可能做到。到底如何做呢? 3、一些想法 上述问题是在自己仿真中发现的,也有一些想法来解决。比如数字信号用Eb/N0,先加噪后采样等,但是在多种信号系统比较时等情况下还会遇到很多问题。实际上这些问题往往被忽视,我看过一些文献如比较2psk和4psk,用SNR,明显的相同的SNR下,4psk的噪声大,同样的信道怎么会有不同的噪声,条件不一样比较的结果=?显然误用Eb/N0。 4、另外 第一次发提问贴,感谢版主指正,也希望大家互相交流。特别是awgn还有许多控制参数,不同情况选用也不同,请大家谈谈。 |