Другими словами: имеем входной сигнал. Имеем 2 способа квантования: просто округление через функцию round и второй способ - добавление равномерного шума с диапазоном плюс-минус половина младшего разряда (это способ не столько квантования, сколько моделирования квантования). Шум определяется как разность результирующего квантованного сигнала и исходного, до квантования. Затем рассчитывается ОСШ.
Так вот, если входной сигнал является равномерным случайным распределением, то оба способа квантования дают одинаковый ОСШ, порядка 78 дБ для 13 битов. Это хорошо согласуется с теорией о 6 дБ на бит.
Однако, если входной сигнал - комплексная экспонента, то для неё первый способ даёт ОСШ 79,5 дБ, а второй способ - на 0,5 дБ лучше.
Хочу понять природу возникновения разницы.
Привожу матлабовский код и картинку с результатом:
CODE
%%
numParam.bwChIn = 13;
snrQ = [];
snrR = [];
% range for Ns order of power
nSOrdRng = 3 : 7;
fs = 1.25e6; % sample rate
Ts = 1/fs; % sample period
% frequency of input signal
f_x = fs/16;
T_x = 1/f_x;
% % signalType = 'random';
signalType = 'harmonic';
for nSOrd = nSOrdRng
Ns = 10^nSOrd;
% adjusting Ns to be integer number of input signal periods
fRatio = Ns * Ts / T_x;
Ns = round(fRatio) * T_x / Ts;
% create time scale
t = 0 : Ts : (Ns-1)*Ts;
% signal generation itself
if strcmp(signalType, 'harmonic')
x = exp(1i * 2 * pi * t * f_x).';
else
x = complex(rand(Ns, 1), rand(Ns, 1)) * 2 - (1 + 1i);
end
quantNoiseIn = (complex(rand(size(x)), rand(size(x))) - (0.5 + 1i*0.5)) / 2^(numParam.bwChIn-1);
xQ = x + quantNoiseIn;
xQErr = xQ - x;
xPwr = x' * x;
xErrPwr = xQErr' * xQErr;
snrQ = [snrQ 10*log10(xPwr/xErrPwr)];
xR = round(x*2^(numParam.bwChIn-1)) / 2^(numParam.bwChIn-1);
xRErr = xR - x;
xErrPwr = xRErr' * xRErr;
snrR = [snrR 10*log10(xPwr/xErrPwr)];
end
figure; hold on; grid on; plot(nSOrdRng, snrQ, nSOrdRng, snrR); hold off;
numParam.bwChIn = 13;
snrQ = [];
snrR = [];
% range for Ns order of power
nSOrdRng = 3 : 7;
fs = 1.25e6; % sample rate
Ts = 1/fs; % sample period
% frequency of input signal
f_x = fs/16;
T_x = 1/f_x;
% % signalType = 'random';
signalType = 'harmonic';
for nSOrd = nSOrdRng
Ns = 10^nSOrd;
% adjusting Ns to be integer number of input signal periods
fRatio = Ns * Ts / T_x;
Ns = round(fRatio) * T_x / Ts;
% create time scale
t = 0 : Ts : (Ns-1)*Ts;
% signal generation itself
if strcmp(signalType, 'harmonic')
x = exp(1i * 2 * pi * t * f_x).';
else
x = complex(rand(Ns, 1), rand(Ns, 1)) * 2 - (1 + 1i);
end
quantNoiseIn = (complex(rand(size(x)), rand(size(x))) - (0.5 + 1i*0.5)) / 2^(numParam.bwChIn-1);
xQ = x + quantNoiseIn;
xQErr = xQ - x;
xPwr = x' * x;
xErrPwr = xQErr' * xQErr;
snrQ = [snrQ 10*log10(xPwr/xErrPwr)];
xR = round(x*2^(numParam.bwChIn-1)) / 2^(numParam.bwChIn-1);
xRErr = xR - x;
xErrPwr = xRErr' * xRErr;
snrR = [snrR 10*log10(xPwr/xErrPwr)];
end
figure; hold on; grid on; plot(nSOrdRng, snrQ, nSOrdRng, snrR); hold off;
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
На картинке красным - первый способ, синим - второй. На левой картинке сигнал - гармонический, на правой - рандомный. В исходнике можно переключить signalType для рандомного и гармонического сигнала. По оси Х отложены степени числа точек выборки сигнала, для которой производился расчёт. Т.е. 7 - это 1е7 точек. По оси Y - ОСШ в дБ.
ЗЫ: маленько отредактировал сообщение. Добавил правую картинку для рандомного сигнала. Прошу заметить, что для рандомного и гармонического сигнала отличаются значения ОСШ, полученные даже путём округления round (первый способ): рандомный - 78 дБ, а гармонический - 79,5 дБ.
Однако для рандомного сигнала оба способа дают одинаковый результат, а для гармонического - другой результат, да ещё и отличающийся между способами. Мне в первую очередь хочется докопаться, почему есть различие ОСШ между двумя способами для гармонического сигнала. А во вторую очередь - почему отличается ОСШ для способа округления через round для случайного и гармонического сигнала.
И ещё: попробовал перейти на чисто вещественные числа. Поведение то же, числа те же.