文章目录
- [【 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,另一个 噪声/信号 则按照信噪比生成。