Matlab 生成一定信噪比的信号

文章目录

  • [【 1. 信噪比 】](#【 1. 信噪比 】)
  • [【 2. 功率归一化 】](#【 2. 功率归一化 】)
    • [2.1 实信号+实噪声](#2.1 实信号+实噪声)
    • [2.2 实信号+复噪声](#2.2 实信号+复噪声)
  • [【 3. 能量归一化 】](#【 3. 能量归一化 】)
    • [3.1 实信号+实噪声](#3.1 实信号+实噪声)
    • [3.2 实信号+复噪声](#3.2 实信号+复噪声)
  • [【 4. 小结 】](#【 4. 小结 】)

【 1. 信噪比 】

  • 信噪比公式 1 : S N R = 10 ∗ l o g 10 P s P n 信噪比公式1:SNR=10*log_{10}\frac{P_s}{P_n} 信噪比公式1:SNR=10∗log10PnPs其中, P s P_s Ps 和 P n P_n Pn 分别指 信号的平均功率、噪声的平均功率。
  • 当信号和噪声的长度相等为N时,根据平均功率的公式 P s = E s / N P_s=E_s/N Ps=Es/N 以及 P n = E n / N P_n=E_n/N Pn=En/N,上式可化为: 信噪比公式 2 : S N R = 10 ∗ l o g 10 E s E n 信噪比公式2:SNR=10*log_{10}\frac{E_s}{E_n} 信噪比公式2:SNR=10∗log10EnEs其中, E s E_s Es 和 E n E_n En 分别指 信号的平均功率、噪声的平均功率。
  • 因此,可通过两种方式生成 一定信噪比的信号。

【 2. 功率归一化 】

平均功率(均方值) = 均值(直流功率) + 方差(交流功率) 平均功率(均方值)=均值(直流功率)+方差(交流功率) 平均功率(均方值)=均值(直流功率)+方差(交流功率)

  • 一般令信号的均值为0,方差为1,即平均功率为1。

2.1 实信号+实噪声

cpp 复制代码
clc;        % 清空命令行
clear;      % 清空变量
close all;  % 关闭所有窗口

%% [1、参数设置]
N=1e6;                     % 数据点数
SNR_dB=20;                 % 信噪比(dB形式)
SNR_Power=10.^(SNR_dB/10); % 功率比
Ps=1;                      % 信号功率,为1时其dBW形式为0。
Pn=Ps./SNR_Power;          % 噪声功率

%% [2、生成信号]
sn=round(rand(1,N));         % 原信号: 0,1序列sn
sn1=round((sn-1/2)*2);       % 原信号:-1,1序列sn1,均值为0,方差为1
var(sn1);
fa=50;          % 信号频率
fs=150;Ts=1/fs; % 采样周期及采样频率
t=(1:N)*Ts;     % 时间刻度
sn=7+2*sin(2*pi*t+3*pi/4); % 一个固定信号
% mean(sn)  % 均值=6.999
% var(sn)   % 方差=2
sn1=sn./std(sn);    % 归一化 均值为0
sn1=sn1-mean(sn1);  % 归一化 方差为1
% mean(sn1) 
% var(sn1)

%1、wgn函数,返回 高斯白噪声
%%% 前两个参数指 维度
%%% 第三个参数指 噪声的功率(dBW)
if 0    
    noise=wgn(1,N,10*log10(Pn));
    xn=sn1+noise;
end
%2、awgn函数,生成 输入信号+高斯白噪声
%%% 第一个参数指 输入信号
%%% 第二个参数指 信噪比(dBW)
%%% 第三个参数是 一个数值时,代表输入信号的功率dBW;是"measured"的时,在添加噪声前会自动计算输入信号的功率;
%%% 当只有前两个信号时,代表默认输入信号的功率为 0 dBW(功率为1)。
if 0   
    xn=awgn(sn1,SNR_dB,"measured");
    noise=xn-sn1;
end
%3、randn函数,返回 均值为0方差为1且高斯分布的噪声
%%% a+b*randn(m,n)的均值为0,方差为b^2。
if 1   
    noise = sqrt(Pn)*randn(1,N);
    xn=sn1+noise;
end

%% [3、结果测试]
sigPower = sum(abs(sn1).^2)/length(sn1);     % 求出信号功率
noisePower=sum(abs(noise).^2)/length(noise); % 求出噪声功率
SNR_10=10*log10(sigPower/noisePower);        % 由信噪比定义求出信噪比,单位为db
disp(['理论信噪比(dB)=',num2str(SNR_dB),]);
disp(['仿真信号功率(W)=',num2str(sigPower)]);
disp(['仿真噪声功率(W)=',num2str(noisePower)]);
disp(['仿真信噪比(dB)=',num2str(SNR_10)]);

2.2 实信号+复噪声

cpp 复制代码
clc;        % 清空命令行
clear;      % 清空变量
close all;  % 关闭所有窗口

%% [1、参数设置]
N=1e6;                     % 数据点数
SNR_dB=20;                 % 信噪比(dB形式)
SNR_Power=10.^(SNR_dB/10); % 功率比
Ps=1;                      % 信号功率,为1时其dBW形式为0。
Pn=Ps./SNR_Power;          % 噪声功率

%% [2、生成信号]
fa=50;          % 信号频率
fs=150;Ts=1/fs; % 采样周期及采样频率
t=(1:N)*Ts;     % 时间刻度
sn=7+2*sin(2*pi*t+3*pi/4);% 
% mean(sn)  % 均值=6.999
% var(sn)   % 方差=2
sn1=sn./std(sn);    % 归一化 均值为0
sn1=sn1-mean(sn1);  % 归一化 方差为1
% mean(sn1) 
% var(sn1)

%1、wgn函数,返回 高斯白噪声
%%% 前两个参数指 维度
%%% 第三个参数指 噪声的功率(dBW)
if 0   
    noise=wgn(1,N,10*log10(Pn/2))+1i*wgn(1,N,10*log10(Pn/2));
    xn=sn1+noise;
end
%2、awgn函数,返回 输入信号+高斯白噪声
%%% 第一个参数指 输入信号
%%% 第二个参数指 信噪比(dBW)
%%% 第三个参数是 一个数值时,代表输入信号的功率dBW;是"measured"的时,在添加噪声前会自动计算输入信号的功率;
%%% 当只有前两个信号时,代表默认输入信号的功率为 0 dBW(功率为1)。
if 0
    xn1=awgn(sn1,SNR_dB+10*log10(2));
    noise1=xn1-sn1;
    xn2=awgn(sn1,SNR_dB+10*log10(2));
    noise2=xn2-sn1;
    noise=noise1+noise2;
end
%3、randn函数,返回 均值为0方差为1且高斯分布的噪声
%%% a+b*randn(m,n)的均值为0,方差为b^2。
if 1   
    noise = sqrt(Pn/2)*(randn(1,N)+1i*randn(1,N));
    xn=sn1+noise;
end

%% [3、结果测试]
sigPower = sum(abs(sn1).^2)/length(sn1);     % 求出信号功率
noisePower=sum(abs(noise).^2)/length(noise); % 求出噪声功率
SNR_10=10*log10(sigPower/noisePower);        % 由能量比求出信噪比,单位为db
disp(['理论信噪比(dB)=',num2str(SNR_dB)]);
disp(['仿真信号功率(W)=',num2str(sigPower)]);
disp(['仿真噪声功率(W)=',num2str(noisePower)]);
disp(['仿真信噪比(dB)=',num2str(SNR_10)]);

【 3. 能量归一化 】

3.1 实信号+实噪声

cpp 复制代码
%%% 实信号+实噪声,能量归一化,指定信号能量为1
%%% 验证通过
clc;        % 清空命令行
clear;      % 清空变量
close all;  % 关闭所有窗口

%% [1、参数设置]
N=1e6;                     % 数据点数
SNR_dB=20;                 % 信噪比(dB形式)
Es=1;                      % 信号能量
SNR_Ratio=10.^(SNR_dB/10); % 能量比(信号能量/噪声能量)
En=Es./SNR_Ratio;          % 噪声能量
temp=Es./10.^(SNR_dB/20);  % 加在噪声变量前的

%% [2、生成信号]
fa=50;          % 信号频率
fs=150;Ts=1/fs; % 采样周期及采样频率
t=(1:N)*Ts;     % 时间刻度
sn=7+2*sin(2*pi*t+3*pi/4); % 一个固定信号,均值=6.999,方差=2
% mean(sn) 
% var(sn)
sn1=sn./norm(sn); % 均值为0方差为0,功率为0,总能量为1
% mean(sn1)
% var(sn1)

%% [3、加噪]
if 1
    noise = randn(1,N);               % 均值为0+0i,方差为1
    noise=noise/norm(noise);          % 均值为0+0i,方差为0,能量为1
    noise=temp*noise;
    xn=sn1+noise;
end

%% [4、结果测试]
sigPower = sum(abs(sn1).^2);                % 求出信号能量
noisePower=sum(abs(noise).^2);              % 求出噪声能量
SNR_10=10*log10(sigPower/noisePower);       % 由能量比求出信噪比,单位为db
disp(['理论信噪比(dB)=',num2str(SNR_dB)]);   % 
disp(['仿真信号能量(W)=',num2str(sigPower)]);
disp(['仿真噪声能量(W)=',num2str(noisePower)]);
disp(['仿真信噪比(dB)=',num2str(SNR_10)]);

3.2 实信号+复噪声

cpp 复制代码
%%% 实信号+复噪声,能量归一化,指定信号能量为1
%%% 3种方式添加信噪比
%%% 验证通过
clc;        % 清空命令行
clear;      % 清空变量
close all;  % 关闭所有窗口

%% [1、参数设置]
N=1e6;                     % 数据点数
SNR_dB=20;                 % 信噪比(dB形式)
Es=1;                      % 信号能量
SNR_Ratio=10.^(SNR_dB/10); % 能量比(信号能量/噪声能量)
En=Es./SNR_Ratio;          % 噪声能量
temp=Es./10.^(SNR_dB/20);  % 加在噪声变量前的

%% [2、生成信号]
fa=50;          % 信号频率
fs=150;Ts=1/fs; % 采样周期及采样频率
t=(1:N)*Ts;     % 时间刻度
sn=7+2*sin(2*pi*t+3*pi/4); % 一个固定信号,均值=6.999,方差=2
% mean(sn) 
% var(sn)
sn1=sn./norm(sn); % 均值为0方差为0,功率为0,总能量为1
% mean(sn1)
% var(sn1)

%% [3、加噪]
% randn函数,返回 均值为0方差为1且高斯分布的噪声
%%% a+b*randn(m,n)的均值为0,方差为b^2。
if 1
    noise = randn(1,N)+1i*randn(1,N); % 均值为0+0i,方差为2
    noise=noise/norm(noise);          % 均值为0+0i,方差为0,能量为1
    noise=temp*noise;
    xn=sn1+noise;
end

%% [4、结果测试]
sigPower = sum(abs(sn1).^2);                % 求出信号能量
noisePower=sum(abs(noise).^2);              % 求出噪声能量
SNR_10=10*log10(sigPower/noisePower);       % 由能量比求出信噪比,单位为db
disp(['理论信噪比(dB)=',num2str(SNR_dB)]);   % 
disp(['仿真信号能量(W)=',num2str(sigPower)]);
disp(['仿真噪声能量(W)=',num2str(noisePower)]);
disp(['仿真信噪比(dB)=',num2str(SNR_10)]);

【 4. 小结 】

  • 按照功率的形式生成具有一定信噪比的信号时,需要让 信号/噪声 其中一个的功率归一化即功率为1,使其均值为0方差为1,另一个 信号/噪声 则按照信噪比生成。
  • 按照能量的形式生成具有一定信噪比的信号时,若要让 信号/噪声 其中一个的能量归一化即能量为1,可通过norm函数让其均值为0方差为0能量为1,另一个 噪声/信号 则按照信噪比生成。
相关推荐
Not Dr.Wang42217 小时前
FIR数字滤波器设计的两种实现
matlab
3GPP仿真实验室17 小时前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵
民乐团扒谱机1 天前
【微实验】机器学习之集成学习 GBDT和XGBoost 附 matlab仿真代码 复制即可运行
人工智能·机器学习·matlab·集成学习·xgboost·gbdt·梯度提升树
Evand J1 天前
TDOA(到达时间差)的GDOP和CRLB计算的MATLAB例程,论文复现,附参考文献。GDOP:几何精度因子&CRLB:克拉美罗下界
开发语言·matlab·tdoa·crlb·gdop
机器学习之心HML1 天前
MATLAB豆渣发酵工艺优化 - 基于响应面法结合遗传算法
matlab
aini_lovee2 天前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab
3GPP仿真实验室2 天前
【Matlab源码】6G候选波形:OFDM-IM 增强仿真平台 DM、CI
开发语言·matlab·ci/cd
rit84324992 天前
MATLAB中Teager能量算子提取与解调信号的实现
开发语言·matlab
我找到地球的支点啦2 天前
通信扩展——扩频技术(超级详细,附带Matlab代码)
开发语言·matlab
Dev7z3 天前
基于 MATLAB 的铣削切削力建模与仿真
开发语言·matlab