Hello Mr Kazem, here is my latest attempt:
clear
clc
load RRC.mat
rf_signal = cos(2*pi*(1:5000)*0.1);
fc = 0.1;
N = length(rf_signal);
phi_inc = zeros(1, N);
bb = zeros(1, N);
bb_f = zeros(1, N);
I_f = zeros(1, N);
Q_f = zeros(1, N);
I_r = zeros(1, N);
Q_r = zeros(1, N);
error = zeros(1, N);
error_f = zeros(1, N);
%loop filter coefficients
alpha = 0.1;
b = alpha;
a = ;
for i = 1:N
% Downconverting to Baseband
bb(i) = rf_signal(i).*exp(j*2*pi*fc*i);
% Filtering
bb_f = filter(RRC, bb(1:i));
I_f(i) = real(bb_f(i));
Q_f(i) = imag(bb_f(i));
% Slicing
if I_f(i) > 0
I_r(i) = 1;
else
I_r(i) = -1;
end
if Q_f(i) > 0
Q_r(i) = 1;
else
Q_r(i) = -1;
end
% Error
error(i) = I_f(i) .* Q_r(i) - Q_f(i) .* I_r(i);
% Loop Filter
error_f = filter(b, a, error(1:i));
phi_inc(i+1) = phi_inc(i) - error_f(i)/2^10;
end
figure
subplot 221
plot(real(bb))
title('I Channel')
subplot 222
plot(imag(bb))
title('Q Channel')
subplot 223
plot(I_f)
title('I Channel Filter')
subplot 224
plot(Q_f)
title('Q Channel Filter')
figure; plot(error); title('Error');
figure; plot(error_f); title('Filtered Error');
figure; plot(phi_inc); title('Final Error');
I just scaled down the filtered error by 2^10. I think it is gentle as you mentioned and scaling bring it to range +/- 0.5.
Error:
https://www.alteraforum.com/forum/attachment.php?attachmentid=10413 Filtered Error:
https://www.alteraforum.com/forum/attachment.php?attachmentid=10414 Final Error:
https://www.alteraforum.com/forum/attachment.php?attachmentid=10415 Of course loop is open as you can see from code. So, what do you think?