Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: модель шума квантования как равномерное распределение при входном гармоническом сигнале немного не совпадает со случайным сигналом
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Математика и Физика
Krys
Здравствуйте. Модель шума квантования как равномерное распределение при входном гармоническом сигнале немного не совпадает со случайным сигналом, расхождение порядка 0,5 дБ. Почему?
Другими словами: имеем входной сигнал. Имеем 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;


Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла

На картинке красным - первый способ, синим - второй. На левой картинке сигнал - гармонический, на правой - рандомный. В исходнике можно переключить signalType для рандомного и гармонического сигнала. По оси Х отложены степени числа точек выборки сигнала, для которой производился расчёт. Т.е. 7 - это 1е7 точек. По оси Y - ОСШ в дБ.

ЗЫ: маленько отредактировал сообщение. Добавил правую картинку для рандомного сигнала. Прошу заметить, что для рандомного и гармонического сигнала отличаются значения ОСШ, полученные даже путём округления round (первый способ): рандомный - 78 дБ, а гармонический - 79,5 дБ.
Однако для рандомного сигнала оба способа дают одинаковый результат, а для гармонического - другой результат, да ещё и отличающийся между способами. Мне в первую очередь хочется докопаться, почему есть различие ОСШ между двумя способами для гармонического сигнала. А во вторую очередь - почему отличается ОСШ для способа округления через round для случайного и гармонического сигнала.

И ещё: попробовал перейти на чисто вещественные числа. Поведение то же, числа те же.
Krys
прошу обратить внимание: маленько отредактировал сообщение (выделено жирным и подчёркнуто, а также описано в "ЗЫ").
x736C
Krys, если строчку:
Код
x = exp(0 + 1i * 2 * pi * t * f_x).';

заменить на:
Код
x = exp(i*linspace(0, 2*pi, 10^6)).';

Значения уравниваются по обоим методам, но становятся ~80 дБ для nSOrdRng = 6
Для 7 не могу посчитать, так как мой старичок out of memory.

Почему так происходит, не знаю и нет времени вникать (хотя есть догадки),
но надеюсь, эта информация Вам поможет.

upd. 10^6 можно заменить на Ваши переменные t, f_x.
Нет времени сделать красивее.
x736C
Появилось время покопаться.

x = exp(0 + 1i * 2 * pi * t * f_x).';
Это выражение формирует огромный массив точек, который имеет всего несколько координат.
Нажмите для просмотра прикрепленного файла
Тогда как для 'случайного сигнала' у Вас формируется массив точек, ограниченный координатами
(-1 - 1i), (1 + 1i).
Нажмите для просмотра прикрепленного файла

Выражение:
x = exp(i * linspace(0, 2*pi, 10^6)).';
формирует массив точек на окружности. Конкретно в Вашем случае 10^6 точек.
Нажмите для просмотра прикрепленного файла

Таким образом, для первого случая, на мой взгляд, не хватает точек для нужного Вам результата.
И происходит очень быстрое схождение ОСШ к наблюдаемым величинам. Почему именно к таким?
Полагаю, особенность округления. Добавьте больше точек, и влияние погрешности станет меньше.

С другой стороны, Вы пытаетесь, насколько понимаю, сделать гармонический сигнал квантованным.
Поиграйте со знаменателем в выражении f_x = fs/16;
Соотношение начнет меняться и на определенных значениях знаменателя, наоборот, рандомный способ покажет лучшее ОСШ.
В общем, нужно изменить Ваш алгоритм так, чтобы точек стало больше. Поменяйте кратность частот. Как это сделать, Вам виднее.
Самурай
Цитата(Krys @ Mar 31 2015, 11:15) *
...
Так вот, если входной сигнал является равномерным случайным распределением, то оба способа квантования дают одинаковый ОСШ, порядка 78 дБ для 13 битов. Это хорошо согласуется с теорией о 6 дБ на бит.
Однако, если входной сигнал - комплексная экспонента, то для неё первый способ даёт ОСШ 79,5 дБ, а второй способ - на 0,5 дБ лучше.
Хочу понять природу возникновения разницы.
...


У Вас шум квантования в скрипте НЕ ЗАВИСИТ от сигнала и имеет ОДИНАКОВУЮ мощность, что для комплексной экспоненты, что для случайной последовательности. Однако почему Вы решили, что энергия первой таки равна энергии второй?sm.gif Я вот вижу, что они как раз имеют разность в 1.7дБ.


Krys
Самурай, спасибо, что подметили эту особенность: действительно, с чего это я решил, что энергия гармонического сигнала будет равна энергии случайного? ))) Посчитал на листочке для вещественных сигналов: отношение энергии получается 1,5 раза, что, как раз, те самые 1,7 дБ.

x736C, и Вам спасибо. Действительно, ведь я из всей синусоиды беру всего 16 точек, а хочу получить почти случайное распределение ошибок. Нужно тогда уж период синусоиды увеличить, чтобы больше промежуточных точек на периоде было с разными уровнями.

Когда устранил эти 2 проблемы, то результаты стали предсказуемыми. Большое спасибо за науку!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.