Попробовал смоделировать схему (с целью дальнейшей реализации в FPGA), предложенную в статье Carrier Recovery and Automatic Gain Control on
FPGA’s based platform, рис. 8.
Результат неадекватный (начиная с некоторого момента алгоритм расходится). Менял параметры (наугад, поскольку никакой понятной теории не нашел), результата нет.
Может быть, кто-то сталкивался с этим?
Для сравнения - код по Незами (рис. 4-27). Тут все нормально, но это для double точности.
Или посоветуйте другие варианты - поиск пока лучших результатов не дал.
Спасибо!
Код
% input signal gereration start
N=5*1000; % length of input signal
ft=N/5;
fs=(1-1/5)*N;
A(1:N/5)= 2^5; % max values
A(N/5+1:2*N/5) = 2^5;
A(2*N/5+1:3*N/5)= 2^8;
A(3*N/5+1:4*N/5)= 2^11;
A(4*N/5+1:5*N/5)= 2^7;
x= A.*exp(2*pi*j*ft*[1:N]/fs);
x=x.';
% input signal end
% initialization start
y1 = zeros(1,length(x));
y2 = zeros(1,length(x));
norm = zeros(1,length(x));
A1(1)= 0; % Gain for exp
A2(1)= 1; % Gain for linear
avg = 0;
acc = 0;
% initialization end
% PARAMETERS of AGC
R = 10; % reference
a1 = 0.0001; % for exp
K = 9;
B = 2^3; % length of buffer
% ---------
% main
for k=1:length(x)-1
% exp AGC (Nezami)
y1(k) = 2^[A1(k)] * x(k);
A1(k+1) = A1(k) + a1*(2^R - [abs(real(y1(k))) + abs(imag(y1(k)))]);
% linear AGC
y2(k) = A2(k) * x(k);
norm(k) = abs(real(y2(k))) + abs(imag(y2(k)));
if (k<=B) % AVG in buffer
avg = avg + norm(k);
else
avg = avg + norm(k)-norm(k-B);
end
diff = 2^R - floor(avg/B); % 2^R is reference level
acc = acc + diff; % accumulator
result = floor(acc/2^K);
A2(k+1) = result;
end
figure
subplot(311); plot([ real(x).' ]); grid;shg
subplot(312); plot([ real(y1).']); grid;shg
subplot(313); plot([ real(y2).']); grid;shg
N=5*1000; % length of input signal
ft=N/5;
fs=(1-1/5)*N;
A(1:N/5)= 2^5; % max values
A(N/5+1:2*N/5) = 2^5;
A(2*N/5+1:3*N/5)= 2^8;
A(3*N/5+1:4*N/5)= 2^11;
A(4*N/5+1:5*N/5)= 2^7;
x= A.*exp(2*pi*j*ft*[1:N]/fs);
x=x.';
% input signal end
% initialization start
y1 = zeros(1,length(x));
y2 = zeros(1,length(x));
norm = zeros(1,length(x));
A1(1)= 0; % Gain for exp
A2(1)= 1; % Gain for linear
avg = 0;
acc = 0;
% initialization end
% PARAMETERS of AGC
R = 10; % reference
a1 = 0.0001; % for exp
K = 9;
B = 2^3; % length of buffer
% ---------
% main
for k=1:length(x)-1
% exp AGC (Nezami)
y1(k) = 2^[A1(k)] * x(k);
A1(k+1) = A1(k) + a1*(2^R - [abs(real(y1(k))) + abs(imag(y1(k)))]);
% linear AGC
y2(k) = A2(k) * x(k);
norm(k) = abs(real(y2(k))) + abs(imag(y2(k)));
if (k<=B) % AVG in buffer
avg = avg + norm(k);
else
avg = avg + norm(k)-norm(k-B);
end
diff = 2^R - floor(avg/B); % 2^R is reference level
acc = acc + diff; % accumulator
result = floor(acc/2^K);
A2(k+1) = result;
end
figure
subplot(311); plot([ real(x).' ]); grid;shg
subplot(312); plot([ real(y1).']); grid;shg
subplot(313); plot([ real(y2).']); grid;shg