компенсировать

(Чтобы быть удаленным), Компенсируют сигнал с помощью объекта эквалайзера

компенсируйте будет удален в будущем релизе. Используйте comm.LinearEqualizer или comm.DecisionFeedback вместо этого.

Синтаксис

y = equalize(eqobj,x)
y = equalize(eqobj,x,trainsig)
[y,yd] = equalize(...)
[y,yd,e] = equalize(...)

Описание

y = equalize(eqobj,x) обрабатывает вектор основополосного сигнала x с объектом eqobj эквалайзера и возвращает компенсируемый сигнальный вектор y. В конце процесса eqobj содержит обновленную информацию состояния, такую как значения веса эквалайзера и значения входного буфера. Чтобы создать eqobj, используйте функция dfe или lineareq. Функция equalize принимает, что x сигнала выбирается на выборках nsamp на символ, где nsamp является значением свойства nSampPerSym eqobj. Для адаптивных алгоритмов кроме CMA эквалайзер адаптируется в направленном на решение режиме с помощью детектора, заданного свойством SigConst eqobj. Задержкой эквалайзера является (eqobj.RefTap-1)/eqobj.nSampPerSym.

Обратите внимание на то, что (eqobj.RefTap-1) должен быть целочисленным кратным nSampPerSym. Для незначительно распределенного эквалайзера касания расположены с интервалами в частях периода символа. Ссылочное касание принадлежит учебным символам, и таким образом, должно совпасть с целым числом символов (т.е. целое число выборок на символ). eqobj.RefTap=1 соответствует первому символу, eqobj.RefTap=nSampPerSym+1 к второму, и так далее. Поэтому (eqobj.RefTap-1) должен быть целочисленным кратным nSampPerSym.

Если eqobj.ResetBeforeFiltering является 0, equalize использует существующую информацию состояния в eqobj при запуске операции коррекции. В результате equalize(eqobj,[x1 x2]) эквивалентен [equalize(eqobj,x1) equalize(eqobj,x2)]. Чтобы сбросить eqobj вручную, примените функцию reset к eqobj.

Если eqobj.ResetBeforeFiltering является 1, equalize сбрасывает eqobj прежде, чем запустить операцию коррекции, перезаписывая любую предыдущую информацию состояния в eqobj.

y = equalize(eqobj,x,trainsig) первоначально использует обучающую последовательность, чтобы адаптировать эквалайзер. После обработки обучающей последовательности эквалайзер адаптируется в направленном на решение режиме. Длина вектора trainsig должна быть меньше чем или равна length(x)-(eqobj.RefTap-1)/eqobj.nSampPerSym.

[y,yd] = equalize(...) возвращает векторный yd обнаруженных символов данных.

[y,yd,e] = equalize(...) возвращает результат ошибочного вычисления. Для адаптивных алгоритмов кроме CMA e является вектором ошибок между y и ссылочным сигналом, где ссылочный сигнал состоит из обучающей последовательности или обнаруженных символов.

Примеры

свернуть все

Можно компенсировать сигнал при помощи функции equalize, чтобы применить адаптивный объект эквалайзера к сигналу. Функция equalize также обновляет эквалайзер.

В типовых приложениях эквалайзер начинается при помощи известной последовательности переданных символов при адаптации весов эквалайзера. Известная последовательность, названная обучающей последовательностью, позволяет эквалайзеру собрать информацию о характеристиках канала. После того, как эквалайзер закончил обрабатывать обучающую последовательность, он адаптирует веса эквалайзера в направленном на решение режиме с помощью обнаруженной версии выходного сигнала. Чтобы использовать обучающую последовательность при вызове функции equalize, включайте символы обучающей последовательности как входной вектор.

Отметьте как исключение, тот CMA, эквалайзеры не используют обучающую последовательность. Если объект эквалайзера основан на CMA, вы не должны включать обучающую последовательность как входной вектор.

Этот код иллюстрирует, как использовать, компенсируют с обучающей последовательностью. Обучающая последовательность в этом случае является только началом переданного сообщения.

