Main Content

snr

信噪比

说明

示例

r = snr(xi,y) 通过计算信号 xi 的幅值平方和与噪声 y 之比,返回以 dB 为单位的信噪比 (SNR):

r = mag2db(rssq(xi(:))/rssq(y(:))).

y 必须具有与 xi 相同的维度。如果输入信号不一定是正弦信号,并且您有噪声的估计值,请使用这种形式。

示例

r = snr(x) 返回相对于实数值正弦输入信号 x 的载波 (dBc) 的 SNR(以 dB 为单位)。SNR 是使用与输入相同长度的修正周期图来确定的。修正周期图使用 β = 38 的凯塞窗。计算结果时将排除前六个谐波的功率,但包括基频。

示例

r = snr(x,fs,n) 返回以速率 fs 采样的实数正弦输入信号 x 的 SNR(以 dBc 为单位)。计算时将排除最低的 n 个谐波的功率,但包括基频。

示例

r = snr(pxx,f,"psd") 将输入 pxx 指定为单边功率谱密度 (PSD) 估计值。参量 f 是生成 pxx 估计值时的频率的向量。计算噪声时将排除前六个谐波的功率,但包括基频。

r = snr(pxx,f,n,"psd") 指定计算 SNR 时要排除的谐波数量 nn 的默认值为 6 且包括基频。

示例

r = snr(sxx,f,rbw,"power") 将输入 sxx 指定为实信号的单边功率谱。输入 rbw 是对每个功率估计值进行积分的分辨率带宽。

r = snr(sxx,f,rbw,n,"power") 指定计算 SNR 时要排除的谐波数量 nn 的默认值为 6 且包括基频。

示例

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

示例

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

示例

不带输出参量的 snr(___) 用于在当前图窗窗口中绘制信号的频谱并标注其主要特征。它使用不同颜色来绘制基本分量、DC 值和谐波以及噪声。SNR 出现在图的上方。此功能适用于上面列出的所有语法,但 snr(x,y) 除外。

示例

全部折叠

生成一个 20 毫秒的矩形脉冲,采样率为 10 kHz,采样时间为 2 秒。

Tpulse = 20e-3;
Fs = 10e3;
t = -1:1/Fs:1;
x = rectpuls(t,Tpulse);

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

rng default

SNR = 53;
y = randn(size(x))*std(x)/db2mag(SNR);

s = x + y;

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

pulseSNR = snr(x,y)
pulseSNR = 53.1255

计算并比较信号的信噪比 (SNR)、总谐波失真 (THD) 以及信号的信噪失真比 (SINAD)。

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

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(size(t));

验证 SNR、THD 和 SINAD 是否符合其定义。

SNR = snr(x);
defSNR = 10*log10(powfund/varnoise);
SN = [SNR defSNR]
SN = 1×2

   17.0178   16.9897

THD = thd(x);
defTHD = 10*log10(powharm/powfund);
TH = [THD defTHD]
TH = 1×2

   -7.9546   -7.9588

SINAD = sinad(x);
defSINAD = 10*log10(powfund/(powharm+varnoise));
SI = [SINAD defSINAD]
SI = 1×2

    7.4571    7.4473

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

Fi = 2500;
Fs = 48e3;
N = 1024;
x = sin(2*pi*Fi/Fs*(1:N)) + 0.001*randn(1,N);
SNR = snr(x,Fs)
SNR = 57.7103

绘制频谱并注释 SNR。

snr(x,Fs);

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

rng default
Fi = 2500;
Fs = 48e3;
N = 1024;
x = sin(2*pi*Fi/Fs*(1:N)) + 0.00001*randn(1,N);

w = kaiser(numel(x),38);
[Pxx, F] = periodogram(x,w,numel(x),Fs);
SNR = snr(Pxx,F,'psd')
SNR = 97.7446

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

rng default
Fi = 2500;
Fs = 48e3;
N = 1024;
x = sin(2*pi*Fi/Fs*(1:N)) + 0.00001*randn(1,N);

w = kaiser(numel(x),38);
[Sxx, F] = periodogram(x,w,numel(x),Fs,'power');
rbw = enbw(w,Fs);
SNR = snr(Sxx,F,rbw,'power')
SNR = 97.7446

绘制信号的频谱并注释 SNR。

snr(Sxx,F,rbw,'power');

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

Fs = 10000;
f = 2100;

t = 0:1/Fs:1; 
x = tanh(sin(2*pi*f*t)+0.1) + 0.001*randn(1,length(t));

periodogram(x,kaiser(length(x),38),[],Fs,'power')

谐波在 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 将混叠谐波视为噪声的一部分。

snr(x,Fs,7);

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

snr(x,Fs,7,'aliased');

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

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(size(t));

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

[SNR,npow] = snr(x,fs);
compare = [10*log10(powfund)-npow SNR]
compare = 1×2

   17.0281   17.0178

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

rng default

fs = 5e4; 
f0 = 2.5e3;
N = 1024;
t = (0:N-1)/fs;

ct = cos(2*pi*f0*t);
cd = ct + 0.00005*randn(size(ct));

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

snr(sgn,fs);

噪声测量中不包括 DC 分量和所有谐波(包括基频)。标注基频和谐波。

输入参数

全部折叠

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

数据类型: double | single
复数支持:

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

数据类型: double | single
复数支持:

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

数据类型: double | single

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

数据类型: double | single

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

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

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

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

数据类型: double | single

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

数据类型: double | single

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

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

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

数据类型: double | single

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

数据类型: double | single

输出参量

全部折叠

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

数据类型: double | single

输入信号的非谐波分量的总噪声功率,以实数值标量形式返回。

数据类型: double | single

详细信息

全部折叠

失真测量函数

函数 thdsfdrsinadsnr 用于测量由正弦波激励的弱非线性系统的响应。

当提供时域输入时,snr 使用带有大旁瓣衰减的凯塞窗执行周期图。为了找到基频,该算法会在周期图中搜索最大的非零频谱分量。然后,它会计算所有相邻 bin 的中心矩,这些 bin 从最大值单调递减。为了可被检测到,基频应至少位于第二个频率 bin 中。高次谐波是基频的整数倍。如果一个谐波位于另一个谐波邻域中的单调递减区域内,则我们认为其功率属于较大的谐波。此较大的谐波不一定是基频。

该函数使用仅含噪区域中的中位数功率来估计噪声电平。计算中不包括 DC 分量。每个点处的噪声是该点的估计电平或纵坐标,以较小者为准。该噪声随后将从信号和谐波值中减去。

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

请确保频率分量相距甚远,足以适应凯塞窗的旁瓣宽度。如果这种情况不可行,您可以使用 "power" 标志,并使用不同的窗计算周期图。

扩展功能

版本历史记录

在 R2013b 中推出

全部展开

另请参阅

| | |