added
git-svn-id: http://moon:8086/svn/matlab/trunk@99 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
Executable
+52
@@ -0,0 +1,52 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} adc_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-03-07
|
||||
|
||||
function [output] = adc_eval (nbits, input)
|
||||
|
||||
Vref = 1.0;
|
||||
%output = adc_pipelined(Vref, nbits, input)
|
||||
output = adc_SAR(Vref, nbits, input)
|
||||
|
||||
|
||||
function output = adc_pipelined(VRref, nbits, input)
|
||||
output = zeros(1, nbits);
|
||||
for n=1:nbits,
|
||||
if input >= Vref/2
|
||||
output(n) = 1;
|
||||
input = input - Vref/2
|
||||
end
|
||||
input = input * 2
|
||||
end
|
||||
|
||||
function output = adc_SAR(VRref, nbits, input)
|
||||
Vsar = 0;
|
||||
VStep = VRref/2
|
||||
output = zeros(1, nbits);
|
||||
for n=1:nbits,
|
||||
if input >= (Vsar + VStep)
|
||||
output(n) = 1
|
||||
Vsar = Vsar + VStep;
|
||||
end
|
||||
VStep = VStep / 2;
|
||||
end
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
## Copyright (C) 2016 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} distort (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2016-04-15
|
||||
|
||||
function [retval] = distort (input1, input2)
|
||||
|
||||
endfunction
|
||||
Executable
+11
@@ -0,0 +1,11 @@
|
||||
function distort_eval(k)
|
||||
|
||||
N = 100;
|
||||
|
||||
x = (0:(N-1))/(N-1);
|
||||
|
||||
b = 0.9
|
||||
|
||||
y = b + (1-b)*x.*exp(k*abs(x))./exp(k);
|
||||
|
||||
plot(x, y); grid;
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
## Copyright (C) 2018 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} e_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2018-02-09
|
||||
|
||||
function e_eval()
|
||||
|
||||
N = 100;
|
||||
|
||||
a = 0.25;
|
||||
y1 = 0.0;
|
||||
x = 1.0;
|
||||
for n=1:N,
|
||||
y1_(n) = y1;
|
||||
y2_(n) = 1-exp(-(n-1)*a);
|
||||
|
||||
y1 = (1-a)*y1 + a*x;
|
||||
end
|
||||
|
||||
close;
|
||||
plot (0:N-1, y1_,0:N-1, y2_); grid;
|
||||
|
||||
endfunction
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
function eval_gainControl()
|
||||
|
||||
close all;
|
||||
|
||||
% 1
|
||||
G_Target = [40*ones(1,200) 20*ones(1,200) 40*ones(1,200)];
|
||||
G_PA = 43+5*sin(1/400*2*pi*(1:600));
|
||||
|
||||
gainControl(G_Target, G_PA, 3, 0.2);
|
||||
|
||||
% 2
|
||||
figure
|
||||
G_Target = [40*ones(1,600)];
|
||||
G_PA = [43*ones(1,200) 46*ones(1,200) 23*ones(1,200)];
|
||||
|
||||
gainControl(G_Target, G_PA, 3, 0.2);
|
||||
|
||||
% 2
|
||||
figure
|
||||
G_Target = [40*ones(1,600)];
|
||||
G_PA = [43*ones(1,200) 40*ones(1,200) 83*ones(1,200)];
|
||||
|
||||
gainControl(G_Target, G_PA, 3, 0.2);
|
||||
Executable
+67
@@ -0,0 +1,67 @@
|
||||
function gainControl(G_TX_target, G_PA_dB, Nd, mu)
|
||||
|
||||
% Constants
|
||||
N=length(G_TX_target); % number of points
|
||||
Ts = 1.0 % sample period in sec.
|
||||
|
||||
atten_res_dB = 0.010; % attenuator resolution
|
||||
|
||||
%mu = 0.1; % Averaging of measurement
|
||||
knoise = 0.04; % measurement noise
|
||||
|
||||
f_theta = 0.001; % Hz Temperature drift frequency
|
||||
a_theta = 5; % dB Temperature drift level dB
|
||||
|
||||
atten_dB=40; % initial value: Controller atten_ output
|
||||
|
||||
|
||||
state = zeros(1, Nd-1); % filter state for delay
|
||||
|
||||
error = 0;
|
||||
enabled = 1;
|
||||
LATENCY = 3;
|
||||
latency_count = LATENCY;
|
||||
|
||||
for i=1:N,
|
||||
G_TX = G_PA_dB(i) - atten_dB + knoise*randn();
|
||||
[G_TX_est, state] = filter([zeros(1,Nd-1) 1], 1, G_TX, state);
|
||||
error_last = error;
|
||||
error = G_TX_est - G_TX_target(i);
|
||||
derror = abs(error) - abs(error_last);
|
||||
atten_dB = atten_dB + mu*error;
|
||||
atten_dB = getAtten(atten_dB, atten_res_dB);
|
||||
|
||||
if enabled == 0
|
||||
G_TX = -120;
|
||||
end
|
||||
error_v(i) = error;
|
||||
derror_v(i) = derror;
|
||||
gain_dB_v(i) = G_TX;
|
||||
atten_v(i) = atten_dB;
|
||||
|
||||
if enabled == 1
|
||||
if derror > -0.1 && abs(error) > 3
|
||||
if latency_count == 0
|
||||
enabled = 0;
|
||||
else
|
||||
latency_count = latency_count - 1;
|
||||
end
|
||||
else
|
||||
latency_count = LATENCY;
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
subplot(4,1,1)
|
||||
plot((0:N-1)*Ts, G_TX_target, (0:N-1)*Ts, G_PA_dB); grid; legend('G_{TX_target}', 'G_{PA}'); xlabel('t/s'); ylabel('dB')
|
||||
subplot(4,1,2)
|
||||
plot((0:N-1)*Ts, error_v, (0:N-1)*Ts, derror_v); grid; legend('error', 'derror'); xlabel('t/s'); ylabel('dB')
|
||||
subplot(4,1,3)
|
||||
plot((0:N-1)*Ts, gain_dB_v); grid; title('Gain_{TX}'); xlabel('t/s'); ylabel('dB')
|
||||
subplot(4,1,4)
|
||||
plot((0:N-1)*Ts, atten_v); grid; title('atten'); xlabel('t/s'); ylabel('dB')
|
||||
|
||||
function atten = getAtten(gain_dB, res_dB)
|
||||
atten = max(0, min(40, res_dB*fix(gain_dB/res_dB)));
|
||||
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} hmm_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-06-14
|
||||
|
||||
function sv = hmm_eval (A, numIter)
|
||||
|
||||
numStates = length(A)
|
||||
C = zeros(1,numStates);
|
||||
|
||||
#A = rand(numStates, numStates)
|
||||
|
||||
for s=1:numStates,
|
||||
A(s,:) = A(s,:) ./ sum(A(s,:));
|
||||
[AS(s,:), Ai(s,:)] = sort(A(s,:));
|
||||
AC(s,:) = cumsum(AS(s,:));
|
||||
end
|
||||
|
||||
A
|
||||
AC
|
||||
s=1;
|
||||
for n=1:numIter,
|
||||
sv(n) = s;
|
||||
stateProbs = AC(s,:);
|
||||
z = rand();
|
||||
c = find (z <= stateProbs);
|
||||
s = Ai(s, c(1));
|
||||
C(s) = C(s) + 1;
|
||||
end
|
||||
|
||||
plot(1:numIter, sv, 'ro-'); grid;
|
||||
C=C/numIter
|
||||
|
||||
endfunction
|
||||
Executable
+50
@@ -0,0 +1,50 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} ip_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-05-15
|
||||
|
||||
function [] = ip_eval ()
|
||||
|
||||
Nh = 100;
|
||||
Np = 10;
|
||||
omega = 0.4;
|
||||
|
||||
close all;
|
||||
x = -(Nh/2):(Nh/2-1);
|
||||
|
||||
for p=1:Np,
|
||||
d = (p-1)/Np
|
||||
h(:, p) = sinc(omega*(x+d))'.*kaiser(length(x), 8);
|
||||
plot(x, h); grid;
|
||||
pause (0.1)
|
||||
end
|
||||
|
||||
figure
|
||||
for p=1:Nh,
|
||||
x = 0:Np-1;
|
||||
y = h(p,:);
|
||||
p = polyfit(x, y, 3);
|
||||
plot(x, y, 'o', 0:0.1:Np-1, polyval(p, 0:0.1:Np-1), 'r'); grid;
|
||||
pause (0.1)
|
||||
end
|
||||
|
||||
endfunction
|
||||
@@ -0,0 +1,36 @@
|
||||
function [y, yc, z] = jpid(zi, kp, ki, kd, alpha_i, e)
|
||||
|
||||
if isempty(zi)
|
||||
% Integrator
|
||||
b_i = [1];
|
||||
a_i = [1 -alpha_i];
|
||||
% Differentiator
|
||||
b_d = [1 -1];
|
||||
a_d = [1];
|
||||
i = zeros(1, max(length(a_i), length(b_i))-1);
|
||||
d = zeros(1, max(length(a_d), length(b_d))-1);
|
||||
|
||||
z = struct('b_i', b_i, 'a_i', a_i, 'b_d', b_d, 'a_d', a_d, 'i', i, 'd', d, 'y_min', 0.0, 'y_max', 1.0, 'diff_aw', 0.0);
|
||||
else
|
||||
z = zi;
|
||||
end
|
||||
|
||||
[yi, z.i] = filter(z.b_i, z.a_i, e + z.diff_aw, z.i);
|
||||
[yd, z.d] = filter(z.b_d, z.a_d, e, z.d);
|
||||
|
||||
z.yp = kp*e;
|
||||
z.yi = ki*yi;
|
||||
z.yd = kd*yd;
|
||||
|
||||
y = z.yp + z.yi + z.yd;
|
||||
|
||||
yaw = yi;
|
||||
if (yaw < z.y_min)
|
||||
z.diff_aw = abs(yaw - z.y_min);
|
||||
end
|
||||
|
||||
if (yaw > z.y_max)
|
||||
z.diff_aw = -abs(yaw - z.y_max);
|
||||
end
|
||||
|
||||
yc = max(z.y_min, min(z.y_max, y));
|
||||
Executable
+33
@@ -0,0 +1,33 @@
|
||||
function lms_eval(N, mu)
|
||||
|
||||
% lms_eval(N, mu)
|
||||
% Example: lms_eval(1000, 0.01)
|
||||
|
||||
h = [0 0 0 1 0 0 0 0];
|
||||
w = randn(1, length(h));
|
||||
|
||||
z_h = zeros(length(h)-1, 1);
|
||||
z_w = zeros(length(h)-1, 1);
|
||||
|
||||
x = zeros(1, length(h));
|
||||
|
||||
e_last = 0;
|
||||
p = 1.0;
|
||||
|
||||
for n=1:N,
|
||||
xs = 0.1*randn();
|
||||
p = 0.99*p + 0.01*xs*xs;
|
||||
x = [xs x(1:length(x)-1)];
|
||||
d = x*h';
|
||||
y = x*w';
|
||||
e = d - y;
|
||||
|
||||
w = w + mu*e*x*(1/(0.001+p));
|
||||
|
||||
e_last = 0.5*e_last + 0.5*e*e;
|
||||
_e(n) = e_last;
|
||||
_p(n) = p;
|
||||
end
|
||||
|
||||
plot(1:N, _e, 1:N, _p); grid;
|
||||
w=w'
|
||||
Executable
+50
@@ -0,0 +1,50 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} ltrack (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-05-29
|
||||
|
||||
function ltrack (d)
|
||||
|
||||
N = 101
|
||||
phi = (-(N-1)/2:((N-1)/2))/(N-1)*pi/2;
|
||||
|
||||
k=1;
|
||||
for k=1:length(d)
|
||||
err(:,k) = tan(phi)*d(k);
|
||||
end
|
||||
|
||||
close all;
|
||||
plot(phi, err); grid; xlabel('error(phi)')
|
||||
|
||||
err = (-(N-1)/2:((N-1)/2))/(N-1);
|
||||
phi = [];
|
||||
k=1;
|
||||
for k=1:length(d)
|
||||
phi(:,k) = atan(err/d(k));
|
||||
end
|
||||
|
||||
figure;
|
||||
plot(err, 180*phi/pi); grid; xlabel('phi(err)')
|
||||
|
||||
|
||||
endfunction
|
||||
|
||||
Executable
+23
@@ -0,0 +1,23 @@
|
||||
function [y, zf] = movingavg(x, zi)
|
||||
if ~isstruct(zi)
|
||||
N = zi;
|
||||
zf = struct('N', N, 's', zeros(N+1, 1), 'ri', 2, 'wi', 1, 'y', 0);
|
||||
else
|
||||
zf = zi;
|
||||
end
|
||||
|
||||
xn = x/zf.N;
|
||||
zf.y = zf.y + xn - zf.s(zf.ri);
|
||||
y = zf.y;
|
||||
|
||||
zf.ri = zf.ri + 1;
|
||||
if zf.ri > length(zf.s)
|
||||
zf.ri = 1;
|
||||
end
|
||||
|
||||
zf.s(zf.wi) = xn;
|
||||
zf.wi = zf.wi + 1;
|
||||
if zf.wi > length(zf.s)
|
||||
zf.wi = 1;
|
||||
end
|
||||
|
||||
Executable
+88
@@ -0,0 +1,88 @@
|
||||
function [p,S,mu] = myPolyfit(x,y,n)
|
||||
% POLYFIT Fit polynomial to data.
|
||||
% POLYFIT(X,Y,N) finds the coefficients of a polynomial P(X) of
|
||||
% degree N that fits the data, P(X(I))~=Y(I), in a least-squares sense.
|
||||
%
|
||||
% [P,S] = POLYFIT(X,Y,N) returns the polynomial coefficients P and a
|
||||
% structure S for use with POLYVAL to obtain error estimates on
|
||||
% predictions. If the errors in the data, Y, are independent normal
|
||||
% with constant variance, POLYVAL will produce error bounds which
|
||||
% contain at least 50% of the predictions.
|
||||
%
|
||||
% The structure S contains the Cholesky factor of the Vandermonde
|
||||
% matrix (R), the degrees of freedom (df), and the norm of the
|
||||
% residuals (normr) as fields.
|
||||
%
|
||||
% [P,S,MU] = POLYFIT(X,Y,N) finds the coefficients of a polynomial
|
||||
% in XHAT = (X-MU(1))/MU(2) where MU(1) = mean(X) and MU(2) = std(X).
|
||||
% This centering and scaling transformation improves the numerical
|
||||
% properties of both the polynomial and the fitting algorithm.
|
||||
%
|
||||
% Warning messages result if N is >= length(X), if X has repeated, or
|
||||
% nearly repeated, points, or if X might need centering and scaling.
|
||||
%
|
||||
% See also POLY, POLYVAL, ROOTS.
|
||||
|
||||
% Copyright 1984-2002 The MathWorks, Inc.
|
||||
% $Revision: 5.17 $ $Date: 2002/04/09 00:14:25 $
|
||||
|
||||
% The regression problem is formulated in matrix format as:
|
||||
%
|
||||
% y = V*p or
|
||||
%
|
||||
% 3 2
|
||||
% y = [x x x 1] [p3
|
||||
% p2
|
||||
% p1
|
||||
% p0]
|
||||
%
|
||||
% where the vector p contains the coefficients to be found. For a
|
||||
% 7th order polynomial, matrix V would be:
|
||||
%
|
||||
% V = [x.^7 x.^6 x.^5 x.^4 x.^3 x.^2 x ones(size(x))];
|
||||
|
||||
if ~isequal(size(x),size(y))
|
||||
error('X and Y vectors must be the same size.')
|
||||
end
|
||||
|
||||
x = x(:);
|
||||
y = y(:);
|
||||
|
||||
if nargout > 2
|
||||
mu = [mean(x); std(x)];
|
||||
x = (x - mu(1))/mu(2);
|
||||
end
|
||||
|
||||
% Construct Vandermonde matrix.
|
||||
V(:,n+1) = ones(length(x),1);
|
||||
for j = n:-1:1
|
||||
V(:,j) = x.*V(:,j+1);
|
||||
end
|
||||
|
||||
% Solve least squares problem, and save the Cholesky factor.
|
||||
[Q,R] = qr(V,0);
|
||||
ws = warning('off','all');
|
||||
p = R\(Q'*y); % Same as p = V\y;
|
||||
warning(ws);
|
||||
if size(R,2) > size(R,1)
|
||||
warning('MATLAB:polyfit:PolyNotUnique', ...
|
||||
'Polynomial is not unique; degree >= number of data points.')
|
||||
elseif condest(R) > 1.0e10
|
||||
if nargout > 2
|
||||
warning('MATLAB:polyfit:RepeatedPoints', ...
|
||||
'Polynomial is badly conditioned. Remove repeated data points.')
|
||||
else
|
||||
warning('MATLAB:polyfit:RepeatedPointsOrRescale', ...
|
||||
['Polynomial is badly conditioned. Remove repeated data points\n' ...
|
||||
' or try centering and scaling as described in HELP POLYFIT.'])
|
||||
end
|
||||
end
|
||||
r = y - V*p;
|
||||
p = p.'; % Polynomial coefficients are row vectors by convention.
|
||||
|
||||
% S is a structure containing three elements: the Cholesky factor of the
|
||||
% Vandermonde matrix, the degrees of freedom and the norm of the residuals.
|
||||
|
||||
S.R = R;
|
||||
S.df = length(y) - (n+1);
|
||||
S.normr = norm(r);
|
||||
Executable
BIN
Binary file not shown.
Executable
+7
@@ -0,0 +1,7 @@
|
||||
function onPush(h)
|
||||
disp('onPush')
|
||||
close(h)
|
||||
|
||||
system ("nautilus .")
|
||||
|
||||
endfunction
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
function pf_eval(Np)
|
||||
N = 100;
|
||||
kn = 0.05;
|
||||
R = 4;
|
||||
x = (0:N-1)/N;
|
||||
xr = x(1:R:N)
|
||||
y = sin(0.25*2*pi*xr);
|
||||
|
||||
Nr = length(xr);
|
||||
yn = y + kn*(0.5-rand(1,Nr));
|
||||
[p,s] = myPolyfit(xr,yn,Np);
|
||||
|
||||
yh = polyval(p,x);
|
||||
|
||||
plot(xr, yn, 'ro', x, yh, 'b.'); grid; legend('y','y_h');
|
||||
s=s
|
||||
Executable
+95
@@ -0,0 +1,95 @@
|
||||
function pid_eval(Nd, kp, ki, kd)
|
||||
|
||||
% pid_eval(6, 0.002, 2.0e-6, 8.0)
|
||||
% pid_eval(10, 0.0005, 1.0e-6, 4.0)
|
||||
|
||||
% Constants
|
||||
kNoise = 0.05;
|
||||
aNoise = 0.5;
|
||||
alpha_i = 0.999
|
||||
|
||||
% Init
|
||||
x = [zeros(1, 40), 2*ones(1, 160), zeros(1, 40)];
|
||||
noise = kNoise*randn(length(x));
|
||||
|
||||
zfp = struct('velo', 0, 'dist', 0, 'x', 0);
|
||||
zfc = []
|
||||
|
||||
ev = zeros(1, length(x));
|
||||
efv = zeros(1, length(x));
|
||||
y1v = zeros(1, length(x));
|
||||
y2v = zeros(1, length(x));
|
||||
ypv = zeros(1, length(x));
|
||||
yiv = zeros(1, length(x));
|
||||
ydv = zeros(1, length(x));
|
||||
|
||||
yvelo = 0;
|
||||
ydist = 0;
|
||||
state = 'Init';
|
||||
y_last = 0;
|
||||
|
||||
b_f = [aNoise];
|
||||
a_f = [1 -(1-aNoise)];
|
||||
z_f = zeros(1, max(length(a_f), length(b_f))-1);
|
||||
|
||||
for n=1:length(x),
|
||||
e = x(n)-ydist + noise(n);
|
||||
[ef, z_f] = filter(b_f, a_f, e, z_f);
|
||||
|
||||
[ypid, yc, zfc] = jpid(zfc, kp, ki, kd, alpha_i, ef);
|
||||
state_next = state;
|
||||
if strcmp(state, 'Init')
|
||||
state_next = 'Acquisition';
|
||||
elseif strcmp(state, 'Acquisition')
|
||||
if abs(ef) < 0.001
|
||||
kp = kp * 1.0;
|
||||
ki = ki * 1.0;
|
||||
kd = kd * 1.0;
|
||||
state_next = 'Track';
|
||||
end
|
||||
elseif strcmp(state, 'Track')
|
||||
if abs(ef) > 0.01
|
||||
kp = kp * 1.0;
|
||||
ki = ki * 1.0;
|
||||
kd = kd * 1.0;
|
||||
state_next = 'Acquisition';
|
||||
end
|
||||
end
|
||||
if strcmp(state_next, state) == 0
|
||||
disp(state);
|
||||
end
|
||||
dy = ypid - y_last;
|
||||
y_last = ypid;
|
||||
[yvelo, ydist, zfp] = plant(zfp, Nd, dy);
|
||||
ev(n) = e;
|
||||
efv(n) = ef;
|
||||
y1v(n) = ypid;
|
||||
y2v(n) = ydist;
|
||||
ypv(n) = zfc.yp;
|
||||
yiv(n) = zfc.yi;
|
||||
ydv(n) = zfc.yd;
|
||||
state = state_next;
|
||||
end
|
||||
|
||||
if 1
|
||||
subplot(3, 1, 1)
|
||||
plot(1:length(x), ev, 1:length(x), efv); grid; legend("Error", "Error_{Filtered}")
|
||||
subplot(3, 1, 2)
|
||||
plot(1:length(x), y1v, 1:length(x), ypv, 1:length(x), yiv, 1:length(x), ydv); grid; legend("PID", "P", "I", "D")
|
||||
subplot(3, 1, 3)
|
||||
plot(1:length(x), x, 1:length(x), y2v); grid; legend("Target", "Plant")
|
||||
end
|
||||
|
||||
function [yvelo, ydist, zf] = plant(zi, nd, x)
|
||||
b = [zeros(1, nd-1) 0.01];
|
||||
a = [1 -1];
|
||||
if zi.velo == 0
|
||||
zi.velo = zeros(1, max(length(a), length(b))-1);
|
||||
end
|
||||
if zi.dist == 0
|
||||
zi.dist = zeros(1, 1);
|
||||
end
|
||||
|
||||
[yvelo, zf.velo] = filter(b, a, x, zi.velo);
|
||||
[ydist, zf.dist] = filter([1], [1 -1], yvelo, zi.dist);
|
||||
|
||||
Executable
+48
@@ -0,0 +1,48 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} psample (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-04-19
|
||||
|
||||
function [h] = psample (N)
|
||||
P = [10 10 10 10];
|
||||
R = calcRange(P);
|
||||
|
||||
h = zeros(1, length(P));
|
||||
|
||||
for k=1:N,
|
||||
ii = getSample(R);
|
||||
h(ii) = h(ii) + 1/N;
|
||||
end
|
||||
|
||||
function R = calcRange(P)
|
||||
P = P / sum(P)
|
||||
R0 = 0;
|
||||
for k=1:length(P)
|
||||
R0 = R0 + P(k);
|
||||
R(k) = R0;
|
||||
end
|
||||
|
||||
function ii = getSample(R)
|
||||
Z = rand();
|
||||
cand = find(Z <= R);
|
||||
ii=cand(1);
|
||||
|
||||
Executable
+44
@@ -0,0 +1,44 @@
|
||||
## Copyright (C) 2016 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} pt_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2016-11-04
|
||||
|
||||
function pt_eval (vX, vY)
|
||||
|
||||
if 0
|
||||
k = sqrt(2)/1.5;
|
||||
v = sqrt(vX^2 + vY^2);
|
||||
nx = k*abs(vX)/v;
|
||||
ny = k*abs(vY)/v;
|
||||
else
|
||||
k = 1.0/1.5;
|
||||
nx = k;
|
||||
ny = k;
|
||||
end
|
||||
|
||||
mot1 = 0.5*vX*nx + vY*ny
|
||||
mot2 = -0.5*vX*nx + vY*ny
|
||||
|
||||
rotX = mot1 - mot2
|
||||
rotY = 0.5*(mot1 + mot2)
|
||||
vrot = sqrt(rotX^2 + rotY^2)
|
||||
endfunction
|
||||
Executable
+55
@@ -0,0 +1,55 @@
|
||||
## Copyright (C) 2018 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} sallenkey_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2018-05-28
|
||||
|
||||
function sallenkey_eval (f_cut_Hz, Q)
|
||||
|
||||
w_cut = 2*pi*f_cut_Hz;
|
||||
|
||||
m = 1.0;
|
||||
n = Q*(m*m + 1)/m;
|
||||
|
||||
R = 1.0e+3;
|
||||
C = 1/(R*w_cut)
|
||||
|
||||
R1 = m*R
|
||||
R2 = R/m
|
||||
|
||||
C1 = n*C
|
||||
C2 = C/n
|
||||
|
||||
|
||||
w0 = 0.1;
|
||||
w1 = 2*pi*1e+6;
|
||||
w_step = 10;
|
||||
|
||||
s = j*(w0:w_step:w1);
|
||||
|
||||
H_s = 1./(1 + C2*(R1 + R2)*s + C1*C2*R1*R2*s.^2);
|
||||
|
||||
semilogx(abs(s)/(2*pi), abs(H_s)); grid; xlabel('f/Hz'); ylabel('|H(j*2*pi*f)|')
|
||||
|
||||
|
||||
|
||||
|
||||
endfunction
|
||||
Executable
+61
@@ -0,0 +1,61 @@
|
||||
## Copyright (C) 2018 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} stdp_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2018-01-17
|
||||
|
||||
function stdp_eval ()
|
||||
|
||||
N = 8;
|
||||
|
||||
Vp = zeros(N,1);
|
||||
W = rand(N, 1)
|
||||
|
||||
K = 100;
|
||||
alpha = 0.5;
|
||||
beta = 0.5;
|
||||
thresh = 2.0;
|
||||
kn = 0.01;
|
||||
mu = 0.01;
|
||||
|
||||
Vf = 0;
|
||||
for k=1:K,
|
||||
|
||||
Vin = rand(N,1) > 0.8;
|
||||
Vp = max(alpha*Vp, Vin);
|
||||
|
||||
V = sum(W.*Vp);
|
||||
n = kn*(2.0 * (0.5 - rand()));
|
||||
fire = ((V+n) >= thresh);
|
||||
Vf = max(beta*Vf, fire);
|
||||
|
||||
W = W + mu*Vp*Vf;
|
||||
|
||||
|
||||
_V(k) = V;
|
||||
_Vin(:, k) = Vin;
|
||||
_fire(k) = fire;
|
||||
|
||||
end
|
||||
|
||||
plot(1:K, _V, 1:K, _fire); grid;
|
||||
|
||||
endfunction
|
||||
Executable
+36
@@ -0,0 +1,36 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} ui_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-07-12
|
||||
|
||||
function ui_eval()
|
||||
|
||||
% create figure and panel on it
|
||||
f = figure;
|
||||
p = uipanel("title", "Panel Title", "position", [.25 .25 .5 .5]);
|
||||
|
||||
% add two buttons to the panel
|
||||
b1 = uicontrol ("parent", p, "callback", "onPush(gcf)", "string", "A Button", "position",[18 10 150 36]);
|
||||
b2 = uicontrol ("parent", p, "string", "Another Button", "position",[18 60 150 36]);
|
||||
|
||||
endfunction
|
||||
|
||||
Executable
+43
@@ -0,0 +1,43 @@
|
||||
## Copyright (C) 2018 Jens Ahrensfeld
|
||||
##
|
||||
## 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} vanDusen_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2018-05-28
|
||||
|
||||
function vanDusen_eval (R0, Tmin, Tmax, dT)
|
||||
|
||||
a = +3.90830e-03
|
||||
b = -5.77500e-07
|
||||
c = -4.18301e-12
|
||||
|
||||
T = Tmin:dT:Tmax;
|
||||
|
||||
R1 = R0*(1 + a*T + b*T.^2);
|
||||
R2 = c.*(T - 100).*T.^3;
|
||||
|
||||
|
||||
a_IEC = 0.00385055;
|
||||
a_SAMA = 0.00392;
|
||||
|
||||
plot(T, R1, T, R0*(1+a_IEC*T), 'r', T, R0*(1+a_SAMA*T), 'g'); grid; xlabel('T/°C'); ylabel('RTD/ohms'); legend('van Dusen','a_{IEC}','a_{SAMA}');
|
||||
|
||||
|
||||
endfunction
|
||||
Executable
+28
@@ -0,0 +1,28 @@
|
||||
function vga_eval(gain_dB)
|
||||
% gain_dB : combined gain
|
||||
|
||||
% Constants (gain contraints of HMC625)
|
||||
gain_min_dB = -13.5;
|
||||
gain_max_dB = +18.0;
|
||||
|
||||
% Gains of individual VGA
|
||||
vga_gain = zeros(1,2);
|
||||
|
||||
if gain_dB > 0
|
||||
for k=1:length(vga_gain),
|
||||
vga_gain(k) = min(gain_max_dB, gain_dB);
|
||||
gain_dB = gain_dB - vga_gain(k);
|
||||
end
|
||||
else
|
||||
for k=1:length(gain),
|
||||
vga_gain(k) = max(gain_min_dB, gain_dB);
|
||||
gain_dB = gain_dB - vga_gain(k);
|
||||
end
|
||||
end
|
||||
|
||||
vga_gain = vga_gain
|
||||
fprintf(stdout, "Gain = %f\n", vga_gain(1) + vga_gain(2));
|
||||
if gain_dB > 0
|
||||
fprintf("Gain not reached!\n");
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user