Выравнивание сигнала QAM, прошедшего через частотно-избирательный канал с замираниями с помощью RLS и LMS-алгоритмов. Сравните эффективность двух алгоритмов.
Задайте порядок модуляции. Сгенерируйте соответствующее ссылочное созвездие QAM.
M = 16;
sigConst = qammod(0:M-1,M,'UnitAveragePower',true);
Создайте частотно-избирательный статический канал, имеющий три отвода.
rchan = comm.RayleighChannel('SampleRate',1000, ... 'PathDelays',[0 1e-3 2e-3],'AveragePathGains',[0 -3 -6], ... 'MaximumDopplerShift',0, ... 'RandomStream','mt19937ar with seed','Seed',73);
Создайте объект эквалайзера RLS.
eqrls = lineareq(6,rls(0.99,0.1)); eqrls.SigConst = sigConst; eqrls.ResetBeforeFiltering = 0;
Сгенерируйте и QAM модулируйте случайную обучающую последовательность. Пропустите последовательность через Канал с релеевским замиранием. Пропустите принятый сигнал и обучающий сигнал через эквалайзер, чтобы установить веса отводов эквалайзера.
trainData = randi([0 M-1],200,1);
trainSig = qammod(trainData,M,'UnitAveragePower',true);
rxSig = rchan(trainSig);
[~,~,errorSig] = equalize(eqrls,rxSig,trainSig);
Постройте график величины оценки ошибки.
plot(abs(errorSig)) title('Error Estimate, RLS Equalizer') xlabel('Symbols') ylabel('Amplitude')
Ошибка почти устранена в пределах 200 символов.
Передайте сигнал QAM через частотно-избирательный канал. Выравнивайте принятый сигнал с помощью ранее 'обученного' эквалайзера RLS. Измерьте время, необходимое для выполнения цикла обработки.
tic for k = 1:20 data = randi([0 M-1],1000,1); % Random message txSig = qammod(data,M,'UnitAveragePower',true); % Introduce channel distortion. rxSig = rchan(txSig); % Equalize the received signal. eqSig = equalize(eqrls,rxSig); end rlstime = toc;
Постройте график созвездия принятых и уравненных сигналов.
h = scatterplot(rxSig,1,0,'c.'); hold on scatterplot(eqSig,1,0,'b.',h) legend('Received Signal','Equalized Signal') title('RLS Equalizer') hold off
Эквалайзер удалил эффекты затухающего канала.
Повторите процесс эквализации с помощью эквалайзера LMS. Создайте объект эквалайзера LMS.
eqlms = lineareq(6,lms(0.03)); eqlms.SigConst = sigConst; eqlms.ResetBeforeFiltering = 0;
Обучите эквалайзер LMS.
trainData = randi([0 M-1],1000,1);
trainSig = qammod(trainData,M,'UnitAveragePower',true);
rxSig = rchan(trainSig);
[~,~,errorSig] = equalize(eqlms,rxSig,trainSig);
Постройте график величины оценки ошибки.
plot(abs(errorSig)) title('Error Estimate, LMS Equalizer') xlabel('Symbols') ylabel('Amplitude')
Для настройки эквалайзера LMS требуется 1000 символов.
Передайте сигнал QAM через тот же частотно-избирательный канал. Выравнивайте принятый сигнал с помощью ранее 'обученного' эквалайзера LMS. Измерьте время, необходимое для выполнения цикла обработки.
tic for k = 1:20 data = randi([0 M-1],1000,1); % Random message txSig = qammod(data,M,'UnitAveragePower',true); % Introduce channel distortion. rxSig = rchan(txSig); % Equalize the received signal. eqSig = equalize(eqlms,rxSig); end lmstime = toc;
Постройте график созвездия принятых и уравненных сигналов.
h = scatterplot(rxSig,1,0,'c.'); hold on scatterplot(eqSig,1,0,'b.',h) legend('Received Signal','Equalized Signal') title('LMS Equalizer')
Эквалайзер удаляет эффекты затухающего канала.
Сравните время выполнения цикла для двух алгоритмов эквалайзера.
[rlstime lmstime]
Этот LMS-алгоритм является более в вычислительном отношении эффективным, поскольку для выполнения цикла обработки потребовалось 50% времени. Однако обучающая последовательность, требуемая LMS-алгоритмом, в 5 раз длиннее.