连续时间信号,信号总能量定义为:
E ( t 1 : t 2 ) = ∫ t 1 t 2 ∣ x ( t ) ∣ 2 d t E(t_1:t_2)=\int_{t_1}^{t_2}|x(t)|^2dt E(t1:t2)=∫t1t2∣x(t)∣2dt
离散时间信号,信号总能量定义为:
E ( n 1 : n 2 ) = ∑ n = n 1 n 2 ∣ x [ n ] ∣ 2 E(n_1:n_2)=\sum\limits_{n=n1}^{n2}|x[n]|^2 E(n1:n2)=n=n1∑n2∣x[n]∣2
连续时间信号,信号总能量定义为:
E ∞ ≜ ∫ − ∞ ∞ ∣ x ( t ) ∣ 2 E_{\infty}\triangleq\int_{-\infty}^{\infty}|x(t)|^2 E∞≜∫−∞∞∣x(t)∣2
离散时间信号,信号总能量定义为:
E ∞ ≜ ∑ n = − ∞ ∞ ∣ x [ n ] ∣ 2 E_{\infty}\triangleq\sum\limits_{n=-\infty}^{\infty}|x[n]|^2 E∞≜n=−∞∑∞∣x[n]∣2
连续时间信号,信号平均功率定义为:
P ∞ = lim T → ∞ ∫ − T T ∣ x ( t ) ∣ 2 P_{\infty}=\lim\limits_{T\rightarrow\infty}\int_{-T}^{T}|x(t)|^2 P∞=T→∞lim∫−TT∣x(t)∣2
离散时间信号,信号平均功率定义为:
P ∞ = lim N → ∞ 1 2 N + 1 ∣ x [ n ] ∣ 2 P_\infty=\lim\limits_{N\rightarrow\infty}\frac{1}{2N+1}|x[n]|^2 P∞=N→∞lim2N+11∣x[n]∣2
根据上述信号能量和信号功率的定义,本章节衍生补充一下信号分类这个知识点~~~
信号可以分为以下三类:
总能量有限 E ∞ < ∞ E_\infty<\infty E∞<∞,平均功率为零 P ∞ = 0 P_\infty=0 P∞=0,为能量信号;
总能量无限 E ∞ = ∞ E_\infty=\infty E∞=∞但平均功率有限 P ∞ < ∞ P_\infty<\infty P∞<∞,功率信号;
总能量和平均功率都无限,非能非功信号。
注意:如果信号具有有限的总能量,即 E ∞ < ∞ E_\infty<\infty E∞<∞,其平均功率必须为零。
信噪比,又叫 S N R SNR SNR或 S / N S/N S/N,是指一个电子系统中信号与噪声的比例,信噪比的计量单位通常是 d B dB dB,计算方法是:
S N R = 10 l g P s P n SNR=10lg\frac{P_s}{P_n} SNR=10lgPnPs
又或是:
S N R = 20 l g V s V n SNR=20lg\frac{V_s}{V_n} SNR=20lgVnVs
其中 P s P_s Ps和 P n P_n Pn代表信号和噪声的有效功率, V s V_s Vs和 V n V_n Vn是信号和噪声电压的有效值。
所谓高斯白噪声,就是幅度分布服从高斯分布,功率谱密度分布服从均匀分布的噪声信号。已知噪声功率,其噪声功率其实就是高斯分布的方差。因此,生成一个固定功率的高斯白噪声信号,只需要使用Matlab的randn命令生成一组正态分布的随机数,并给这组随机数乘以设定功率的平方根即可。代码如下:
%% 仿真验证噪声功率是标准差的平方
clear; clc; close all; warning off;
L = 1000; % 噪声信号长度
N = 10000; % 蒙特卡洛试验次数
sigma = 2; % 噪声标准差
Pn_lis = zeros(1, N);
for i = 1 : N
noise = sigma * randn(1, L); % 产生噪声信号
P_n = sum(noise .^ 2) / length(noise); % 离散信号平均功率计算公式
Pn_lis(i) = P_n;
end
% 作图
figure(1); clf;
plot(Pn_lis, 'linewidth', 1.5); hold on;
plot(xlim, [sigma^2, sigma^2], 'm--', 'linewidth', 2); hold off;
legend('仿真的噪声功率曲线', '设置的噪声功率参数');
ylim([2, 6]); xlabel('试验次数'); ylabel('噪声功率'); set(gca, 'fontsize', 14);
title(['标准差=', num2str(sigma), ' 噪声功率的平均值=', num2str(mean(Pn_lis))]);
运行结果:
上面仿真图中,粉色虚线是事先设置好的噪声功率值,蓝色曲线是10000次蒙特卡洛实验每一次的噪声功率值分布曲线。从仿真结果看,仿真设置的噪声的标准差为2,进行10000次蒙特卡洛实验得到的噪声功率的平均值为3.9988, 3.9988 ≈ 2 2 3.9988\approx2^2 3.9988≈22 。因此可以得到结论:使用Matlab的randn函数生成随机数并乘以噪声功率的平方根 P n \sqrt{P_n} Pn,确实可以生成功率为 P n P_n Pn 的高斯白噪声。
计算信噪比只需要带入上述信噪比公式,下面将用功率比的方式来举例,进行仿真计算。
%% 计算信噪比仿真
clear; clc; close all; warning off;
% 参数设置
T = 2; % 仿真时长
fs = 1000; % 采样频率
t = 0 : 1/fs : T;
L = length(t);
A = 10; % 幅值
fc = 10; % 载频
P_n = 2; % 噪声功率
% 产生仿真信号
signal = A * cos(2 * pi * fc .* t); % 生成有效信号
noise = sqrt(P_n) .* randn(1, L); % 产生高斯白噪声信号
% 计算信噪比
P_s = sum(signal .^ 2) / L; % 信号功率
P_n = sum(noise .^ 2) / L; % 噪声功率
SNR = 10 * log10(P_s / P_n); % 信噪比
fprintf('\t信号的平均功率为:%.2fW\n', P_s);
fprintf('\t噪声的平均功率为:%.2fW\n', P_n);
fprintf('\t信噪比为:%.2fdB\n', SNR);
figure(1); clf;
subplot(2, 1, 1);
plot(t, signal, 'b', 'linewidth', 2); hold on;
plot(t, noise, 'k', 'linewidth', 1); hold on;
plot(t, signal+noise, 'g', 'linewidth', 1);
xlabel('t'); ylabel('y'); axis('tight'); title('全部信号波形'); set(gca, 'fontsize', 14);
subplot(2, 1, 2);
plot(t(100:500), signal(100:500), 'b', 'linewidth', 2); hold on;
plot(t(100:500), noise(100:500), 'k', 'linewidth', 1); hold on;
plot(t(100:500), signal(100:500)+noise(100:500), 'g', 'linewidth', 1);
legend(['信号功率≈', num2str(P_s, '%.2f'), 'W'], ['噪声功率≈', num2str(P_n, '%.2f'), 'W'], ...
['信噪比≈', num2str(SNR, '%.2f'), 'dB'], 'location', 'eastoutside');
xlabel('t'); ylabel('y'); axis('tight'); title('放大局部观察信号细节'); set(gca, 'fontsize', 14);
set(gcf, 'position', [12, 60, 1450, 650]);
运行结果:
根据上述信噪比的计算公式可知,信噪比的计算只和两个变量有关系,即信号功率 P s P_s Ps和噪声功率 P n P_n Pn,因此,任意已知信号功率 P s P_s Ps、噪声功率 P n P_n Pn和信噪比 S N R SNR SNR的其中两项,可以求得另外一项。利用这一特性,可以生成固定信噪比的带噪信号。
基本思路是:
用数学公式表示为:
S N R = 10 l g P s P n ⟹ P n = P s 1 0 S N R / 10 SNR=10lg\frac{P_s}{P_n}\quad\Longrightarrow\quad P_n=\frac{P_s}{10^{SNR/10}} SNR=10lgPnPs⟹Pn=10SNR/10Ps
仿真代码如下:
%% 产生固定信噪比的带噪信号
clear; clc; close all; warning off;
% 参数设置
T = 2; % 仿真时长
fs = 1000; % 采样频率
t = 0 : 1/fs : T;
L = length(t);
A = 10; % 幅值
fc = 10; % 载频
SNR = 5; % 设定信噪比参数
% 生成有效信号
signal = A * cos(2 * pi * fc .* t); % 生成有效信号
P_s = sum(signal .^ 2) / L; % 信号功率
% 产生带噪信号
P_n = P_s / (10 ^ (SNR / 10));
noise = sqrt(P_n) .* randn(1, L); % 噪声信号
s_noise = signal + noise;
% 验证生成的带噪信号的信噪比是否等于设定参数
P_n_real = sum(noise .^ 2) / L;
SNR_real = 10 * log10(P_s / P_n_real);
fprintf('\t设定的信噪比参数为:%.2fdB\n', SNR);
fprintf('\t实际的带噪信号的信噪比为:%.2fdB\n', SNR_real);
figure(1); clf;
subplot(2, 1, 1);
plot(t, signal, 'b', 'linewidth', 2); hold on;
plot(t, noise, 'k', 'linewidth', 1); hold on;
plot(t, s_noise, 'g', 'linewidth', 1);
xlabel('t'); ylabel('y'); axis('tight'); title('全部信号波形'); set(gca, 'fontsize', 14);
subplot(2, 1, 2);
plot(t(100:500), signal(100:500), 'b', 'linewidth', 2); hold on;
plot(t(100:500), noise(100:500), 'k', 'linewidth', 1); hold on;
plot(t(100:500), s_noise(100:500), 'g', 'linewidth', 1);
legend(['信号功率≈', num2str(P_s, '%.2f'), 'W'], ['噪声功率≈', num2str(P_n_real, '%.2f'), 'W'], ...
['信噪比≈', num2str(SNR_real, '%.2f'), 'dB'], 'location', 'eastoutside');
xlabel('t'); ylabel('y'); axis('tight'); title('放大局部观察信号细节'); set(gca, 'fontsize', 14);
set(gcf, 'position', [12, 60, 1450, 650]);
运行结果: