Krys 2 31 марта, 2015 Опубликовано 31 марта, 2015 (изменено) · Жалоба Здравствуйте. Модель шума квантования как равномерное распределение при входном гармоническом сигнале немного не совпадает со случайным сигналом, расхождение порядка 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; На картинке красным - первый способ, синим - второй. На левой картинке сигнал - гармонический, на правой - рандомный. В исходнике можно переключить signalType для рандомного и гармонического сигнала. По оси Х отложены степени числа точек выборки сигнала, для которой производился расчёт. Т.е. 7 - это 1е7 точек. По оси Y - ОСШ в дБ. ЗЫ: маленько отредактировал сообщение. Добавил правую картинку для рандомного сигнала. Прошу заметить, что для рандомного и гармонического сигнала отличаются значения ОСШ, полученные даже путём округления round (первый способ): рандомный - 78 дБ, а гармонический - 79,5 дБ. Однако для рандомного сигнала оба способа дают одинаковый результат, а для гармонического - другой результат, да ещё и отличающийся между способами. Мне в первую очередь хочется докопаться, почему есть различие ОСШ между двумя способами для гармонического сигнала. А во вторую очередь - почему отличается ОСШ для способа округления через round для случайного и гармонического сигнала. И ещё: попробовал перейти на чисто вещественные числа. Поведение то же, числа те же. Изменено 31 марта, 2015 пользователем Krys Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 31 марта, 2015 Опубликовано 31 марта, 2015 · Жалоба прошу обратить внимание: маленько отредактировал сообщение (выделено жирным и подчёркнуто, а также описано в "ЗЫ"). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 31 марта, 2015 Опубликовано 31 марта, 2015 (изменено) · Жалоба 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. Нет времени сделать красивее. Изменено 31 марта, 2015 пользователем x736C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 31 марта, 2015 Опубликовано 31 марта, 2015 (изменено) · Жалоба Появилось время покопаться. 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; Соотношение начнет меняться и на определенных значениях знаменателя, наоборот, рандомный способ покажет лучшее ОСШ. В общем, нужно изменить Ваш алгоритм так, чтобы точек стало больше. Поменяйте кратность частот. Как это сделать, Вам виднее. Изменено 31 марта, 2015 пользователем x736C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 1 апреля, 2015 Опубликовано 1 апреля, 2015 · Жалоба ... Так вот, если входной сигнал является равномерным случайным распределением, то оба способа квантования дают одинаковый ОСШ, порядка 78 дБ для 13 битов. Это хорошо согласуется с теорией о 6 дБ на бит. Однако, если входной сигнал - комплексная экспонента, то для неё первый способ даёт ОСШ 79,5 дБ, а второй способ - на 0,5 дБ лучше. Хочу понять природу возникновения разницы. ... У Вас шум квантования в скрипте НЕ ЗАВИСИТ от сигнала и имеет ОДИНАКОВУЮ мощность, что для комплексной экспоненты, что для случайной последовательности. Однако почему Вы решили, что энергия первой таки равна энергии второй?:) Я вот вижу, что они как раз имеют разность в 1.7дБ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Krys 2 1 апреля, 2015 Опубликовано 1 апреля, 2015 · Жалоба Самурай, спасибо, что подметили эту особенность: действительно, с чего это я решил, что энергия гармонического сигнала будет равна энергии случайного? ))) Посчитал на листочке для вещественных сигналов: отношение энергии получается 1,5 раза, что, как раз, те самые 1,7 дБ. x736C, и Вам спасибо. Действительно, ведь я из всей синусоиды беру всего 16 точек, а хочу получить почти случайное распределение ошибок. Нужно тогда уж период синусоиды увеличить, чтобы больше промежуточных точек на периоде было с разными уровнями. Когда устранил эти 2 проблемы, то результаты стали предсказуемыми. Большое спасибо за науку! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться