信噪比的定义及计算方法

article/2025/9/26 23:35:58

1.信噪比的定义

英文名称叫做SNR或S/N(SIGNAL-NOISE RATIO),又称为讯噪比。是指一个电子设备或者电子系统中信号与噪声的比例。这里面的信号指的是来自设备外部需要通过这台设备进行处理的电子信号,噪声是指经过该设备后产生的原信号中并不存在的无规则的额外信号(或信息),并且该种信号并不随原信号的变化而变化。

2.计算方法

信噪比是一个比值,也可以认为是一种倍数,在通信和电子工程中,我们希望的是信噪比越高越好。比如说信号噪声的强度是噪声的10倍、100倍、1000倍,由于这个数字可能是一个很大很大的数字,所以我们采用分贝(dB)来表示。其定义为:“两个同类功率量或可与功率类比的量之比值的常用对数乘以10等于1时的级差” 。公式如下:
N d B = 10 l g P s P n N_{dB}=10\mathrm{lg}\frac{P_s}{P_n} NdB=10lgPnPs
因此信噪比的定义即:
S N R = 10 l g P s P n SNR=10\mathrm{lg}\frac{P_s}{P_n} SNR=10lgPnPs
其中 P s P_s Ps是信号的功率, P n P_n Pn是噪声的功率, l g \mathrm{lg} lg表示以10为底的对数。
假如说知道信噪比和信号功率,可以知道噪声功率为:
P n = P s 1 0 ( S N R / 10 ) P_n=\frac{P_s}{10^{(SNR/10)}} Pn=10(SNR/10)Ps
那对于一个数字信号而言,它的功率如何求呢?
假设数字信号 x ( n ) x(n) x(n)的序列长度为 N N N,那么它的功率就是:
P = ∑ n = 0 N − 1 x ( n ) 2 N P = \frac{\sum_{n=0}^{N-1}x(n)^{2}}{N} P=Nn=0N1x(n)2
在这里陈清一个概念,信号的功率由信号能量除以时间得到。信号能量在连续的情形就是对 x x x平方后求积分,而在离散的情形自然是求和代替积分了。

3.推导公式

信号的功率: P s P_s Ps,噪声的功率: P n P_n Pn,以及信噪比: S N R SNR SNR,三个值,只要知道其中的任意的两个值,便能够得到第三个值。
例如:由信号的功率: P s P_s Ps和信噪比: S N R SNR SNR,则噪声功率:
P n = P s 1 0 S N R / 10 P_n=\frac{P_s}{10^{SNR/10}} Pn=10SNR/10Ps

4.Matlab动手实现

先来生成一个信号:

T = 1; %仿真时间
dt = 0.001; %采样率
t = 0: dt: 1-dt; %时间向量
N = length(t); %序列长度
f = 5; %信号频率,Hz为单位
a = cos(2*pi*f*t); %周期信号
plot(t, a);
p = sum(a.^2)/N;

在这里插入图片描述
该信号的功率:0.5 w。
白噪声的功率用其方差来定义。
如何产生白噪声呢?
Matlab中randn可以产生均值为0,方差为1(即功率为1)的随机序列。

n = randn(N,1);  %产生噪声,功率为1
plot(t,n)
sum(n.^2)/N

在这里插入图片描述
如何产生指定功率的白噪声,例如我们要产生功率为 P n P_n Pn的白噪声:

n = sqrt(P_n)*randn(N,1);  %产生噪声,功率为P_n

我们可以验证一下它的正确性:

p  = 10; %功率为p
noise = sqrt(p)*randn(10000,1); %生成功率为p的噪声
sum(noise.^2)/length(noise)  %输出计算得到的噪声

输出:

ans =9.9994

因此这样编程时正确的。我们还可以使用matlab自带的函数产生高斯白噪声。wgn(m,n,p)产生功率为p (dBW)的mn的高斯白噪声矩阵,其中p是以dbW为单位的输出强度。瓦和dB W之间的运算关系:
d B W = 10 l g ( P 1 W ) \mathrm{dBW} =10\mathrm{lg}(\frac{P}{1\mathrm{W}}) dBW=10lg(1WP)
因此,10w = 10
log10(10)dbW。编程验证:

p = 10;
noise = wgn(10000,1,10*log10(p));
sum(noise.^2)/length(noise)

输出:

ans =9.8748

有一点误差。
搞清楚如何生成固定信噪比的噪声后,在一个信号上添加指定信噪比的程序如下:

