2026a

# snr


信噪比

函数库: TySignalProcessing

# 语法

r = snr(xi,y)

r = snr(x)
r = snr(x,fs,n)

r = snr(pxx,f,"psd")
r = snr(pxx,f,n,"psd")

r = snr(sxx,f,rbw, "power")
r = snr(sxx,f,rbw,n, "power")

r = snr(___; harmType = "aliased")

r,noisepow = snr(___)

snr(___; plotfig = true)

# 说明

r = snr(xiy) 通过计算信号的平方和幅值与噪声y的平方和幅值之比,返回信号的信噪比(snr)(以分贝为单位):r = mag2db(rssq(xi(:))/rssq(y(:)))。y 必须具有与 xi 相同的尺寸。当输入信号不一定是正弦信号并且您有噪声估计值时,请使用此形式。


r = snr(x) 返回相对于实值正弦输入信号 x 的载波(dBc)信噪比(分贝)。snr 使用与输入相同长度的修改周期图确定。修改后的周期图使用 的 Kaiser 窗口。结果不包括前 6 次谐波的功率,包括基波。


r = snr(xfsn) 返回以 dBc 表示的实际正弦输入信号 x 的信噪比,以 fs 的速率采样。计算不包括最低 n 次谐波中包含的功率,包括基波。fs 的默认值为 1。n 的默认值为 6。


r = snr(pxxf,"psd") 将输入 pxx 指定为单侧功率谱密度(psd)估计。参数 f 是发生 pxx 估计的频率向量。噪声计算不包括前 6 次谐波的功率,包括基波。


r = snr(pxxfn,"psd") 指定计算 snr 时要排除的谐波数 n。n 的默认值为 6,包括基本值。


r = snr(sxxfrbw,"power") 将输入指定为实信号的单侧功率谱 sxx。输入 rbw 是分辨率带宽,在该带宽上集成每个功率估计。


r = snr(sxxfrbwn,"power") 指定计算 snr 时要排除的谐波数 n。n 的默认值为 6,包括基本值。


r = snr(___; harmType = "aliased")去除混叠到奈奎斯特范围内的基波谐波。当正弦输入信号采样不足时,使用此选项。如果未指定此选项,或将其设置为 "omitaliases",则该函数将基频中超出奈奎斯特范围的任何谐波视为噪声。


[rnoisepow] = snr(___)还返回信号非谐波分量的总噪声功率。

# 示例

高斯噪声矩形脉冲的信噪比

产生 20 毫秒的矩形脉冲,在 10 kHz下采样 2 秒。

using TySignalProcessing
using TyControlSystems
using TyMath
Tpulse = 20e-3
Fs = 10e3
t = [-1:(1 / Fs):1;]
x = rectpuls(t, Tpulse)

将脉冲嵌入高斯白噪声中,使得信噪比(SNR)为 53 dB。重置随机数生成器以获得可再现的结果。

rng = MT19937ar(1234)
SNR = 53
y = randn(rng, size(x)) * std(x) / db2mag(SNR)
s = x + y

使用 snr 函数计算噪声信号的 snr。

pulseSNR, = snr(x, y)
pulseSNR = 53.01858086144952
对比正弦信号的信噪比

创建以 48 kHz 采样的正弦信号。该信号具有 1 kHz 的基频和单位振幅。此外,它还包含一个 2 kHz 谐波,振幅为一半,加性噪声方差为 0.1²。

using TySignalProcessing
using TyMath
rng = MT19937ar(5489)
fs = 48e3
t = [0:1/fs:1-1/fs;]
A = 1.0
powfund = A^2 / 2
a = 0.4
powharm = a^2 / 2
s = 0.1
varnoise = s^2
x = A * cos.(2 * pi * 1000 * t) + a * sin.(2 * pi * 2000 * t) + s * randn(rng,size(t))

验证 SNR、THD 和 SINAD 是否与其定义一致。

SNR, = snr(x)
defSNR = 10 * log10(powfund / varnoise)
SN = [SNR defSNR]
SN = 1×2 Matrix{Float64}:
 17.0178  16.9897
THD, = thd(x);
defTHD = 10 * log10(powharm / powfund);
TH = [THD defTHD]
TH = 
  1×2 Matrix{Float64}:
  -7.9546  -7.9588
SINAD, = sinad(x);
defSINAD = 10 * log10(powfund / (powharm + varnoise));
SI = [SINAD defSINAD]
SI = 
  1×2 Matrix{Float64}:
  7.45705  7.44727
