git-svn-id: http://moon:8086/svn/matlab/trunk@100 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
2018-12-14 17:16:15 +00:00
parent 1ab94a4bea
commit f59fb8f67d
17 changed files with 1121 additions and 0 deletions
Executable
+41
View File
@@ -0,0 +1,41 @@
## 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} =} adc_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-12-05
function retval = adc_eval (x, numStages)
retVal = [];
for n=numStages-1:-1:0,
k = 2^n;
if x >= k,
retVal = [retVal 1];
x = x - k;
else
retVal = [retVal 0];
end
x = x
end
retVal
endfunction
Executable
+30
View File
@@ -0,0 +1,30 @@
## 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} =} f2l (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-10-15
function l = f2l (f_MHz)
c = 3.0e8
l = 1.0e-4*c/f_MHz;
endfunction
Executable
+30
View File
@@ -0,0 +1,30 @@
## 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} =} lfsr (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-12-05
function next = lfsr (size, poly, curr)
next = 2*xor(curr, poly);
endfunction
+64
View File
@@ -0,0 +1,64 @@
function y = manchester(x, type)
N = length(x);
mtype = 'ieee802.3';
if (nargin > 1)
mtype = type
end
t = -1;
v = -1;
if (strcmp(mtype, 'I') || strcmp(mtype, 'ieee802.3'))
v = 0;
t = 1;
end
if (strcmp(mtype, 'II') || strcmp(mtype, 'Thomas'))
v = 0;
t = 2;
end
if (strcmp(mtype, 'BP-M'))
v = 1;
t = 1;
end
if (strcmp(mtype, 'BP-S'))
v = 0;
t = 1;
end
if (t == 1)
s = 1;
y = [];
for n=1:N,
if x(n) == v
s = not(s);
y = [y s];
y = [y s];
else
s = not(s);
y = [y s];
s = not(s);
y = [y s];
end
end
end
if (t == 2)
s = 1;
y = [];
for n=1:N,
if x(n) == v
y = [y not(s)];
y = [y s];
else
y = [y s];
y = [y not(s)];
end
end
end
endfunction
Executable
+15
View File
@@ -0,0 +1,15 @@
function flexRET_eval(tilt_ref)
%tilt_ref = 3356
tilt_min = 4000;
unload_steps = 560;
tilt_target_distance = tilt_min - unload_steps
tooth_steps = 360/14*4
k = fix(tilt_target_distance / tooth_steps + 0.5)
tilt_min_raster = fix(tilt_ref + k*tooth_steps + 0.5)
probe = (tilt_min_raster-tilt_ref) / tooth_steps
Executable
+156
View File
@@ -0,0 +1,156 @@
## 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} =} garage (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-12-06
function bits = garage (varargin)
params = struct ('numSamplesPerSym', 4, 'with_filter', 0, 'k_noise', 0.04);
units = struct ('numSamplesPerSym', 'sps', 'with_filter', '', 'k_noise', '');
% Parse parameters
names = fieldnames(params);
for k=1:nargin-1,
for n=1:length(names),
if strcmpi(varargin{k}, names{n})
params.(names{n}) = varargin{k+1};
end
end
end
print_parameters(params, units)
k_n = params.k_noise; % NOise
k_s = 1.0; % Sym
numSamplesPerSym = params.numSamplesPerSym;
baud = 9600;
fs = baud * numSamplesPerSym;
numSyms = 50;
numBursts = 3;
numSymsPauseBetweenBurst = 50;
syms = rand(numSyms, 1) > 0.5;
bit = 0;
syms_m = [];
% Line coding
for n=1:numSyms,
if syms(n) == 1
syms_m = [syms_m bit];
bit = not(bit);
syms_m = [syms_m bit];
bit = not(bit);
else
syms_m = [syms_m bit];
syms_m = [syms_m bit];
bit = not(bit);
end
end
% Upconvert
x = [];
for k=1:numBursts
for n=1:2*numSyms,
for m=1:numSamplesPerSym,
x = [x syms_m(n)];
end
end
x = [x zeros(1, numSymsPauseBetweenBurst*numSamplesPerSym)];
end
% Channel
[b,a] = butter(2, baud/fs);
if params.with_filter
x = filter(b, a, x);
end
y = k_s*x + k_n*randn(1, length(x));
y = wavread('seq.wav');
N = length(y);
n = 1:N;
bit = 0;
count = numSamplesPerSym;
smp = [];
smp_n = [];
bits = [];
% Receive
state = "Init";
peakFindCount = 10;
v_min = 0;
v_max = 0;
for n=1:N
state_next = state;
v_thr = (v_max - v_min) / 2;
if y(n) < v_min
v_min = y(n);
elseif y(n) > v_max
v_max = y(n);
end
v_min = v_min + 1e-5*(v_thr - v_min);
v_max = v_max - 1e-5*v_max;
if strcmp(state, "Init")
state_next = "Decode";
elseif strcmp(state, "Decode")
bit_curr = y(n) > v_thr;
if (bit ~= bit_curr)
count = fix(numSamplesPerSym/2);
bit = bit_curr;
end
if count > 0
count = count - 1;
else
count = numSamplesPerSym-1;
smp = [smp y(n)];
smp_n = [smp_n n];
bits = [bits bit_curr];
end;
_cnt(n) = count;
end
_v_tr(n) = v_thr;
if ~strcmp(state, state_next)
fprintf(stdout, "Change state: %s => %s\n", state, state_next);
state = state_next;
end
end
bits = bits';
n = 1:N;
% Plot
subplot(2, 1, 1)
plot(n, y, '-o', smp_n, smp, 'rx', n, _v_tr, 'y'); grid;
subplot(2, 1, 2)
plot(n, _cnt); grid;
endfunction
Executable
+152
View File
@@ -0,0 +1,152 @@
## 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} =} garage (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-12-06
function [bits, x] = garage_ip (numSamplesPerSym)
k_n = 0.00; % NOise
k_s = 1.0; % Sym
baud_init = 9600;
fs = baud_init * numSamplesPerSym;
numSyms = 100;
numBursts = 3;
numSymsPauseBetweenBurst = 50;
syms = rand(numSyms, 1) > 0.5;
bit = 0;
% Line coding
syms_m = manchester(syms);
% Upconvert
x = [];
for k=1:numBursts
for n=1:2*numSyms,
for m=1:numSamplesPerSym,
x = [x syms_m(n)];
end
end
x = [x zeros(1, numSymsPauseBetweenBurst*numSamplesPerSym)];
end
% Channel
[b,a] = butter(2, numSamplesPerSym/4*baud_init/fs);
y = resample (x, 131, 121);
%y = x;
y = k_s*filter(b, a, y) + k_n*randn(1, length(y));
N = length(y);
baud = baud_init;
bit = 0;
% The master clock counter
countReload = numSamplesPerSym-1;
count = countReload;
smp = [];
smp_n = [];
bits = [];
v_min = 0; % Threshold max
v_max = 0; % Threshold min
hyst_thr = 0.5; % Threshold hysteresis
rho_thr = 1e-5; % Threshold forgetting factor
alpha_lead = 0.016; % Symbol syncronizer loop filter lead
alpha_lag = 0.000008; % Symbol syncronizer loop filter lag
lag_accu = 1; % Symbol syncronizer loop filter
ns = 1; % Start sample source
n = 1; % Start sample sink
err = 0; % Error
while ns < N
% Get next interpolated sample
is = fix(ns);
mu = ns - is;
ys = (1-mu).*y(is) + mu.*y(is+1);
% Calculate threshold
v_thr = (v_max - v_min) / 2;
if ys < v_min
v_min = ys;
elseif ys > v_max
v_max = ys;
end
v_min = v_min + rho_thr*(v_thr - v_min);
v_max = v_max - rho_thr*v_max;
% Detect bit change
bitChg = 0;
if (bit == 1)
if ys < (hyst_thr*v_thr)
bit = 0;
bitChg = 1;
end
else
if ys > (hyst_thr*v_thr)
bit = 1;
bitChg = 1;
end
end
% Calc error
if (bitChg)
err = -(count - fix(numSamplesPerSym/2));
end
% Sample bit at baud rate = fs/numSamplesPerSym
if count == 0
smp = [smp ys];
smp_n = [smp_n n];
bits = [bits bit];
end;
if count > 0
count = count - 1;
else
count = countReload;
end
vcorr = alpha_lead*err + lag_accu;
lag_accu = lag_accu + alpha_lag*err;
baud = vcorr*fs/numSamplesPerSym;
_err(n) = err;
_baud(n) = baud;
_cnt(n) = vcorr;
_v_tr(n) = v_thr;
_ys(n) = ys;
n = n + 1;
ns = ns + vcorr;
end
bits = bits';
n = 1:length(_ys);
% Plot
subplot(3, 1, 1)
plot(n, _ys, smp_n, smp, 'ro', n, _v_tr, 'y'); grid;
subplot(3, 1, 2)
plot(n, _err); grid;
subplot(3, 1, 3)
plot(n, _baud); grid;
endfunction
Executable
+60
View File
@@ -0,0 +1,60 @@
## 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} =} gardner_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-12-13
function gardner_eval (x, nBitsPerSample, phase)
if mod(nBitsPerSample, 2)
error ("nBitsPerSample must be divisable by 2!");
end
Z = zeros(1,3);
countReload = nBitsPerSample/2;
count = countReload-1;
N = length(x);
vc = 0;
k = 1;
for n=1:N,
if count == phase
Z = [x(n) Z(1:2)];
vc = Z(2) * (Z(3) - Z(1));
_y(k) = x(n);
k = k + 1;
end
if count == 0
count = countReload-1;
else
count = count - 1;
end
_vc(n) = vc;
end
subplot(2,1 ,1)
plot(1:N, _vc); grid;
subplot(2,1 ,2)
plot(1:k-1, _y, '-o'); grid;
endfunction
Executable
+98
View File
@@ -0,0 +1,98 @@
## 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} =} im_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-10-22
function s = im_eval ()
s1 = sig_gen('lo', 'sine', [0 500], [0.0 1]);
s2 = sig_gen('s1', 'sine', [0 100 500 900 1400], [0.0 0.5 1.0 0.5 0.25]);
s = modulate(s1, s2);
close all;
plotSig(s);
function s = sig_gen(name, type, freq, amp)
peaks = [];
switch type
case 'sine'
f = freq;
a = amp;
case 'rect'
N = 10;
f = [];
a = [];
k = 1;
for n=1:N
f = [f k*freq];
a = [a amp/k];
k = k + 2;
end
endswitch
s = struct('name', name, 'f', f, 'a', a);
endfunction
function m = modulate(s1, s2)
m = struct('name', sprintf("%s x %s", s1.name, s2.name), 'f', [], 'a', []);
f = [];
a = [];
for i=1:length(s1.f)
for j=1:length(s2.f)
f1 = s1.f(i) - s2.f(j);
f2 = s1.f(i) + s2.f(j);
a = s1.a(i) * s2.a(j);
m = addFreq(m, f1, a);
m = addFreq(m, f2, a);
end
end
endfunction
function x = addFreq(x, f, a)
found = 0;
for i=1: length(x.f)
if (x.f(i) == f)
found = i;
break;
end
end
if (found > 0)
x.a(found) = x.a(found) + a;
elseif a ~= 0
x.f = [x.f f];
x.a = [x.a a];
end
endfunction
function plotSig(s)
stem(s.f, s.a, 'baseline', -10); grid; legend(s.name)
endfunction
endfunction
+50
View File
@@ -0,0 +1,50 @@
## 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} =} interpol_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-11-21
function interpol_eval ()
N = 20;
n = (0:N-1);
f = 1;
x = cos(2*pi*f*n/N);
Ts = 0.75;
ii = 0;
ns = [];
while ii < (N-1)
ns = [ns ii];
ii = ii + Ts;
end
is = fix(ns);
fs = ns - is;
is = is + 1;
xs = (1-fs).*x(is) + fs.*x(is+1);
plot(n, x, '-*', ns, xs, 'rx'); grid;
endfunction
+69
View File
@@ -0,0 +1,69 @@
## 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} =} kalman1d_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-09-28
function kalman1d_eval()
var_meas = 1.0;
pos_true = 10.0;
k_motion = 0.0;
f_motion = 2.0;
x_h = 0.0; % initial guess
v_x = 0.5; % initial guess
v_y = 1.0; % initial guess
v_y_h_0 = 0;
v_y_h = 0;
N = 10000;
for n=1:N,
x_h_(n) = x_h;
v_x_(n) = v_x;
y = pos_true + var_meas*randn() + k_motion*sin(f_motion*2*pi*n/N);
w = v_x/(v_x + v_y);
x_h = x_h + w * (y - x_h);
v_x = 1/(1/v_x + 1/v_y);
v_y_h_0 = 0.5*v_y_h_0 + 0.5*(y-x_h)^2;
y_(n) = y;
v_y_h = 0.995*v_y_h + 0.005*v_y_h_0;
v_y_h_(n) = sqrt(v_y_h);
w_(n) = w;
end
subplot(2,1,1)
plot(1:N, y_, 1:N, x_h_, '-r'); grid; legend('y', 'x_h')
subplot(2,1,2)
plot(1:N, v_x_, '-r', 1:N, w_, '-b'); grid; legend('v_x', 'w')
endfunction
Executable
+38
View File
@@ -0,0 +1,38 @@
## 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} =} mix_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-11-30
function [retval] = mix_eval (input1, input2)
fs = 2e16;
fm = 1.0e6;
bw = 1.0e5;
fif = 0;
flo = fm - fif;
fm_p0 = mod(fm - flo, fs)
fm_p1 = mod(fm + flo, fs)
endfunction
Executable
+50
View File
@@ -0,0 +1,50 @@
## 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} =} motor_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-08-01
function cnt_expected = motor_eval (cnt_tooth, cnt, round_mode)
cnt_expected = 0
cnt_err = mod(abs(cnt),cnt_tooth);
if (cnt_err >= 0.5*cnt_tooth)
cnt_err = cnt_err - cnt_tooth;
end
if strcmpi(round_mode, 'nearest')
cnt_expected = cnt - sign(cnt)*cnt_err;
elseif strcmpi(round_mode, 'positive')
cnt_expected = cnt - cnt_err
if (cnt < 0)
cnt_expected = cnt - cnt_err + cnt_tooth
end
elseif strcmpi(round_mode, 'negative')
cnt_expected = cnt - cnt_err
end
err = cnt - cnt_expected
endfunction
Executable
+41
View File
@@ -0,0 +1,41 @@
## 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} =} ppm_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-10-17
function ppm_eval (kp, kn)
Tp = 200; %
Tp_s = 200 ;
hp = [ones(1, Tp_s)];
x = kp*[zeros(1, 10*Tp) ones(1, Tp) zeros(1, 20*Tp) ones(1, Tp) zeros(1, 10*Tp)];
x = x + kn*randn(1, length(x));
n = 1:length(x);
y = filter(hp, 1, x)/Tp;
plot(n, x, n, y, '-r'); grid;
endfunction
Executable
+54
View File
@@ -0,0 +1,54 @@
## 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} =} qdemod_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-11-16
function qdemod_eval
fa = 1000;
T = 1/fa;
N = 1000
t = (0:N-1)*T;
omega_x_0 = 100.0;
omega_x_1 = 200.0;
phi_x = pi/8*0;
omega_lo = 150.0;
lo_r = cos(2*pi*omega_lo*t);
lo_i = sin(2*pi*omega_lo*t);
x = cos(2*pi*omega_x_0*t + phi_x) + cos(2*pi*omega_x_1*t + phi_x);
y = x.*lo_r + x.*lo_i*i;
subplot(2,1,1);
plot(t, y, t, x); grid;
subplot(2,1,2);
Y = fftshift(fft(y, N))/N;
X = fftshift(fft(x, N))/N;
f = (-length(X)/2:length(X)/2-1)/N*fa;
plot(f, abs(X), f, abs(Y)); grid;
endfunction
+59
View File
@@ -0,0 +1,59 @@
## 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} =} test_motor_eval (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-08-01
function [retval] = test_motor_eval ()
k = 100;
% [cnt, expected]
test_nearest = [ 10 0; 20 0; 49 0; 50 100; 51 100; -10 0; -20 0; -49 0; -50 -100; -51 -100];
test_positive = [ 10 0; 20 0; 49 0; 50 100; 51 100; -10 0; -20 0; -49 0; -50 -100; -51 -100];
test_negative = [ 10 0; 20 0; 49 0; 50 100; 51 100; -10 0; -20 0; -49 0; -50 -100; -51 -100];
disp('Run nearest:')
for i=1:length(test_nearest),
val = test_nearest(i,:)(1);
res_exp = test_nearest(i,:)(2);
result = motor_eval(k, val, 'nearest')
printf("%4u: %f: %f => %f ", i, val, res_exp, result)
if result == res_exp
printf("Pass!\n");
else
printf("Failed!\n");
end
end
disp('Run positive:')
for i=1:length(test_positive),
val = test_positive(i,:)(1);
res_exp = test_positive(i,:)(2);
result = motor_eval(k, val, 'positive')
printf("%4u: %f: %f => %f ", i, val, res_exp, result)
if result == res_exp
printf("Pass!\n");
else
printf("Failed!\n");
end
end
endfunction
+114
View File
@@ -0,0 +1,114 @@
## 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} =} tunable_bandpass (@var{input1}, @var{input2})
##
## @seealso{}
## @end deftypefn
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
## Created: 2018-11-26
## taken from: https://www.mwrf.com/components/bandpass-filters-feature-wide-tuning-ranges
function tunable_bandpass(varargin)
params = struct ('f_low_Hz', 100e6, 'f_high_Hz', 600e6, 'f_step_Hz', 1e6, 'B_geo_Hz', 20e6, 'R_geo', 1000, 'R_0', 50, 'k_gamma', 1.0);
units = struct ('f_low_Hz', 'Hz', 'f_high_Hz', 'Hz', 'f_step_Hz', 'Hz', 'B_geo_Hz', 'Hz', 'R_geo', 'Ω', 'R_0', 'Ω', 'k_gamma', '');
% Parse parameters
names = fieldnames(params);
for k=1:nargin-1,
for n=1:length(names),
if strcmpi(varargin{k}, names{n})
params.(names{n}) = varargin{k+1};
end
end
end
print_parameters(params)
f_low_Hz = params.f_low_Hz; % Minimum tunable filter center frequency (Hz)
f_high_Hz = params.f_high_Hz; % Maximum tunable filter center frequency (Hz)
B_geo_Hz = params.B_geo_Hz; % -3 dB RF filter bandwidth (in Hz) at the geometric center frequency
R_geo = params.R_geo; % Internal filter impedance (in Ω) at the geometric center frequency of the filter
R_0 = params.R_0; % Port impedance, usually taken as 50 Ω
k_gamma = params.k_gamma; % Constant value. A value of γ = 1.0 results in a constant-Q filter design,
% while a value of γ = 2.0 results in a constant-bandwidth filter design.
% A value between one and two will yield a blend of the two filter characteristics.
% Inductor Q values will be more critical as the value of γ is increased.
f_step_Hz = params.f_step_Hz;
f_Hz = f_low_Hz:f_step_Hz:f_high_Hz;
omega = 2*pi*f_Hz;
f_geo_Hz = sqrt(f_low_Hz*f_high_Hz) % Hz
omega_geo = 2*pi*f_geo_Hz % rad/sec
% Design I.
R_t = R_geo*(omega/omega_geo).^k_gamma; % Equ. (1)
L_c = R_geo/omega_geo % Equ. (2)
C_tgeo = 1./(pi*sqrt(2)*R_geo*B_geo_Hz) % Equ. (3)
L_eff = 1./(omega_geo.^2*C_tgeo) % Equ. (4)
L_r = L_eff * L_c / (L_c - L_eff) % Equ. (5)
C_t = (omega_geo./omega).^2 * C_tgeo; % Equ. (6)
% Tuning capacitances C1 and C2 are given by Eqs. 7 and 8
C_1 = (omega*R_0).^(-1) .* sqrt((omega_geo./omega).^k_gamma * (R_0/R_geo) + omega.^2.*C_t.^2*R_0*R_geo.*(omega/omega_geo).^k_gamma - 1); % Equ. (7)
C_2 = ((omega.^2.*C_t)./((omega_geo./omega).^(2*k_gamma) .* (1/R_geo)^2 + (omega.*C_t).^2) - (omega.^2*R_0^2.*C_1)./(1+(omega*R_0.*C_1).^2)).^(-1); % Equ. (8)
C_1_geo = (omega_geo*R_0).^(-1) .* sqrt((omega_geo./omega_geo).^k_gamma * (R_0/R_geo) + omega_geo.^2.*C_tgeo.^2*R_0*R_geo.*(omega_geo/omega_geo).^k_gamma - 1) % Equ. (7)
C_2_geo = ((omega_geo.^2.*C_tgeo)./((omega_geo./omega_geo).^(2*k_gamma) .* (1/R_geo)^2 + (omega_geo.*C_tgeo).^2) - (omega_geo.^2*R_0^2.*C_1_geo)./(1+(omega_geo*R_0.*C_1_geo).^2)).^(-1) % Equ. (8)
subplot (2,1,1)
plot(f_Hz*1e-6, C_1*1e12); grid; xlabel("f/MHz"), ylabel("C_1 [pF]");
subplot (2,1,2)
plot(f_Hz*1e-6, C_2*1e12); grid; xlabel("f/MHz"), ylabel("C_2 [pF]");
% Design II.
L_c = R_geo/omega_geo; % Equ. (9)
L_eff = R_geo./(pi*sqrt(2)*B_geo_Hz); % Equ. (10)
L_r = L_eff - L_c; % Equ. (11)
C_tgeo = 1./(L_eff*omega_geo^2); % Equ. (12)
C_t = (omega_geo./omega).^2 * C_tgeo; % Equ. (13)
a = -omega.^2*R_0.*R_t; % Equ. (14)
b = 1./C_t; % ...
d = R_t/R_0; % Equ. (14)
alpha = (d-b.^2/a)./(1+b.^2/a - d); % Equ. (15)
beta = (b./a)./(1 + b.^2/a - d); % Equ. (16)
C_2 = alpha.*C_1 + beta; % Equ. (17)
function print_parameters(params)
align = 32;
names = fieldnames(params);
for n=1:length(names),
fprintf('%s', names{n});
remain = align - length(names{n});
if remain < 0
error('Invalid variable length!');
else
for j=1:remain
fprintf(' ');
end
fprintf('= %g %s\n', params.(names{n}), units.(names{n}));
end
end
endfunction
endfunction