clc;clear all;close all;
SNR = 10; %信噪比为10
T = 1; %仿真时间
dt = 0.001; %采样率
t = 0: dt: 1-dt; %时间向量
N = length(t); %序列长度
f = 5; %信号频率,Hz为单位
a = cos(2*pi*f*t); %周期信号
plot(t, a, 'k');
P_s = sum(a.^2)/N; %信号功率
P_n = P_s/(10^(SNR/10)); %计算噪声功率
n = sqrt(P_n)*randn(N,1);  %产生噪声,功率为P_n
hold on %保持绘图界面
plot(t,n,'r');
sum(n.^2)/N
nosie_a = a' + n; %添加噪声后的信号
hold on %保持绘图界面
plot(t,nosie_a,'g');
legend('Pure signal','Noise','Noise signal');

在这里插入图片描述

4.自己编函数

以上的程序仅仅是给一个信号添加特定信噪比,为方便使用,可以编写一个函数。

%%-------------------------------------------------
%% 给输入信号添加一定信噪比
%% 输入参数 pureSignal : 输入信号
%%         SNR : 信噪比,dB为单位
%% 输出参数 noiseSignal
%% 输出参数 Location: 估计的时延参数 
%%huasir @shenZhen
%%2022.4.5
%%-------------------------------------------------
%%-------------------------------------------------
function [noiseSignal] = mySNR(pureSignal, SNR)
[m,n] = size(pureSignal);
Power_pureSignal = sum(abs(pureSignal).^2)/length(pureSignal);
Power_noise = Power_pureSignal/(10^(SNR/10)); %计算噪声功率
noise = sqrt(Power_noise)*randn(m,n); %生成噪声
noiseSignal = noise + pureSignal; %给信号添加噪声
end

5.Matlab自带的函数

matlab中可以采用如下函数给信号添加一定噪声:

y = awgn(x,snr,'measured') 

其中x是原始输入信号,snr即信噪比,'measured‘是指在添加噪声之前先测量一下输入信号的功率,加入没有这个参数的话,它会默认输入信号的功率为0。事实上,很多情况下我们的输入信号的功率不可能为0。
下面验证一下这段代码的正确性:

clc;clear all;close all;
SNR = 10; %信噪比为10
T = 1; %仿真时间
dt = 0.001; %采样率
t = 0: dt: 1-dt; %时间向量
N = length(t); %序列长度
f = 5; %信号频率,Hz为单位
a = cos(2*pi*f*t); %周期信号
plot(t, a, 'k');
P_s = sum(a.^2)/N; %信号功率noise_a = awgn(a,SNR,'measured') ; %添加噪声后的信号,调用matlab函数
hold on %保持绘图界面
plot(t,noise_a,'g');
legend('Pure signal','Noise signal');
noise = noise_a - a; %做差求噪声
P_n = sum(noise.^2)/N;
my_SNR = 10*log10(P_s/P_n) %计算得到的信噪比

我设置的信噪比是10,最终计算得到的信噪比是

my_SNR =9.8643

有一定误差,目前暂不明确为什么会出现这种情况。


http://chatgpt.dhexx.cn/article/c5W0L27j.shtml

相关文章

PSNR峰值信噪比(python代码实现+SSIM+MSIM)

一、原理 psnr是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准 用来表示信号最大可能功率和影响它的表示精度的破坏性噪声功率的比值,可以显示图像画质损失的程度。峰值信噪比越大,表示画质损失…

opencv图像处理学习(五十七)——峰值信噪比和结构相似性

1.峰值信噪比 峰值信噪比是常用的衡量信号失真的指标。该参数是基于图像像素灰度值进行统计分析,但是由于人类视觉特性的差异性,通常出现的评价结果与人的主管感觉不一致,但其仍然是一个有参考价值的评价指标。对于两幅图像I与K,…

用户自定义函数UDF

SQL DDL:用户自定义函数UDF 什么是UDF? Hive支持的函数除了内置函数,允许编写用户自定义函数(User Define Function)来扩充函数的功能。 用户自定义函数需要使用Java语言进行编写,完成的UDF可以打包成Ja…

hive笔记八:自定义函数-自定义UDF函数/自定义UDTF函数

目录 自定义函数 自定义UDF函数 自定义UDTF函数 自定义函数 Hive自带一些函数,比如:max/min等;当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数。 UDF:user-defined function …

用python实现Hive中的UDF函数

用python实现Hive中的UDF函数 简介 Hive为我们提供了众多的内置函数,但是在实际的运用过程中仍然不能满足我们所有的需求.hive是用java开发的,本身提供了使用java去开发UDF的方式.而这里我们采用python的方式去实现UDF函数. DEMO实现 我们这里用pyth…

hive创建udf函数流程

1.编写udf函数 引入pom文件 <dependencies> <dependency> <!-- 这个属于额外的jar包 自己按需引用 比如你想搞得函数 里面要连接mysql 这里肯定需要引入mysql的驱动包 我这个包是为了计算字符串的表达式的。 --> <groupId>org.apache.com…

自定义UDF、UDTF函数

