给信号添加指定信噪比的带限白噪声

9 篇文章 5 订阅
5 篇文章 5 订阅

信号处理基础练习内容


1、生成确定信号:中心频率为800Hz的正弦信号和带宽为1KHz的线性调频信号,采样频率为40KHz。
2、生成随机信号:生成带限白噪声,频率范围为500-20KHz范围。
3、调整噪声,生成谱级信噪比分别为10dB,0dB,-10dB的信号与噪声叠加。

基础知识


信噪比(Signal Noise Rate(SNR))是通信系统或电路中某点上信号平均功率与噪声平均功率之比,该比值一般用分贝表示,信噪比越高表示噪声所占比重越小,信号质量越好。
信噪比的计算方法如下:
在这里插入图片描述
其中Ps和Pn分别代表信号和噪声的功率。同样的,我们也可以使用能量来表示信噪比:
在这里插入图片描述
其中E(s)和E(n)分别表示信号和噪声的能量。
在信号处理中,能量的表达式为(此处经评论指正为一处笔误,应当为信号功率表达式,公式左侧为Ps):
在这里插入图片描述
对于零均值的高斯白噪声,它的方差就是它的均值。不幸的是,这一次我们的带限白噪声,不是零均值的,所以我们还是需要使用信号的能量计算公式。
为了更好地衡量带限白噪声下的信噪比,我们使用谱级信噪比:信号的功率PS与1Hz带宽内的平均噪声功率NO的比值。其中NO:
在这里插入图片描述
其中,B为噪声带宽。

MATLAB仿真

  1. 确定信号

首先我们生成确定信号。有了采样频率,我们需要设定采样点数,也是信号画图的点数N:N=2^n,信号点数一般取2的整数次方。

fo=800;       %中心频率800Hz
fs=40e3;      %采样频率40KHz
N=4096;       %采样点数
T=N/fs;       %信号长度,单位为s
t=(0:N-1)/fs; %信号时间序列
s1=sin(2*pi*fo*t);%正弦信号
figure(1)
subplot(221)
plot(t,s1);title('sin(2*pi*fo*t),fo=800Hz,fs=40KHz');
xlabel('时间/s');ylabel('幅度');%单频信号时域图

使用sin()函数可以生成正弦信号,subplot(221)可以生成一个2*2的图阵,本图放在第一个。

线性调频信号是频率线性变化的信号,信号频率变化斜率为常数。
在这里插入图片描述
由于这是复信号模式,也可以只写它的实部。其中,K是信号频率变化斜率:
在这里插入图片描述

B=1e3;%带宽1KHz
k=B/T;%线性调频信号调频斜率
s2=exp(1j*(2*pi*fo*t+pi*k*t.^2));%线性调频信号从800Hz增加到1800Hz
subplot(223)
plot(t,real(s2));title('exp(j*(2*pi*fo*t+pi*k*t.^2)),fo=800Hz,fs=40KHz');
xlabel('时间/s');ylabel('幅度');%线性调频信号

对二者进行频谱分析,频谱分析使用FFT函数进行快速傅里叶变换。注意,FFT函数变换后,其幅值使原来的N/2倍。运行结果如下:
在这里插入图片描述

  1. 随机信号
    为了便于观察信噪比,我设置随机信号长度为确定信号长度的3倍,使用normrnd函数生成指定均值方差的高斯随机序列:
N1=3*N;%噪声要较信号长,适合观察
mu=2;sigma=sqrt(2.5);%均值为2,方差为2.5
n=normrnd(mu,sigma,[1,N1]);%生成随机序列

带限白噪声是指在频域上限制其频带宽度。生成带限白噪声的方法有很多,可以使用时域加窗,比如海明窗、汉宁窗等,设计滤波器即可。这里我使用的是上课时学到的另一位同学的思路,他使用的是在频域直接加上矩形窗进行截断,这样生成的带限白噪声在频域十分简洁漂亮,便于观察。
我们直接将前面生成的白噪声转换到频域,对其加一个矩形窗,使其在500-2000Hz范围的幅值为1,其余为0.

fft_n1=[zeros(1,fix(N1/fs*fl)),fft_n(fix(N1/fs*fl):fix(N1/fs*fh)),zeros(1,fix(N1-N1/fs*fh))];%加矩形窗截断

其中,fix为取整函数,这是为了满足该向量赋值需要整数点。fft_n为我们转换到频域的噪声。fl,fh分别为噪声下限截止频率和上限截止频率。
在这里插入图片描述这是运行结果,可以看出,对噪声进行带限处理后,明显噪声时域波形变得稀疏,这是因为其中500Hz以下和2000Hz以上的频率分量被滤掉了。

  1. 规定谱级信噪比下的信号加噪声
    前面已经讲过信噪比和谱级信噪比的概念,所以这里我们直接进行公式推导:
    在这里插入图片描述
    由此可以推出所需要的噪声能量:
    在这里插入图片描述
    又因为采样后的信号是离散信号,使用sum()求和代替积分,所以信噪比和噪声能量为:
E_n1=sum((real(n2)).^2);%噪声的能量
SNR1=10;
SNR2=0;
SNR3=-10;%三个谱级信噪比

求得所需要的噪声能量,又求得现在的噪声能量,对噪声幅值进行变化即可更改信号能量,得到所需信噪比:

s1_in=[zeros(1,N),s1(1:N),zeros(1,N)];%将信号与噪声统一长度
A_s1_SNR1=sqrt(P_s1/(10^(SNR1/10))*B_n);
n3_SNR1_s1=n2/sqrt(E_n1)*A_s1_SNR1;%与正弦信号达成谱级信噪比SNR1的噪声
s1_SNR1_out=s1_in+n3_SNR1_s1;%正弦信号加入噪声后的输出信号

运行结果为:
在这里插入图片描述在这里插入图片描述

如果内容有什么问题,欢迎大家指导我,matlab新手,状况百出hhhh

  • 11
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孤独的傅里叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值