From a7ec99e21889696b594c6d0ef787e7803d2ea03a Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Fri, 14 Dec 2018 17:26:13 +0000 Subject: [PATCH] added git-svn-id: http://moon:8086/svn/matlab/trunk@102 801c6759-fa7c-4059-a304-17956f83a07c --- bendrtd_eval.m | 38 +++++++++++++++ common/print_parameters.m | 16 +++++++ garage_results.m | 32 +++++++++++++ tuneable_bandpass.m | 98 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 184 insertions(+) create mode 100644 bendrtd_eval.m create mode 100644 common/print_parameters.m create mode 100644 garage_results.m create mode 100644 tuneable_bandpass.m diff --git a/bendrtd_eval.m b/bendrtd_eval.m new file mode 100644 index 0000000..6e71de1 --- /dev/null +++ b/bendrtd_eval.m @@ -0,0 +1,38 @@ +## Copyright (C) 2018 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} =} bendrtd_eval (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2018-09-05 + +function [retval] = bendrtd_eval (radius_mm) + +%radius_mm = 0.1; +bend_angle_deg = 90; +probe_diameter_mm = 25.4/4; +probe_length_y_mm = 280; +probe_length_x_mm = 50; + +h = radius_mm*sin(2*pi*bend_angle_deg/360) +U = 2*pi*radius_mm*bend_angle_deg/360; +probe_length = probe_length_y_mm + probe_length_x_mm + 2*U + + +endfunction diff --git a/common/print_parameters.m b/common/print_parameters.m new file mode 100644 index 0000000..fdd7c8f --- /dev/null +++ b/common/print_parameters.m @@ -0,0 +1,16 @@ +function print_parameters(params, units) +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 diff --git a/garage_results.m b/garage_results.m new file mode 100644 index 0000000..9660ded --- /dev/null +++ b/garage_results.m @@ -0,0 +1,32 @@ +## Copyright (C) 2018 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} =} garage_results (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens +## Created: 2018-12-10 + +function garage_results() + +y = load("/home/jens/garage_y.dat", '-ascii'); +bits = load("/home/jens/garage_bits.dat", '-ascii'); +plot(y(:,1), y(:,2), bits(:,1), bits(:,2), 'xr'); grid; + +endfunction diff --git a/tuneable_bandpass.m b/tuneable_bandpass.m new file mode 100644 index 0000000..c5f288c --- /dev/null +++ b/tuneable_bandpass.m @@ -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 . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{retval} =} tunable_bandpass (@var{input1}, @var{input2}) +## +## @seealso{} +## @end deftypefn + +## Author: Jens Ahrensfeld +## Created: 2018-11-26 +## taken from: https://www.mwrf.com/components/bandpass-filters-feature-wide-tuning-ranges + +function tuneable_bandpass(varargin) + +params = struct ('f_low_Hz', 40e6, 'f_high_Hz', 800e6, 'f_step_Hz', 1e6, 'B_geo_Hz', 10e6, 'R_geo', 500, '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', 'O', 'R_0', 'O', '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, units) + +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 O) at the geometric center frequency of the filter +R_0 = params.R_0; % Port impedance, usually taken as 50 O + +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) + +endfunction +