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,另一个 噪声/信号 则按照信噪比生成。
相关推荐
jk_1017 小时前
MATLAB中insertAfter函数用法
开发语言·matlab
matlabgoodboy15 小时前
代码编写java代做matlab程序代编Python接单c++代写web系统设计
java·python·matlab
chen49307219 小时前
matlab实现数据极坐标显示
matlab
Evand J1 天前
matlab绘图——彩色螺旋图
开发语言·matlab·信息可视化
wenxin-1 天前
NS3网络模拟器中如何利用Gnuplot工具像MATLAB一样绘制各类图形?
开发语言·matlab·画图·ns3·lr-wpan
硬汉嵌入式1 天前
《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压
vscode·matlab·开源
小熊科研路(同名GZH)2 天前
【Matlab高端绘图SCI绘图模板】第002期 绘制面积图
开发语言·matlab
肖田变强不变秃2 天前
C++实现矩阵Matrix类 实现基本运算
开发语言·c++·matlab·矩阵·有限元·ansys
jk_1013 天前
MATLAB中characterListPattern函数用法
开发语言·matlab
恩泽君3 天前
Matlab总提示内存不够用,明明小于电脑内存
开发语言·matlab