在某次做项目仿真时,产生了一个想法,我算了一下在所设定信噪比下,信号和噪声的信噪比是不是和设定值一致,惊奇的发现,设定值和计算值差了3dB,正好2022.11.01做论文仿真,再次验证信噪比时,出了点差错,次日,趁程序跑大循环,把之前笔记本上的记录搬到博客上,以此留念。

无论是采用何种阵列、何种算法,经典的干涉仪测向算法也好,子空间类算法、稀疏重构类算法也罢,均匀阵列、稀疏阵列、MIMO等等各种阵列,仿真实验中,信噪比是影响算法性能的重要因素。本博客就不同信号产生模式,讨论不同信号产生方式中信噪比的使用,为后学者做参考。

信噪比的计算方式

对于有限长的信号,若均值为0,其方差即是功率,因此在程序中,若信号噪声的均值为0,只需要验证方差的比值即可得到信噪比
总功率=均值*均值+方差

不同分布的方差

正态分布1

S = sqrt(a)*randn(1,10000)+b 方差为a,均值为b

正态分布2

S = sqrt(-2* m*m *lnU1)cos(2 pi U2)+n 方差为m *m,均值为n
U1和U2为0到1的均匀分布

DOA估计中信号的产生

在上篇博客中,对DOA估计中信号的几种产生方式进行简要的讨论,本博客再次简要重述和补充

方式1

首先给出噪声部分程序

1
2
3
4
5
6
7
8
9
10
snr = 10.^(SNR/20);  
for m=1:sensorNum
for n=1:snapshots
p3=rand(1,1);
p4=rand(1,1);
wr(m,n)=sqrt(-2*log(p3))*cos(2*pi*p4); %根据正态分布2,噪声实部功率为1,虚部功率为1,总功率为2
wi(m,n)=sqrt(-2*log(p3))*sin(2*pi*p4);
NoiseMatrix(m,n)=wr(m,n)+1j*wi(m,n);
end
end

信号的程序在噪声幅度上加上信噪比

1
2
3
4
5
6
7
8
9
for m=1:1  %注意此处m仅到1
for n=1:snapshots
p1=rand(1,1);
p2=rand(1,1);
sr(m,n)=snr*sqrt(-2*log(p1))*cos(2*pi*p2); %根据正态分布2,信号实部功率为snr*snr,虚部功率为snr*snr,总功率为2*snr*snr
si(m,n)=snr*sqrt(-2*log(p1))*sin(2*pi*p2);
SourceMatrix(m,n)=sr(m,n)+1j*si(m,n); %signal
end
end

信噪比计算结果为SNR = 10log(2snr*snr/2)
snr = 10.^(SNR/20)
计算结果与设定值一致

方式2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Amp = 10.^(SNR/20);  
S = [Amp*exp(1j*(2*pi*(fcDown+1*10^6)*((1:kp)/(Fs))+Jitter(1,:)))]; 信号功率为Amp*Amp
for m=1:SensorNum
for n=1:NoiseLength
p1=rand(1,1);
p2=rand(1,1);
wr(m,n)=sqrt(-2*0.5*log(p1))*cos(2*pi*p2); %实部功率0.5
wi(m,n)=sqrt(-2*0.5*log(p1))*sin(2*pi*p2); %实部功率0.5
w(m,n)=wr(m,n)+1j*wi(m,n);
end
end %噪声部分
信噪比计算结果为SNR = 10*log(Amp*Amp)
Amp = 10.^(SNR/20)
计算结果与设定值一致

方式3

awgn函数,产生加性高斯白噪声

X = awgn(A*S,snr,’measured’)

其中snr代表的是信号与噪声的功率之比
使用这个函数需要注意,加measured,表示噪声功率是根据信号的功率计算的,若不加measured,噪声的功率计算时,假定信号功率为1
例如:

awgn(100ones(1,1000),10,’measured’) 信号功率为10000,噪声功率为998.98,信噪比10dB
awgn(10
ones(1,1000),10) 信号功率为100,噪声功率为0.1,噪声功率假定信号功率为1,10dB算出噪声功率为0.1
很明显,第二种方式产生的噪声的信噪比与我们的期望值差距甚远

方式3不太建议使用,在标量阵列中这样产生一定信噪比的信号貌似没有问题,但在矢量阵列中,这样方式产生的信噪比是AS和N的比值,但信噪比的定义是S和N的比值,标量阵列的A 的模一般为1,但矢量阵列A的模还与信号和天线的极化形式有关,这样产生方式在极化不匹配情况下影响较大

方式4

Noise = sqrt(0.5)randn(SN,Snap)+1jsqrt(0.5)randn(SN,Snap)
Signal = sqrt(0.5
snr)randn(SN,Snap)+1jsqrt(0.5snr)randn(SN,Snap)
snr = 10^(SNR/10)为功率之比

根据正态分布1,噪声实部功率为0.5,虚部功率0.5,信号实部功率0.5*snr,虚部功率0.5 *snr
信噪比计算结果

SNR = 10*log(snr)
snr = 10^(SNR/10)
计算结果与设定值一致

信噪比计算程序

Data_Power=sum(abs(S1.^2))/length(S1);
Data_Power2=sum(S1.*conj(S1))/length(S1);
Data_Power1=sum(abs(w(1,:)).^2)/length(w);
Pow = 10*log10(Data_Power/Data_Power1); 

总结

3dB,仅仅是信噪比是功率比值和幅度比值的微小差别
而且虽然说信噪比3dB的问题很小,甚至如果信噪比产生方式相同,在对比算法性能时,信噪比都相差3dB,问题也不大。但深究内部原因,还是信号产生部分存在缺陷,排除信噪3
dB这颗“雷”,总能避免掉一些未知的问题。

参考文献

后记

思考一下,为什么差的是3dB呢,而不是4dB或5dB?3dB在别的地方是不是还有其他的含义。
还记得,在本科上《雷达原理》这门实验课,Zhangchunjie老师,提出了这个简单的问题,3dB到底有什么含义,在不同的应用领域,3dB带宽,3dB波束宽度等等