信号の SQNR を計算したいと考えています。
fs = 44100;
fs_orig=44100;
nbits = 16;
[x1,fs,nbits]=wavread('Mysong.wav');
y=x1(:,1);
y=y*32768;
y=round(y);
%filter your data
[B1,A1] = butter(4,[90 715]/(fs_orig/2),'bandpass');
dataOut1 = filter(B1, A1, dataIn); % // filter command filters your music
まず、最下位 4 ビットを「削除」します。だから私はサンプルを16で割り、丸めてから16を掛け直しました。
d1 = dataOut1*16;
d2 = round(d1);
a = int32(d1);
b = int32(16);
C = idivide(a, b);
r = snr(dataOut1,fs,fs)
d = snr(double(C),fs,fs)
error_signal = minus(d,r)
%express in db
error_db = 20*log10(error_signal)
エラー信号 (元の信号と再量子化された信号の差) を計算しました。6.4180e-05 という結果になりました。これは可能ですか?それを db に変換すると、-83.8519 db という結果になりました。これは正しいです?私がしたことは正しいですか?値は非常に大きく見えます。