diff --git a/lens.m b/lens.m new file mode 100644 index 0000000..f356a52 --- /dev/null +++ b/lens.m @@ -0,0 +1,48 @@ +## Copyright (C) 2019 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} lens (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2019-08-27 + +function retval = lens (f) + +pw = 2048; +ph = 1536; +d = 11.1; + +a = pw/ph +dh = sqrt(d*d/(1+a*a)) +dw = a*dh + +%f = 12.5; +dw_norm = 36; +dh_norm = 24; + +a_norm = dw_norm/dh_norm +d_norm = sqrt(dw_norm*dw_norm + dh_norm*dh_norm) +crop_factor = d_norm / d +f_norm = f * crop_factor + +aov_norm = 360/pi*atan(d_norm/(2*f)) +aov = 360/pi*atan(d/(2*f)) + +endfunction diff --git a/master_slave_eval.m b/master_slave_eval.m new file mode 100644 index 0000000..b20ed41 --- /dev/null +++ b/master_slave_eval.m @@ -0,0 +1,120 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} master_slave_eval (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-08-04 + +function retval = master_slave_eval (input1, input2) +N_cycles = 10 + +N_phases_per_cycle = 4 +dN = 24 + +N = N_cycles*N_phases_per_cycle + +k_jitter = 2; +# Create Master +xp = zeros(1, N_cycles*N_phases_per_cycle*dN); +xv = zeros(1, N_cycles*N_phases_per_cycle*dN); + +phase = 0; +v = 0; +for n=0:N-1, + pos = max(1, n*dN + 1 + fix(0.5 + 2*k_jitter*randn()/sqrt(12))); + xp(pos) = phase; + xv(pos) = v + 1; + phase = mod(phase + 1, N_phases_per_cycle); + v = mod(v + 1, N_phases_per_cycle); + +endfor + +# Slave +k_upd = 0.5; + +phi = 0; +dphi = 0; +last_n = 0; +last_xp = 0; +param_changed = 1; + +_phi = []; +_dphi = []; +_err_phi = []; +_err_dphi = []; +err_phi = 0 +err_dphi = 0 +for n=1:length(xp) + yp(n) = phi; + phi = mod(phi + dphi, N_phases_per_cycle); + + if xv(n) > 0 + if last_n > 0 + doRecalc = param_changed; + param_changed = 0; + + den = (n - last_n); + dp = mod(xp(n) - last_xp, N_phases_per_cycle); + xdphi = dp/den; + + err_phi = phase_error_detector(phi, xp(n)); + err_dphi = frequency_error_detector(dphi, xdphi); + dphi = dphi - k_upd*err_dphi; + + if doRecalc + phi = xp(n); + dphi = xdphi; + end + + if xv(n) == 2 + # phi = xp(n); + endif + endif + last_xp = xp(n); + last_n = n; + end + + _err_phi = [_err_phi err_phi]; + _err_dphi = [_err_dphi err_dphi]; + _phi = [_phi phi]; + _dphi = [_dphi dphi]; + +endfor + +function err = phase_error_detector(lo, ext) + err = lo - ext; +endfunction + +function err = frequency_error_detector(lo, ext) + err = lo - ext; +endfunction + +close all +subplot(3, 1, 1) +plot (1:length(xp), xp, 1:length(yp), yp); legend('xp','yp'); grid; + +subplot(3, 1, 2) +plot (1:length(_err_phi), _err_phi); legend('err_{phi}'); grid; + +subplot(3, 1, 3) +plot (1:length(_err_dphi), _err_dphi); legend('err_{dphi}'); grid; + +endfunction diff --git a/mc_pd_eval.m b/mc_pd_eval.m new file mode 100644 index 0000000..4dfbbf4 --- /dev/null +++ b/mc_pd_eval.m @@ -0,0 +1,56 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} mc_pd_eval (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-08-07 + +function retval = mc_pd_eval (delay) + +Nc = 4 +Nspc = 24; + +ka = 0.9; +xmc_i = [ka*ones(1, Nspc/2) -ka*ones(1, Nspc/2)]; +xmc_q = [-ka*ones(1, Nspc/4) ka*ones(1, Nspc/2) -ka*ones(1, Nspc/4)]; +x = repmat(xmc_i, 1, Nc); + +lo_i = repmat(xmc_i, 1, Nc); +lo_q = repmat(xmc_q, 1, Nc); + +if delay > 0 + hdly = [zeros(1, delay) 1]; + xdly = filter(hdly, 1, x); +else + xdly = x +end + +y_i = lo_i.*xdly; +y_q = lo_q.*xdly; + +close all; +subplot(2, 1, 1) +plot(1:Nc*Nspc, lo_i, 1:Nc*Nspc, lo_q); legend('Lo_I','Lo_Q'); grid + +subplot(2, 1, 2) +plot(1:Nc*Nspc, y_i, 1:Nc*Nspc, y_q); legend('I','Q'); grid + +endfunction diff --git a/mc_pd_eval2.m b/mc_pd_eval2.m new file mode 100644 index 0000000..88fb535 --- /dev/null +++ b/mc_pd_eval2.m @@ -0,0 +1,82 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} mc_pd_eval (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-08-07 + +function retval = mc_pd_eval2 (perr, ferr, slave_oversample) + +Nc = 10; +Nspc = 96; + +ka = 0.9; +klead = 0.2; +klag = 0.01/slave_oversample; + +# Create master +xm = []; +for n=1:Nspc, + for m=1:slave_oversample, + xm = [xm n]; + endfor +endfor +x = repmat(xm, 1, Nc); + +N = Nc*Nspc*slave_oversample; +assert (N == length(x)); + +# Create slave +pc = 1.0/slave_oversample + Nspc/2 + perr; +dpc = 1.0/slave_oversample + ferr; + +sample_count = slave_oversample; + +for n=1:N, + sample_count = sample_count - 1; + perr = phase_det(pc, x(n), Nspc); + if sample_count == 0, + sample_count = slave_oversample; + else + perr = 0; + end + _lo(n) = mod(pc - Nspc/2 - 1, Nspc) + 1; + pc = mod(pc + dpc - klead*perr, Nspc); + dpc = dpc - klag*perr; + _perr(n) = perr; + _dpc(n) = dpc; +end + +function perr = phase_det(lo, x, Nspc) + perr = mod((lo - x), Nspc) - Nspc/2; +endfunction + +close all; +subplot(3, 1, 1) +plot(1:N, _lo, 1:N, x); legend('Lo', 'x'); grid + +subplot(3, 1, 2) +plot(1:N, _dpc); legend('f'); grid + +subplot(3, 1, 3) +plot(1:N, _perr); legend('p'); grid + +endfunction diff --git a/mc_pd_eval3.m b/mc_pd_eval3.m new file mode 100644 index 0000000..7b2009a --- /dev/null +++ b/mc_pd_eval3.m @@ -0,0 +1,84 @@ +## Copyright (C) 2020 Jens +## +## This program is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{retval} =} mc_pd_eval (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2020-08-07 + +function retval = mc_pd_eval3 (perr, freq, slave_oversample) + +Nc = 10; +Nspc = 96; + +ka = 0.9; +klead = 0.4; +klag = 0.01/slave_oversample; +lag = 0; + +# Create master +xm = []; +for n=1:Nspc, + for m=1:slave_oversample, + xm = [xm n]; + endfor +endfor +x = repmat(xm, 1, Nc); + +N = Nc*Nspc*slave_oversample; +assert (N == length(x)); + +# Create slave +pc = Nspc/2 + perr; +dfreq = freq/slave_oversample; +dpc = dfreq; + +sample_count = slave_oversample; +for n=1:N, + perr = phase_det(pc, x(n), Nspc); + sample_count = sample_count - 1; + if sample_count == 0, + sample_count = slave_oversample; + else + perr = 0; + end + dpc = dfreq - (klag*lag + klead*perr); + pc = mod(pc + dpc, Nspc); + lag = lag + perr; + _lo(n) = mod(pc - Nspc/2 - 1/slave_oversample, Nspc); + _perr(n) = perr; + _dpc(n) = dpc; +end + +function perr = phase_det(lo, x, Nspc) + perr = mod((lo - x), Nspc) - Nspc/2; +endfunction + +close all; +subplot(3, 1, 1) +plot(1:N, _lo, 1:N, x); legend('Lo', 'x'); grid + +subplot(3, 1, 2) +plot(1:N, _dpc); legend('f'); grid + +subplot(3, 1, 3) +plot(1:N, _perr); legend('p'); grid + +endfunction