Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

snr

説明

r = snr(xi,y) は、信号 xi の大きさの 2 乗の和とノイズ y の大きさの 2 乗の和の比を計算し、この信号の S/N 比 (SNR) をデシベル単位で返します。

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

y の次元は xi と同じでなければなりません。入力信号が必ずしも正弦波ではなく、かつノイズが推定されている場合は、この形を使用します。

r = snr(x) は、実数値の正弦波入力信号 x の SNR を、dBc (搬送波に対するデシベル) 単位で返します。SNR は入力と同じ長さの修正ピリオドグラムを使用して決定されます。この修正ピリオドグラムでは、β = 38 のカイザー ウィンドウを使用します。結果から、基本波を含む最初の 6 つの高調波のパワーが除外されています。

r = snr(x,fs,n) は、レート fs でサンプリングされた実数の正弦波入力信号 x の SNR を dBc 単位で返します。計算からは、基本波を含めて最下位の n 個の高調波に含まれるパワーが除外されています。

r = snr(pxx,f,"psd") では、入力 pxx を片側 PSD (パワー スペクトル密度) 推定として指定します。引数 f は、pxx の推定が発生する周波数のベクトルです。ノイズの計算結果からは、基本波を含む最初の 6 つの高調波のパワーが除外されています。

r = snr(pxx,f,n,"psd") では、SNR の計算時に除外する高調波の数 n を指定します。n の既定値は 6 で、この中には基本波が含まれます。

r = snr(sxx,f,rbw,"power") では、入力 sxx を実数信号の片側パワー スペクトルとして指定します。入力 rbw はそれについて各パワー推定が積分される分解能帯域幅です。

r = snr(sxx,f,rbw,n,"power") では、SNR の計算時に除外する高調波の数 n を指定します。n の既定値は 6 で、この中には基本波が含まれます。

r = snr(___,"aliased") では、ナイキスト範囲内にエイリアシングされた基本波の高調波が削除されます。このオプションは、正弦波入力信号がアンダーサンプリングされた場合に使用します。このオプションを指定しない場合、または "omitaliases" に指定した場合、関数は、ナイキスト範囲外にある基本周波数の高調波をノイズとして扱います。

[r,noisepow] = snr(___) はこの他に、信号の高調波以外の成分の全ノイズ パワーも返します。

出力引数を設定せずに snr(___) を使用すると、現在の Figure ウィンドウに信号のスペクトルがプロットされ、主な特徴にラベルが付けられます。スペクトルの基本成分、DC 値、高調波およびノイズが、さまざまな色で描画されます。プロットの上に SNR と表示されます。この機能は、上記にリストした構文のうち、snr(x,y) 以外のすべてで動作します。

すべて折りたたむ

10 kHz で 2 秒間サンプリングされる 20 ミリ秒の矩形パルスを生成します。

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

S/N 比 (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

信号の S/N 比 (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);

Figure contains an axes object. The axes object with title SNR: 57.71 dB, xlabel Frequency (kHz), ylabel Power (dB) contains 17 objects of type line, text. These objects represent Fundamental, Noise, DC and Harmonics (excluded).

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');

Figure contains an axes object. The axes object with title SNR: 97.74 dB, xlabel Frequency (kHz), ylabel Power (dB) contains 17 objects of type line, text. These objects represent Fundamental, Noise, DC and Harmonics (excluded).

入力が 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')

Figure contains an axes object. The axes object with title Periodogram Power Spectrum Estimate, xlabel Frequency (kHz), ylabel Power (dB) contains an object of type line.

高調波は周波数 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 にエイリアシングされます。

信号の S/N 比を計算します。snr は、既定で、エイリアシングされた高調波をノイズの一部として扱います。

snr(x,Fs,7);

Figure contains an axes object. The axes object with title SNR: 23.62 dB, xlabel Frequency (kHz), ylabel Power (dB) contains 14 objects of type line, text. These objects represent Fundamental, Noise, DC and Harmonics (excluded).

計算を繰り返しますが、今度はエイリアシングされた高調波を信号の一部として扱います。

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

Figure contains an axes object. The axes object with title SNR: 55.23 dB, xlabel Frequency (kHz), ylabel Power (dB) contains 19 objects of type line, text. These objects represent Fundamental, Noise, DC and Harmonics (excluded).

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);

