Квантование сложного сигнала с помощью универсального квантователя в Matlab

У меня есть сигнал, который имеет сложное нормальное распределение со средним значением 0 и дисперсией 1. Я хочу квантовать его с помощью универсального квантователя до 512 уровней. Я генерирую сигнал в MATLAB следующим образом:

s = sqrt(0.5).*(randn(1,numBits) + 1i*randn(1,numBits));

Я квантую сигнал в диапазоне (-1,1) с 512 уровнями следующим образом:

min = -1;

max = 1;

q = (max-min)/2^9;

quantSignal = round(s/q)*q;

Это правильный способ квантования такого сигнала? Я был бы признателен за любой вклад в это.


person rmb    schedule 25.09.2015    source источник
comment
Является ли квантование четко определенной вещью? Если вы знаете, чего хотите достичь, вы сможете определить, является ли ваше решение правильным. Синтаксически говоря, то, что вы написали, разумно. Может быть, вы сможете пояснить, почему это не может быть правильным способом квантования такого сигнала.   -  person Andras Deak    schedule 25.09.2015
comment
Ну, я подумал, что интервала квантования (-1,1) может быть недостаточно для правильного квантования сигнала s. Поскольку я новичок в этой области обработки сигналов, я подумал о том, чтобы получить отзывы об этом! И поэтому я разместил этот вопрос!   -  person rmb    schedule 25.09.2015
comment
Хорошо, в этом случае я позволю ребятам, занимающимся обработкой сигналов, заняться этим: P Если это сильно связано с обработкой сигналов, рассмотрите возможность добавления соответствующего тега (квантование — это маленький и неопределенный тег). Как неспециалист, я бы подумал, что нормальные данные сильно сгруппированы вокруг 0, с несколькими отдаленными точками. Итак: существует ли логарифмическое квантование?   -  person Andras Deak    schedule 25.09.2015
comment
хорошо, я добавлю тег :)   -  person rmb    schedule 25.09.2015


Ответы (1)


Используемая вами формула квантования преобразует входные значения в квантованную версию. Однако это не ограничит результат только 512 уровнями, поскольку ваш входной сигнал может превышать диапазон [-1,+1], и вы не делаете ничего, чтобы ограничить выход квантователя (или вход в этом отношении).

Для ограничения значений вы можете использовать встроенные функции min и max. Однако, поскольку они работают с модулем для комплексного числа, вам придется сначала разделить числа на их действительную и мнимую части. Таким образом, квантование комплексных чисел с действительными и мнимыми частями, каждая из которых ограничена диапазоном [minValue,maxValue], может быть выполнено с помощью:

q = (maxValue-minValue)/(2^9-1);
realPart = min(max(real(s),minValue),maxValue);
realPart = minValue + round((realPart-minValue)/q)*q;
imagPart = min(max(imag(s),minValue),maxValue);
imagPart = minValue + round((imagPart-minValue)/q)*q;
quantSignal = realPart + j*imagPart;

Я упоминал ранее, что ваш нормальный сигнал с единичной дисперсией, как правило, не будет ограничен диапазоном [-1,1] (или любым другим диапазоном, если на то пошло). Таким образом, обычно пытаются минимизировать меру ошибки квантования, такую ​​как среднеквадратическая ошибка (ожидаемое значение квадрата разности между неквантованным входом и соответствующим квантованным выходом).

Для однородного квантователя и заданных характеристик сигнала (в данном случае комплексного сигнала Гаусса) эта среднеквадратическая ошибка является функцией количества уровней квантования и входного диапазона квантователя. Для уровней 512 действительная и мнимая части в идеале должны находиться в пределах примерно +/- 4,2 стандартных отклонения. Поскольку ваше стандартное отклонение равно sqrt(0.5) для действительной и мнимой частей, этого можно достичь с помощью

maxValue = 4.2*sqrt(0.5);
minValue = -maxValue;

Если вам нужно, чтобы действительная и мнимая части вашего квантованного вывода были ограничены определенным диапазоном, вы можете применить коэффициент масштабирования на выходе квантователя (например, разделить на 4.2*sqrt(0.5), чтобы получить действительную и мнимую части, ограниченные до [-1,+1]).

person SleuthEye    schedule 26.09.2015
comment
спасибо за ваш полезный вклад. Однако я хотел бы знать, как вы получили +/- 4,2 для 512 уровней. - person rmb; 27.09.2015
comment
По сути, вычислите среднеквадратичную ошибку через сумму (интеграл ((уровень x (i)) ^ 2 pdf (x))) для разных значений maxValue, постройте и найдите минимум. - person SleuthEye; 27.09.2015
comment
Я заметил, что после определения диапазона квантования от [-4,2*sqrt(0,5),4,2*sqrt(0,5)] исходный сигнал обрезается. Если я увеличу диапазон квантизатора, проблема отсечения исчезнет. Есть ли способ рассчитать диапазон квантования, чтобы избежать отсечения исходного сигнала? - person rmb; 29.09.2015
comment
Сигналы Гаусса имеют бесконечный диапазон, а это означает, что вы всегда будете получать небольшое отсечение. Чем больше диапазон, тем менее вероятно отсечение (но оно никогда полностью не исчезнет). Однако при ограниченном количестве уровней больший диапазон также означает большие шаги квантования, что приводит к большей ошибке квантования. +/- 4.2*sqrt(0.5) для 512 уровней обеспечивает баланс (в смысле среднеквадратичной ошибки) между ошибкой, вносимой отсечением, и ошибкой квантования в пределах выходного диапазона квантователя. - person SleuthEye; 29.09.2015
comment
довольно полезно! Любая идея о том, как я могу найти количество обрезанных символов? Правильно ли это: index=find(real(s)›q); numClip = длина (индексы); - person rmb; 29.09.2015
comment
почти. q — это размер вашего шага, в то время как вы должны обнаруживать что-то большее, чем половина общего диапазона от центра. Кроме того, усеченный символ, как правило, имеет обрезанную либо действительную, либо мнимую часть (но если обрезаны действительная и воображаемая части, вы не должны считать это дважды). Итак: mu=0.5*(minValue+maxValue); halfrng=0.5*(maxValue-minValue); numClipped=length(union(find(abs(real(s)-mu)›halfrng), find(abs(imag(s)-mu)›halfrng));` - person SleuthEye; 29.09.2015