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,另一个 噪声/信号 则按照信噪比生成。
相关推荐
IT猿手2 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost2 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
IT猿手7 小时前
SDMTSP:粒子群优化算法PSO求解单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)
开发语言·人工智能·matlab·智能优化算法
我爱C编程16 小时前
基于Qlearning强化学习的机器人路线规划matlab仿真
matlab·机器人·强化学习·路线规划·qlearning·机器人路线规划
Evand J1 天前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
孤亭远见1 天前
COMSOL with Matlab
matlab
图南楠2 天前
simulink离散传递函数得到差分方程并用C语言实现
matlab
信号处理学渣2 天前
matlab画图,选择性显示legend标签
开发语言·matlab
机器学习之心2 天前
Bayes-GRU-Attention的数据多特征分类预测Matlab实现
matlab·分类·gru
叶庭云2 天前
Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的
matlab·编程语言·r·数组索引·从 1 开始