Продолжаю разбираться.
Вот код, написанный "в лоб" для QPSK по схеме 4-13 Незами, без учета разных тактовых.
(Несмотря на подпись под схемой, она расположена в разделе QPSK)
Код
Kp = 20e-4; % from des00 model
Ki = 50e-7;
% initialization
BUF_TED = [0 0]; % shift register for TED
BUF_LF = [0 0 0]; % shift register for Loop filter
mu = zeros(size(y));
for k=3:length(y)-2
y_out(k) = farrow(mu(k-1),y(k-2),y(k-1),y(k),y(k+1)); %interpolator
error = sign(real(BUF_TED(1)))*[real(y_out(k)) - real(BUF_TED(2))]+sign(imag(BUF_TED(1)))*[imag(y_out(k)) - imag(BUF_TED(2))]; %TED
% loop filter start
mu(k) = BUF_LF(2) + BUF_LF(3);
BUF_LF(3) = mu(k);
BUF_LF(2) = Kp*error + [Ki*error + BUF_LF(1)];
BUF_LF(1) = BUF_LF(1) + Ki*error;
% loop filter end
BUF_TED = [ y_out(k) BUF_TED(1:end-1) ];
end
subplot(311);plot(mu,'.');grid;shg
subplot(312);plot(y_out(1:2:end),'.');grid;shg
subplot(313);plot(y_out(2:2:end),'.');grid;shg
Схема в том виде, как на рисунке в книге (снова повторюсь, не понял наличия трех разных частот или что это там), не заработала. Начала работать после изменения loop-фильтра на тот, что предложен на рис. 3.7
Ну, то есть работать - это сильно сказано. Если сюда подать y (входной сигнал на 2-х тактовых, сдвинутый на delta), то получится:
при delta<0.5 - надо брать y_out(1:2:end)
при delta>0.5 - надо брать y_out(2:2:end)
То есть схема NCO, включающая и выключающая TED, должна как раз и делать этот выбор, правильно?
Входной сигнал со сдвигом 0.2
Нажмите для просмотра прикрепленного файлаВходной сигнал со сдвигом 0.7
Нажмите для просмотра прикрепленного файлаЯ правильно понимаю, что если добавить в приведенный код условия вида if overflow == 1 ... для включения TED, то схема должна заработать как ожидается, то есть автоматически подстраиваясь?