问题描述
信号识别实验需要仿真不同SNR下的分类器性能,然而基于USRP、HackRF等设备实采信号难以得到需要的SNR,因此多数文章通过加入高斯白噪声及其功率来获得要求的SNR。
常见信噪比估计有时域和频域两类。通常,基于时域的估计方法需要很强的先验条件,比如需要知道信号的功率以及噪声的功率。然而,这种先验对于实采信号来说难以获得,为此本文采用基于频域(功率谱)的SNR估计方法。
问题建模
本文采用基于功率谱的SNR估计方法,该方法介绍如下:
实采信号表示为:y(t)=s(t)+n(t)y(t)=s(t)+n(t)y(t)=s(t)+n(t)
信号的功率谱密度表示为:Y(f)Y(f)Y(f)
则,有用信号带宽内的总功率可以表示为:P=∫fLfHY(f)dfP=\int_{f_L}^{f_H}{Y(f)df}P=∫fLfHY(f)df
其中,fLf_LfL和fHf_HfH分别表示有用信号带宽的起止频率。
同理,采样带宽内总功率可以表示为:Pall=∫f1f2Y(f)dfP_{all}=\int_{f_1}^{f_2}{Y(f)df}Pall=∫f1f2Y(f)df
其中,f1f_1f1和f2f_2f2表示采样的起止频率。
通过平均可得估计的噪声谱密度:n0=Pall−PB−Bwn_0=\frac{P_{all}-P}{B-B_w}n0=B−BwPall−P
其中,B=F1−F2B=F_{1}-F_{2}B=F1−F2表示采样带宽,BwB_wBw表示有用信号带宽。
为计算有用信号的功率,需要减去信道内的噪声功率N=n0∗BwN=n_0*B_wN=n0∗Bw
由此,估计SNR可以表示为:SNRˉ=10∗lg(P−Nn0∗B)\bar{SNR}=10*lg(\frac{P-N}{n_0*B})SNRˉ=10∗lg(n0∗BP−N)
至此,可以通过调整n(t)n(t)n(t)的功率(该功率与SNR成比例关系),间接获得特定的SNR。
matlab仿真代码
clear all
rng default
%加载USRP采取的复数信号
sigFile=load('D:\project\DataSet\data.mat');
signal=sigFile.data;
x=signal;
%加入高斯白噪声
x=x+0.001*randn(1,numel(x));
%计算谱密度
w = kaiser(numel(x),38);
Fs=1e8;
[Pxx, F] = periodogram(x,w,numel(x),Fs);
%调用matlab自由snr函数求解SNR,但结果不对,可能是因为存在噪声谱密度大于有用信号谱密度
SNR = snr(Pxx,F,'psd')
rbw = enbw(w,Fs);
%绘制时域、PSD、视频图谱以及频域四种图
subplot(4,1,1)
x_ax=(1:numel(x));
plot(x_ax,x)
subplot(4,1,2)
pxx=pwelch(x);
pwelch(x)
%x_a=(1:numel(pxx));
pxx=10*log10(pxx);
%plot(x_a,pxx)
subplot(4,1,3)
spectrogram(x)
subplot(4,1,4)
snr(Pxx,F,'psd')
% 手工计算SNR
sigLen=numel(Pxx);
f1=1;
f2=sigLen;
fL=0.31*sigLen;
fH=0.5*sigLen;
B=sigLen; %总带宽
Bw=fH-fL; %信号带宽
Psig=sum(Pxx(fL:fH)) %信号信道内总功率
PsigMean=mean(Pxx(fL:fH))
Pall=sum(Pxx) %总功率 信号+噪声
PallMean=mean(Pxx)
n0=(Pall-Psig)/(B-Bw) %噪声平均功率
N=n0*Bw %信号带宽内噪声功率
SNRbar=10*log10((Psig-N)/(n0*B)) %估计的信噪比
仿真图如下图所示
子图3中,黄色部分为有用信号,带宽20M,采样带宽100M(实际采样率为200M,满足奈奎斯特采样定理)
此外,仿真显示,增加的高斯白噪声的功率与SNR成反比,如下图所示:
横坐标为代码中randn的系数,纵坐标为估计的SNR。
小结
在实验中,许多情况下需要得到性能随着SNR改变的图。然而,实际采集的数据难以满足特定的SNR。一种解决思路是控制接收机与信号源的距离来获得,但这样操作的空难较大。另外一种方法就是通过添加噪声,通过控制噪声功率来仿真获得特定SNR下的信号数据。