自定义步骤 自定义UDF&#xff1a;继承UDF&#xff0c;重写evaluate方法自定义UDTF&#xff1a;继承GenericUDTF&#xff0c;重写3个方法&#xff1a;initialize&#xff08;自定义输出数据的列名和类型&#xff09;&#xff0c;process&#xff08;将结果返回forward(result)…

Hive-编写UDF函数(详细教程~~~)

编写UDF函数 (1)创建项目:(2)导入依赖:(3)继承UDF类(4)业务代码(5)打包编译(5)添加到hive类路径(6)创建临时函数(7)使用测试 Hive 自带了一些函数&#xff0c;比如&#xff1a;max/min 等&#xff0c;但是数量有限&#xff0c;自己可以通过自定义 UDF 来 方便的扩展。 2&#x…

关于Mysql中UDF函数的思考(一)

一点背景 从大学二年纪接触编程&#xff0c;几乎我阅读过的所有的编程语言教材都会有那么一章专门讲述数据库编程&#xff0c;而讲述的内容都无非是介绍某个数据库历史&#xff0c;对应的安装过程&#xff0c;最后才会讲解一点SQL语句&#xff0c;像这样的教材我个人认为是完全…

UDF、UDAF、UDTF之间的区别

1、UDF&#xff1a;用户定义&#xff08;普通&#xff09;函数&#xff0c;只对单行数值产生作用&#xff1b; 继承UDF类&#xff0c;添加方法 evaluate() /*** function 自定义UDF统计最小值**/public class Min extends UDF {public Double evaluate(Double a, Double b) {i…

HIVE udf、udaf、udtf函数定义与用法(最全!!!!!)

一、定义 1、hive udf、udaf、udtf函数定义与用法 &#xff08;1&#xff09;UDF&#xff08;user-defined function&#xff09;作用于单个数据行&#xff0c;产生一个数据行作为输出。&#xff08;数学函数&#xff0c;字符串函数&#xff09; &#xff08;2&#xff09;U…

udf,udaf,udtf之间的区别

1、UDF&#xff1a;用户定义&#xff08;普通&#xff09;函数&#xff0c;只对单行数值产生作用&#xff1b; 继承UDF类&#xff0c;添加方法 evaluate() /*** function 自定义UDF统计最小值* author John**/public class Min extends UDF {public Double evaluate(Double a…

如何编写udf函数(收藏篇)

hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以直接应用于select 语句&#xff0c;对查询结构做格式化处理之后&#xff0c;然后再输出内容。 下面将详细介绍下…

自定义UDF函数

自定义函数案例&#xff1a; 文章目录 自定义UDF函数1.需求2.前期maven工程准备3.编程实现4.导包5.导入hive中 自定义UDTF函数1.需求2.编程实现3.导入hive中 自定义UDF函数 1.需求 自定义一个UDF实现计算给定字符串的长度例如 2.前期maven工程准备 创建一个maven工程&#x…

Hive自定义UDF函数详解

Hive自定义UDF函数详解 一、UDF概述二、UDF种类三、如何自定义UDF四、自定义实现UDF和UDTF4.1 需求4.2 项目pom文件4.3 Hive建表测试及数据4.4 UDF函数编写4.5 UDTF函数编写4.6 UDTF使用 一、UDF概述 UDF全称&#xff1a;User-Defined Functions&#xff0c;即用户自定义函数&…

Hive UDF简单函数

概念 在Hive中&#xff0c;用户可以自定义一些函数&#xff0c;用于扩展HiveQL的功能&#xff0c;而这类函数叫做UDF&#xff08;用户自定义函数)。UDF分为两大类&#xff1a;UDAF&#xff08;用户自定义聚合函数&#xff09;和UDTF&#xff08;用户自定义表生成函数)。  UDF…

大数据Hive篇--UDF函数

什么是UDF: 它是User defined Function的简写&#xff0c;意思是用户自定义方法 为什么要用UDF&#xff1f; hive自带了一些函数&#xff0c;比如&#xff1a;max、min 等&#xff0c;但是自带的函数数量有限&#xff0c;所以hive提供给用户自定义函数的功能。 udf 函数可以…

《C#入门详解》刘铁猛——Lesson20-21事件

其实事件一般就是在界面程序中应用&#xff0c;所以这里讲的不如WPF这种的实用。

《C#入门详解》刘铁猛——Lesson1-2 IDE、各种应用程序

编程学习路径&#xff1a;语言——类库——框架 参考资料&#xff1a;离线MSDN文档&#xff0c;C#语言定义文档&#xff0c;推荐书籍—C# in a nutshell&#xff1b;其中&#xff0c;C#语言定义文档知识点会串的比较多&#xff0c;不建议详读。 使用MSDN&#xff1a;光标选中…