正弦曲线信噪比

计算以 48 kHz 采样的 2.5 kHz 正弦波的 SNR。添加方差为 0.001² 的白噪声。

using TySignalProcessing
using TyMath
Fi = 2500
Fs = 48e3
N = 1024
rng = MT19937ar(5489)
x = sin.(2 * pi * Fi / Fs * (1:N)) + 0.001 * randn(rng, N)
SNR, = snr(x, Fs; plotfig=true)
SNR = 57.71032420048321
使用 PSD 计算正弦曲线信噪比

获得以 48 kHz 采样的 2.5 kHz 正弦波的周期图功率谱密度(PSD)估计。添加标准偏差为 0.00001 的白噪声。使用此值作为输入以确定 SNR。将随机数生成器设置为可再现结果的默认设置。

using TySignalProcessing
using TyMath
Fi = 2500
Fs = 48e3
N = 1024
rng = MT19937ar(5489)
x = sin.(2 * pi * Fi / Fs * (1:N)) + 0.00001 * randn(rng, N)
w = kaiser(length(x), 38)
Pxx, F = periodogram(x, w, length(x), Fs; nargout = 2)
SNR, = snr(Pxx,F,"psd")
SNR = 97.74460936801074
使用功率谱计算正弦曲线信噪比

使用功率谱,计算以 48 kHz 采样并嵌入白噪声中的 2.5 kHz 正弦波的 SNR,标准偏差为 0.00001。重置随机数生成器以获得可再现的结果。

using TySignalProcessing
using TyMath
Fi = 2500
Fs = 48e3
N = 1024
rng = MT19937ar(5489)
x = sin.(2 * pi * Fi / Fs * (1:N)) + 0.00001 * randn(rng, N)
w = kaiser(length(x), 38)
Sxx, F = periodogram(x, w, length(x), Fs, "power"; nargout = 2)
rbw = enbw(w, Fs)
SNR, = snr(Sxx, F, rbw, "power"; plotfig = true)
SNR = 97.74460936801074
具有和不具有混叠谐波信噪比

生成一个信号,该信号类似于以 2.1 kHz 音调作为输入的弱非线性放大器的输出。该信号以 10 kHz 采样 1 秒。计算并绘制信号的功率谱。使用 β = 38 的 Kaiser 窗口进行计算。

using TySignalProcessing
using TyMath
using TyPlot
Fs = 10000
f = 2100
t = [0:(1 / Fs):1;]
rng = MT19937ar(5489)
x = tanh.(sin.(2 * pi * f * t) .+ 0.1) + 0.001 * randn(rng, length(t))
periodogram(x, kaiser(length(x), 38), [], Fs, "power"; plotfig=true)

谐波在 4.2 kHz、6.3 kHz、8.4 kHz、10.5 kHz、12.6 kHz 和 14.7 kHz 的频率下从噪声中突显出来。除第一个频率外,其他频率都高于奈奎斯特频率。谐波分别为 3.7 kHz、1.6 kHz、0.5 kHz、2.6 kHz 和 4.7 kHz。

计算信号的信噪比。默认情况下,snr 将混叠谐波视为噪声的一部分。

figure(1)
SNR1, = snr(x, Fs, 7; plotfig=true)

重复计算,但现在将混叠谐波视为信号的一部分。

figure(2)
SNR2, = snr(x, Fs, 7; harmType="aliased", plotfig=true)
噪声功率

创建以48 kHz采样的正弦信号。该信号具有 1 kHz 的基频和单位振幅。此外,它还包含一个 2 kHz 谐波,振幅为一半,加性噪声方差为 0.1² 。

using TySignalProcessing
using TyMath

fs = 48e3
t = [0:1/fs:1-1/fs;]
A = 1.0
powfund = A^2 / 2
a = 0.4
powharm = a^2 / 2
s = 0.1
varnoise = s^2
rng = MT19937ar(5489)
x = A * cos.(2 * pi * 1000 * t) + a * sin.(2 * pi * 2000 * t) + s * randn(rng, size(t))

计算信号中的噪声功率。验证其是否符合定义。

SNR, npow = snr(x, fs)
compare = [10 * log10(powfund) - npow SNR]
compare = 1×2 Matrix{Float64}:
 17.0281  17.0178
放大信号信噪比

