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,另一个 噪声/信号 则按照信噪比生成。
相关推荐
Evand J4 小时前
【MATLAB复现RRT(快速随机树)算法】用于二维平面上的无人车路径规划与避障,含性能分析与可视化
算法·matlab·平面·无人车·rrt·避障
s09071365 小时前
【声纳成像】基于滑动子孔径与加权拼接的条带式多子阵SAS连续成像(MATLAB仿真)
开发语言·算法·matlab·合成孔径声呐·后向投影算法·条带拼接
IT猿手7 小时前
基于 ZOH 离散化与增量 PID 的四旋翼无人机轨迹跟踪控制研究,MATLAB代码
开发语言·算法·matlab·无人机·动态路径规划·openclaw
IT猿手7 小时前
基于控制障碍函数(Control Barrier Function, CBF)的无人机编队三维动态避障路径规划,MATLAB代码
开发语言·matlab·无人机·动态路径规划·无人机编队
SugarFreeOixi7 小时前
MATLAB绘图风格记录NP类型
python·matlab·numpy
IT猿手7 小时前
基于 CBF 的多无人机编队动态避障路径规划研究,无人机及障碍物数量可以自定义修改,MATLAB代码
开发语言·matlab·无人机·动态路径规划
IT猿手10 小时前
基于强化学习Q-learning算法的无人机三维路径规划算法原理与实现,MATLAB代码
算法·matlab·无人机·路径规划·动态路径规划
ghie909012 小时前
拉普拉斯金字塔图像融合MATLAB仿真程序
人工智能·计算机视觉·matlab
IT猿手14 小时前
基于动态三维环境下的Q-Learning算法无人机自主避障路径规划研究,MATLAB代码
算法·matlab·无人机·动态路径规划·多无人机动态避障路径规划
Evand J1 天前
【三维飞行器】RRT路径规划与TOA定位仿真系统,MATLAB例程,路径起终点、障碍物、TOA锚点等均可设置。附下载链接
开发语言·matlab·无人机·定位·rrt·toa·三维航迹规划