Figure contains an axes object. The axes object with title SNR: 83.80 dB, xlabel Frequency (kHz), ylabel Power (dB) contains 17 objects of type line, text. These objects represent Fundamental, Noise, DC and Harmonics (excluded).

基本波を含むすべての高調波と DC 成分は、ノイズの測定では考慮されません。基本波と高調波にはラベルが付けられます。

入力引数

すべて折りたたむ

入力信号。ベクトル、行列、または N 次元配列として指定します。

データ型: double | single
複素数のサポート: あり

入力信号のノイズの推定値。ベクトル、行列、または xi と同じ次元の N 次元配列として指定します。

データ型: double | single
複素数のサポート: あり

実数値正弦波入力信号。行ベクトルまたは列ベクトルで指定されます。

データ型: double | single

サンプル レート。正のスカラーで指定します。サンプル レートは単位時間あたりのサンプル数です。時間の単位が秒の場合、サンプル レートの単位は Hz です。

データ型: double | single

正の整数スカラーとして指定される、SNR の計算から除外する高調波の数。n の既定値は 6 です。

非負の実数値列ベクトルとして指定される片側パワー スペクトル密度推定。

パワー スペクトル密度は、デシベル単位ではなく、線形単位で表さなければなりません。デシベル値をパワー値に変換するには、db2pow を使用します。

例: [pxx,f] = periodogram(cos(pi./[4;2]*(0:159))'+randn(160,2)) は、2π Hz でサンプリングされたノイズの多い 2 チャネル正弦波のピリオドグラム PSD 推定値とそれについて計算される周波数を指定します。

データ型: double | single

片側 PSD 推定 pxx の巡回周波数。行ベクトルまたは列ベクトルとして指定します。f の最初の要素は 0 でなければなりません。

データ型: double | single

パワー スペクトル。非負の実数値行ベクトルまたは列ベクトルで指定されます。

パワー スペクトルは、デシベル単位ではなく線形単位で表さなければなりません。デシベル値をパワー値に変換するには、db2pow を使用します。

例: [sxx,w] = periodogram(cos(pi./[4;2]*(0:159))'+randn(160,2),"power") では、ホワイト ガウス ノイズに組み込まれる 2 チャネルの正弦波のピリオドグラム パワー スペクトル推定と、計算に使う正規化周波数を指定します。

データ型: double | single

分解能帯域幅。正のスカラーで指定されます。この分解能帯域幅は、離散フーリエ変換の周波数分解能と、ウィンドウの等価ノイズ帯域幅の積です。

データ型: double | single

出力引数

すべて折りたたむ

S/N 比。搬送波に対するデシベル (dBc) 単位で表される実数値のスカラーとして返されます。入力信号が正弦波でない場合、SNR はデシベル (dB) 単位で返されます。

データ型: double | single

実数値のスカラーとして返される、入力信号の高調波以外の成分の全ノイズ パワー。

データ型: double | single

詳細

すべて折りたたむ

歪み測定関数

関数 thdsfdrsinad および snr は、正弦波による入力刺激を受けた弱非線形システムの応答を測定します。

時間領域の入力が与えられると、snr は、サイドローブ減衰量の大きいカイザー ウィンドウを使い、ピリオドグラムを実行します。基本周波数を求めるため、アルゴリズムは、最大の非ゼロスペクトル成分のピリオドグラムを探索します。続いて、最大値から単調に減少するすべての隣接するビンの中心モーメントを計算します。基本波は、検出可能であるためには、少なくとも 2 番目の周波数ビンに属している必要があります。高い高調波成分は基本周波数の整数倍になります。高調波が別の高調波の近傍にある単調減少領域にある場合、そのパワーは大きい方の高調波に属するものと見なされます。この大きい方の高調波は、基本波である場合も、そうでない場合もあります。

この関数では、ノイズのみを含む領域のパワーの中央値を使用してノイズを推定します。DC 成分は計算では考慮されません。各点のノイズは、推定されたレベルか、その点の縦座標のうち、小さい方になります。このノイズが、信号および高調波の値から減算されます。

基本波が信号の最も高いスペクトル成分でない場合、snr は失敗します。

周波数成分がカイザー ウィンドウのサイドローブ幅を許容できるよう、互いを十分離してください。これが不可能な場合は、"power" フラグを使用し、別のウィンドウを使ってピリオドグラムを計算することができます。

拡張機能

バージョン履歴

R2013b で導入

すべて展開する

参考

| | |