Настройте параметры и сигналы.

M = 4; % Alphabet size for modulation
msg = randi([0 M-1],1500,1); % Random message
qpskMod = comm.QPSKModulator('PhaseOffset',0);
modmsg = qpskMod(msg); % Modulate using QPSK.
trainlen = 500; % Length of training sequence
chan = [.986; .845; .237; .123+.31i]; % Channel coefficients
filtmsg = filter(chan,1,modmsg); % Introduce channel distortion.

Компенсируйте полученный сигнал.

eq1 = lineareq(8, lms(0.01)); % Create an equalizer object.
eq1.SigConst = qpskMod((0:M-1)')'; % Set signal constellation.
[symbolest,yd] = equalize(eq1,filtmsg,modmsg(1:trainlen)); % Equalize.

Вычислите коэффициенты ошибок с и без коррекции

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

qpskDemod = comm.QPSKDemodulator('PhaseOffset',0);
demodmsg_noeq = qpskDemod(filtmsg); % Demodulate unequalized signal.
demodmsg = qpskDemod(yd); % Demodulate detected signal from equalizer.
errorCalc = comm.ErrorRate; % ErrorRate calculator
ser_noEq = errorCalc(msg(trainlen+1:end), demodmsg_noeq(trainlen+1:end));
reset(errorCalc)
ser_Eq = errorCalc(msg(trainlen+1:end),demodmsg(trainlen+1:end));
disp('Symbol error rates with and without equalizer:')
Symbol error rates with and without equalizer:
disp([ser_Eq(1) ser_noEq(1)]) 
         0    0.3230

Постройте сигналы

Создайте график рассеивания, показывающий сигнал до и после коррекции, а также ссылочное сигнальное созвездие для модуляции QPSK. Точки компенсируемого сигнала кластеризируются более тесно вокруг точек ссылочного сигнального созвездия, указывая на улучшение сигнала от коррекции.

h = scatterplot(filtmsg,1,trainlen,'bx'); hold on;
scatterplot(symbolest,1,trainlen,'g.',h);
scatterplot(eq1.SigConst,1,0,'k*',h);
legend('Filtered signal','Equalized signal',...
   'Ideal signal constellation');
hold off;

Для большего количества примеров, которые используют обучающие последовательности, смотрите Адаптивную Коррекцию.

Если вы вызываете equalize многократно с тем же объектом эквалайзера компенсировать серию сигнальных векторов, вы можете использовать обучающую последовательность в первый раз, когда вы вызываете функцию и не используете обучающую последовательность в последующих вызовах. Каждая итерация функции equalize после первой действует полностью в направленном на решение режиме. Однако, потому что свойство ResetBeforeFiltering объекта эквалайзера установлено в 0, функция equalize использует существующую информацию состояния в объекте эквалайзера когда стартовая операция коррекции для каждой итерации. В результате обучение влияет на все операции коррекции, не только первое.

Заметьте в этом коде, что первый вызов equalize использует обучающую последовательность в качестве входного параметра, и второй вызов, чтобы компенсировать не использует обучающую последовательность.

Настройте передачу сигнала

Создайте сигнал, QPSK модулируют его, затем пропускают его через канал искажения.

M = 4; % Alphabet size for modulation
msg = randi([0 M-1],1500,1); % Random message
qpskMod = comm.QPSKModulator('PhaseOffset',0);
modmsg = qpskMod(msg); % Modulate using QPSK


chan = [.986; .845; .237; .123+.31i]; % Channel coefficients
filtmsg = filter(chan,1,modmsg); % Introduce channel distortion

Настройте эквалайзер

Задайте параметры эквалайзера и создайте lms объект эквалайзера

trainlen = 500; % Length of training sequence
eqlms = lineareq(8, lms(0.01)); % Create an equalizer object
eqlms.SigConst = qpskMod((0:M-1)')'; % Set signal constellation parameter in the equalizer

Поддержите непрерывность между вызовами, чтобы компенсировать.

eqlms.ResetBeforeFiltering = 0;

Компенсируйте полученный сигнал в частях

Обработайте обучающую последовательность.

s1 = equalize(eqlms,filtmsg(1:trainlen),modmsg(1:trainlen));

Процесс некоторые данные в направленном на решение режиме.

s2 = equalize(eqlms,filtmsg(trainlen+1:800));

Остальная часть процесса данных в направленном на решение режиме.

s3 = equalize(eqlms,filtmsg(801:end));

Конкатенация сегментов сигнала, чтобы получить полный вывод эквалайзера.

s = [s1; s2; s3]; 

Для соответствующей коррекции с помощью адаптивных алгоритмов кроме CMA необходимо установить ссылочное касание так, чтобы это превысило задержку, в символах, между модулятором передатчика вывод и входом эквалайзера. Когда это условие удовлетворено, общая задержка между модулятором вывод и эквалайзером, вывод равен символам (RefTap-1)/nSampPerSym . Поскольку задержка канала обычно неизвестна, установившаяся практика должна установить ссылочное касание на центральное касание в линейном эквалайзере, или центральное касание форварда просачивается эквалайзер обратной связи решения.

Для эквалайзеров CMA выше не применяется выражение, потому что эквалайзер CMA не имеет никакого ссылочного касания. Если необходимо знать задержку, можно найти его опытным путем после того, как веса эквалайзера сходились. Используйте функцию xcorr, чтобы исследовать взаимные корреляции модулятора вывод и эквалайзер вывод.

Методы для Работы с задержками

Вот некоторые типичные способы принять задержку во внимание D путем дополнения или усечения данных:

  • Заполните свои исходные данные дополнительными символами D в конце. Прежде, чем сравнить исходные данные с полученными данными, не используйте первые символы D полученных данных. В этом подходе все исходные данные (не включая дополнение) составляются в полученных данных.

  • Прежде, чем сравнить исходные данные с полученными данными, не используйте последние символы D исходных данных и первые символы D полученных данных. В этом подходе некоторые исходные символы не составляются в полученных данных.

Этот пример иллюстрирует второй подход путем исключения последних символов D, чтобы составлять задержку. Для примера, который иллюстрирует оба подхода в контексте interleavers, смотрите Задержки Сверточного Interleavers.

Создайте случайный сигнал, и BPSK модулируют его. Присвойте фрагмент сигнала как учебный сигнал.

M = 2; % Use BPSK modulation
msg = randi([0 M-1],1000,1); % Random data
bpskMod = comm.BPSKModulator('PhaseOffset',0);
modmsg = bpskMod(msg); % Modulate
trainlen = 100; % Length of training sequence
trainsig = modmsg(1:trainlen); % Training sequence

Задайте эквалайзер и компенсируйте полученный сигнал.

eqlin = lineareq(3,normlms(.0005,.0001),pskmod(0:M-1,M));
eqlin.RefTap = 2; % Set reference tap of equalizer.
[eqsig,detsym] = equalize(eqlin,modmsg,trainsig); % Equalize.

Демодулируйте обнаруженный сигнал.

bpskDemod = comm.BPSKDemodulator('PhaseOffset',0);
detmsg = bpskDemod(detsym);

Вычислите частоту ошибок по битам при компенсации задержки, введенной RefTap и игнорировании обучающей последовательности.

D = (eqlin.RefTap-1)/eqlin.nSampPerSym;
hErrorCalc = comm.ErrorRate('ReceiveDelay',D);
berVec = step(hErrorCalc, msg(trainlen+1:end), detmsg(trainlen+1:end));
ber = berVec(1)
ber = 0
numerrs = berVec(2)
numerrs = 0

Вопросы совместимости

equalize будет удален

компенсируйте будет удален. Используйте comm.LinearEqualizer или comm.DecisionFeedback вместо этого.

Смотрите также

Системные объекты

Представлено до R2006a