yProcessingClub

すみません、許してください

matlab SN比計算 SN比から信号の大きさを逆算する

yuri-processing-club.hatenablog.com

こちらの記事でSN比を指定してノイズの大きさを調整する計算を紹介した。
matlabにて計算が正しいかを確認する。

matlabコード

% sin信号及び白色ノイズを生成
% 自前の計算及び標準の関数を用いてSN比を計算し、表示する
% 指定したSN比になるようノイズのパワーを調整する

Fs = 44100;                 % サンプリング周波数(Hz)
T = 10;                     % 信号の時間長さ(秒)
N = Fs * T;                 % 信号のサンプル数

n = randn(1, N);            % N点の白色ノイズ

% sin信号の生成
f = 100;                    % sin波の周波数(Hz)
t = ((1:N) - 1) / Fs;       % 周期1/Fs, サンプル数Nの時間配列
s = sin(2 * pi * f * t);    % N点, 周波数fのsin波

% パワーの計算
Pn = n * n';                % ノイズのパワー(2乗の和)
Ps = s * s';                % チャープ信号のパワー(2乗の和)

% SN比の計算
SNR = 10 * log10(Ps/Pn);
SNR1 = snr(s, n);           % matlab標準の関数
fprintf('調整前:SNR = %fdB, SNR1 = %fdB\n', SNR, SNR1);

% 指定したSN比となるようにノイズの大きさを調整する
SNR2 = -30;                 % 指定するSN比(dB)
coef = 10^((SNR - SNR2)/20);% ノイズの大きさを調整する係数
n = coef * n;               % ノイズの大きさを調整

% 再度SN比の計算
Pn = n * n';                % ノイズのパワーを再度求める
SNR = 10 * log10(Ps/Pn);
SNR1 = snr(s, n);
fprintf('調整後:SNR = %fdB, SNR1 = %fdB\n', SNR, SNR1);

実行結果

調整前:SNR = -3.006121dB, SNR1 = -3.006121dB
調整後:SNR = -30.000000dB, SNR1 = -30.000000dB


となり、正しい結果となった。