在matlab中无论是wgn还是awgn函数,实质都是由randn函数产生的噪声。即:wgn函数中调用了randn函数,而awgn函数中调用了wgn函数。根据awgn的实现代码可以知道”向已知信号添加某个信噪比(SNR)的高斯白噪声“,即:awgn(x,snr,’measured’,'linear’),命令的作用是对原信号x添加信噪比(比值)为SNR的噪声,在添加之前先估计信号x的强度。这里涉及三个问题:在awgn这个函数中,SNR是如何计算的?什么是信号的强度?awgn函数具体是如何添加噪声的?1.1awgn添加白噪声原理SNR就是信号的强度除以噪声的强度(或者信号功率与噪声功率之比),所以,首先来讲讲信号的强度。其实信号的强度指的就是信号的能量,在连续的情形就是对x平方后求积分,而在离散的情形自然是求和代替积分了。那么如何添加确定值的信噪比噪声呢?那么根据信噪比公式来推导:SNR=10log(signalPower/noisePower)信噪比确定,即SNR是已知的。由于无噪声信号signal是已知的,所以它的信号功率是已知的。signalPower=sum(signal.^2)/length(signal)所以可以求得noisePowernoisePower=signalPower/(10^(SNR/10))然后根据已知的signal构造相应的噪声noise先生成一个与signal相同长度的随机信号。noise0=randn(size(signal));noise1=noise0-mean(noise0);%减去均值将noise1的按比例进行变换noisenoise1=sqrt(noisePower)std(noise0)根据方差和标准差公式,可以知道std(noise0)就是noise0的标准差,这个很好求取。noisePower是noise的噪声强度,根据上面知道,noise是有noise1按比例变换来的。由于noise1是由noise0减去均值获得。因此,noise1的功率就是noise0的方差。即噪声强度对应的是方差,属于同一个概念。事实上,一个数组减去均值后,其方差和标准差与该数组减去2个均值或者多个常数的方差和标准差相同。即std(noise0-mean(noise0))=std(noise0-2*mean(noise0))所以噪声强度noisePower对应的是noise未减去均值后的方差,因此noise1未减去均值的原始噪声为noise0.所以错误!未找到引用源。noise=sqrt(noisePower)std(noise0)noise1其中std(noise0)=std(noise1).1.2例子验证awgn生成信号和噪声%-----------------constructsimulationsignalfs=5000;f=10;k=1024;n=1:k;X=5*sin(2*pi*f/fs*n);%原始信号%y1=y0+2*(rand(1,k)-0.5);%噪声信号%------------------------------denoiseY=awgn(X,10,'measured');%加入信噪比为10db的噪声,加入前预估信号的功率(强度)sigPower=sum(abs(X).^2)/length(X)%求出信号功率noisePower=sum(abs(Y-X).^2)/length(Y-X)%求出噪声功率SNR=10*log10(sigPower/noisePower)%由信噪比定义求出信噪比,单位为dbsigPower=12.2256noisePower=1.2742SNR=9.8204【大小跟10db差不多】020040060080010001200-8-6-4-202468SinusoidalSignalMixedwithNoiseDatapointnAmplitudeA错误!未找到引用源。自定义的噪声函数function[Y,NOISE]=noisegen(X,SNR)%把白噪声叠加到信号上去:%noisegenaddwhiteGaussiannoisetoasignal.%[Y,NOISE]=NOISEGEN(X,SNR)addswhiteGaussianNOISEtoX.TheSNRisindB.NOISE0=randn(size(X));NOISE=NOISE0-mean(NOISE0);%减去均值后,其噪声功率相当于原来的方差sigPower=1/length(X)*sum(X.*X);%求出信号功率noise_variance=sigPower/(10^(SNR/10));NOISE=sqrt(noise_variance)/std(NOISE0)*NOISE;Y=X+NOISE;noisePower=1/length(NOISE)*sum(NOISE.*NOISE);%求出噪声功率SNR=10*log10(sigPower/noisePower)%由信噪比定义求出信噪比,单位为dbfigureplot(Y,'m');holdonplot(X,'k')%title('SinusoidalSignalMixedwithNoise')%xlabel('Datapointn')%ylabel('AmplitudeA')调用上文中的X信号,也是生成10db的噪声noisegen(X,10);SNR=10.0042【大小跟10db差不多】可见噪声awgn的原理就是如此。020040060080010001200-8-6-4-202468