matlab - matlab向信号添加噪声的正确方法

下面的代码显示了我如何生成和添加噪音的方式。


SNR = [-10:5:30]; %in Db


snr = 10. ^ (0.1. * SNR);



for I = 1:length(snr)


 noise = 1/sqrt(2) * (randn(1, N) + 1i * randn(1, N));


 u = y + noise. * snr(I);


end



时间:

MATLAB或者 Octave (通信工具箱中) 有 awgn函数,可以添加( 高斯) 噪声,下面是代码( Octave 函数)的相关部分:


 if (meas == 1) % <-- if using signal power to determine appropriate noise power


 p = sum( abs( x(:)). ^ 2)/length(x(:));


 if (strcmp(type,"dB"))


 p = 10 * log10(p);


 endif


 endif



 if (strcmp(type,"linear"))


 np = p/snr;


 else % <-- in dB


 np = p - snr;


 endif



 y = x + wgn (m, n, np, 1, seed, type, out);




 y = awgn (x, snr, 'measured')



对于MATLAB的例子,我建议阅读文档,它解释了如何在不同的场景中使用 awgn 函数。 请注意,Octave 和MATLAB中的实现并不相同,噪声功率的计算应该相同,但可以能有不同的方法。

下面是 wgn ( 由 awgn 调用)的相关部分:


 if (strcmp(type,"dBW"))


 np = 10 ^ (p/10);


 elseif (strcmp(type,"dBm"))


 np = 10 ^((p - 30)/10);


 elseif (strcmp(type,"linear"))


 np = p;


 endif



 if(!isempty(seed))


 randn("state",seed);


 endif



 if (strcmp(out,"complex"))


 y = (sqrt(imp*np/2))*(randn(m,n)+1i*randn(m,n)); % imp=1 assuming impedance is 1 Ohm


 else


 y = (sqrt(imp*np))*randn(m,n);


 endif



如果要检查噪声( np )的功率,awgnawg 函数将假定以下关系:


 np = var(y,1); % linear scale


 np = 10*log10(np); % in dB 



这里大部分的答案都忘记了信噪比是以分贝为单位。 因此,不会遇到'division by 0 ' 的错误,因为你应该除以10 ^(targetSNR/10),对于实际的targetSNR,它永远不会为负,也不为零。

你可以使用 randn() 生成所需长度的'awgnnoise'噪声矢量。 然后,根据指定的信噪比值,计算原始信号的功率和噪声矢量'awgnnoise'的功率。 获得噪声矢量的适当幅度缩放因子。

以下代码是一个以白噪声信号的例子。


function out_signal = addAWGN(signal, targetSNR)


sigLength = length(signal); % length


awgnNoise = randn(size(signal)); % orignal noise


pwrSig = sqrt(sum(signal.^2))/sigLength; % signal power


pwrNoise = sqrt(sum(awgnNoise.^2))/sigLength; % noise power



scaleFactor = (pwrSig/pwrNoise)/targetSNR; %find scale factor


awgnNoise = scaleFactor*awgnNoise; 


out_signal = signal + awgnNoise; % add noise



当目标信噪比为 0时,表示它是纯噪声。


function out_signal = addAWGN(signal, targetSNR)


sigLength = length(signal); % length


awgnNoise = randn(size(signal)); % orignal noise


pwrSig = sqrt(sum(signal.^2))/sigLength; % signal power


pwrNoise = sqrt(sum(awgnNoise.^2))/sigLength; % noise power


if targetSNR ~= 0


 scaleFactor = (pwrSig/pwrNoise)/targetSNR; %find scale factor


 awgnNoise = scaleFactor*awgnNoise; 


 out_signal = signal + awgnNoise; % add noise


else


 out_signal = awgnNoise; % noise only


end



...