Перейти к содержанию
    

модель шума квантования как равномерное распределение при входном гармоническом сигнале немного не совпадает со случайным сигналом

Здравствуйте. Модель шума квантования как равномерное распределение при входном гармоническом сигнале немного не совпадает со случайным сигналом, расхождение порядка 0,5 дБ. Почему?

Другими словами: имеем входной сигнал. Имеем 2 способа квантования: просто округление через функцию round и второй способ - добавление равномерного шума с диапазоном плюс-минус половина младшего разряда (это способ не столько квантования, сколько моделирования квантования). Шум определяется как разность результирующего квантованного сигнала и исходного, до квантования. Затем рассчитывается ОСШ.

Так вот, если входной сигнал является равномерным случайным распределением, то оба способа квантования дают одинаковый ОСШ, порядка 78 дБ для 13 битов. Это хорошо согласуется с теорией о 6 дБ на бит.

Однако, если входной сигнал - комплексная экспонента, то для неё первый способ даёт ОСШ 79,5 дБ, а второй способ - на 0,5 дБ лучше.

Хочу понять природу возникновения разницы.

Привожу матлабовский код и картинку с результатом:

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

 

post-13271-1427785884_thumb.jpgpost-13271-1427791056_thumb.jpg

 

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

 

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

Однако для рандомного сигнала оба способа дают одинаковый результат, а для гармонического - другой результат, да ещё и отличающийся между способами. Мне в первую очередь хочется докопаться, почему есть различие ОСШ между двумя способами для гармонического сигнала. А во вторую очередь - почему отличается ОСШ для способа округления через round для случайного и гармонического сигнала.

 

И ещё: попробовал перейти на чисто вещественные числа. Поведение то же, числа те же.

Изменено пользователем Krys

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прошу обратить внимание: маленько отредактировал сообщение (выделено жирным и подчёркнуто, а также описано в "ЗЫ").

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Это выражение формирует огромный массив точек, который имеет всего несколько координат.

post-14942-1427819587_thumb.png

Тогда как для 'случайного сигнала' у Вас формируется массив точек, ограниченный координатами

(-1 - 1i), (1 + 1i).

post-14942-1427819724_thumb.png

 

Выражение:

x = exp(i * linspace(0, 2*pi, 10^6)).';

формирует массив точек на окружности. Конкретно в Вашем случае 10^6 точек.

post-14942-1427819593_thumb.png

 

Таким образом, для первого случая, на мой взгляд, не хватает точек для нужного Вам результата.

И происходит очень быстрое схождение ОСШ к наблюдаемым величинам. Почему именно к таким?

Полагаю, особенность округления. Добавьте больше точек, и влияние погрешности станет меньше.

 

С другой стороны, Вы пытаетесь, насколько понимаю, сделать гармонический сигнал квантованным.

Поиграйте со знаменателем в выражении f_x = fs/16;

Соотношение начнет меняться и на определенных значениях знаменателя, наоборот, рандомный способ покажет лучшее ОСШ.

В общем, нужно изменить Ваш алгоритм так, чтобы точек стало больше. Поменяйте кратность частот. Как это сделать, Вам виднее.

Изменено пользователем x736C

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Так вот, если входной сигнал является равномерным случайным распределением, то оба способа квантования дают одинаковый ОСШ, порядка 78 дБ для 13 битов. Это хорошо согласуется с теорией о 6 дБ на бит.

Однако, если входной сигнал - комплексная экспонента, то для неё первый способ даёт ОСШ 79,5 дБ, а второй способ - на 0,5 дБ лучше.

Хочу понять природу возникновения разницы.

...

 

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Когда устранил эти 2 проблемы, то результаты стали предсказуемыми. Большое спасибо за науку!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...