当前位置: 首页 > news >正文

Matlab 生成一定信噪比的信号

文章目录

  • 【 1. 信噪比 】
  • 【 2. 功率归一化 】
    • 2.1 实信号+实噪声
    • 2.2 实信号+复噪声
  • 【 3. 能量归一化 】
    • 3.1 实信号+实噪声
    • 3.2 实信号+复噪声
  • 【 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} 信噪比公式1SNR=10log10PnPs其中, 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} 信噪比公式2SNR=10log10EnEs其中, E s E_s Es E n E_n En 分别指 信号的平均功率、噪声的平均功率。
  • 因此,可通过两种方式生成 一定信噪比的信号。

【 2. 功率归一化 】

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

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

2.1 实信号+实噪声

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^2if 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 实信号+复噪声

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 0xn1=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^2if 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 实信号+实噪声

%%% 实信号+实噪声,能量归一化,指定信号能量为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 1noise = randn(1,N);               % 均值为0+0i,方差为1noise=noise/norm(noise);          % 均值为0+0i,方差为0,能量为1noise=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 实信号+复噪声

%%% 实信号+复噪声,能量归一化,指定信号能量为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^2if 1noise = randn(1,N)+1i*randn(1,N); % 均值为0+0i,方差为2noise=noise/norm(noise);          % 均值为0+0i,方差为0,能量为1noise=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,另一个 噪声/信号 则按照信噪比生成。
http://www.lryc.cn/news/138891.html

相关文章:

  • [国产MCU]-W801开发实例-定时器
  • 基于 CentOS 7 构建 LVS-DR 群集,配置nginx负载均衡。
  • 大数据——spark一文全知道
  • Linux命令200例:telnet用于远程登录的网络协议(常用)
  • 使用 eBPF 在云中实现网络可观测性
  • linux安装部署gitlab全教程,包含配置中文
  • 软考高级系统架构设计师系列论文八十:论企业信息化战略规划技术
  • 使用ChatGPT构建一个AIML聊天机器人是什么体验
  • [JavaWeb]【九】web后端开发-SpringBootWeb案例(菜单)
  • vue 主组件把日期选择器给子组件props传obj值, 与子组件监听 watch对象或对象属性
  • WebDAV之π-Disk派盘 + 一刻日记
  • springboot aop实现接口防重复操作
  • ubuntu18.04复现yolo v8环境配置之CUDA与pytorch版本问题以及多CUDA版本安装及切换
  • Yaml配置文件读取方法
  • Python3 lambda 函数入门示例 Python lambda 函数
  • 【计算机网络】HTTPs 传输流程
  • 【Linux】国产深度系统装机必备(开发、日常使用)
  • 动态规划入门:斐波那契数列模型以及多状态(C++)
  • LeetCode438.找到字符串中所有字母异位词
  • 【微服务】03-HttpClientFactory与gRpc
  • iOS开发之查看静态库(.a/.framework)中包含的.o文件和函数符号(ar,nm命令)
  • Idea常用快捷键--让你代码效率提升一倍(一)
  • 【Open3D】第二篇:GUI编程
  • 【Python】P0 本系列博文简介与大纲
  • FL Studio 21.1.0 Build 3713中文破解免费下载安装激活
  • 从0开始配置eslint
  • Activity 的启动流程(Android 13)
  • deepspeed学习资料
  • 数据分享|R语言PCA主成分、lasso、岭回归降维分析近年来各国土地面积变化影响...
  • Docker-Consul