生成以 50 kHz 采样的频率为 2.5 kHz 的正弦波。重置随机数生成器。将标准偏差为 0.00005 的高斯白噪声添加到信号中。通过弱非线性放大器传递结果。绘制 SNR。

using TySignalProcessing
using TyMath
using TyPlot
fs = 5e4
f0 = 2.5e3
N = 1024
t = [0:(N - 1);] / fs
rng = MT19937ar(5489)
ct = cos.(2 * pi * f0 * t)
cd2 = ct + 0.00005 * randn(rng, size(ct))

amp = [1e-5, 5e-6, -1e-3, 6e-5, 1, 25e-3]
sgn = polyval(amp, cd2);

SNR, = snr(sgn, fs; plotfig=true)
title(@sprintf("SNR: %.4f dB",SNR))

直流分量和所有谐波(包括基波)均不包括在噪声测量中。基波和谐波被标记。

# 输入参数

xi - 输入信号
向量 | 矩阵 | N-D 数组

输入信号,指定为向量、矩阵或 N-D 数组。

数据类型: Float

复数支持:

y-噪声估计
向量 | 矩阵 | N-D 数组

输入信号中噪声的估计,指定为与xi维数相同的向量、矩阵或 N-D 数组。

数据类型: Float

复数支持:

x - 实值正弦输入信号
向量

实值正弦输入信号,指定为行或列向量。

数据类型: Float

fs - 采样率
1(默认) | 正实标量

采样率,指定为正标量。采样率是每单位时间的采样数。如果时间单位为秒,则采样率的单位为赫兹。

数据类型: Float

n - 谐波数
6(默认)| 正整数标量

从 SNR 计算中排除的谐波数,指定为正整数标量。n 的默认值为 6。

数据类型: Int

pxx - 单边 PSD 估计
向量

单侧功率谱密度估计,指定为实值非负列向量。

功率谱密度必须以线性单位表示,而不是分贝。使用 db2pow 将分贝值转换为功率值。

例子:pxx,f = ty_periodogram(cos.(pi./[4;2]*(0:159)')'+randn(160,2)) 指定以 2π Hz 采样的噪声双通道正弦波的周期图 PSD 估计及其计算频率。

数据类型: Float

f - 周期频率
实值行或列向量

单边 PSD 估计的周期频率 pxx,指定为行或列向量。f 的第一个元素必须为 0。

数据类型: Float

sxx - 功率谱
非负实值行或列向量

功率谱,指定为实值非负行或列向量。

功率谱必须用线性单位表示,而不是分贝。使用 db2pow 将分贝值转换为功率值。

例子:sxx,w = periodogram(cos(pi./[4;2]*(0:159))' + randn(160,2),"power") 指定嵌入在高斯白噪声中的双通道正弦波的周期图功率谱估计以及计算时的归一化频率。

数据类型: Float

rbw - 分辨率带宽
正标量

分辨率带宽,指定为正标量。分辨率带宽是离散傅立叶变换的频率分辨率和窗口的等效噪声带宽的乘积。

数据类型: Float

# 输出参数

r - 信噪比
实值标量

信噪比,以相对于载波(dBc)的分贝表示,作为实值标量返回。如果输入信号不是正弦信号,则以分贝(dB)为单位返回 SNR。

noisepow - 总噪声功率
实值标量

输入信号的非谐波分量的总噪声功率,作为实值标量返回。

# 更多关于

失真测量功能

函数 snr 测量由正弦激励的弱非线性系统的响应。

当给定时域输入时,snr 使用具有较大旁瓣衰减的 Kaiser 窗口执行周期图。为了找到基频,该算法在周期图中搜索最大的非零频谱分量。然后计算所有相邻箱子的中心力矩,这些箱子从最大值开始单调减小。为了可检测,基波应至少位于第二个频率槽中。高次谐波是基频的整数倍。如果一个谐波位于另一个谐波附近的单调递减区域内,则认为其功率属于较大的谐波。这种较大的谐波可能是基波,也可能不是。

该函数使用仅包含噪声的区域中的中值功率估计噪声级。计算中不包括直流分量。每个点的噪声是估计水平或点的坐标,以较小者为准。然后从信号和谐波的值中减去噪声。

如果基波不是信号中的最高频谱分量,则 snr 失败。

确保频率分量相距足够远,以适应 Kaiser 窗口的旁瓣宽度。如果这不可行,您可以使用 "power" 标志并计算具有不同窗口的周期图。

# 另请参阅

sfdr | sinad | thd | toi