alexbrandmeyer@626
|
1 //
|
alexbrandmeyer@626
|
2 // ihc_coeffs.cc
|
alexbrandmeyer@626
|
3 // CARFAC Open Source C++ Library
|
alexbrandmeyer@626
|
4 //
|
alexbrandmeyer@626
|
5 // Created by Alex Brandmeyer on 5/18/13.
|
alexbrandmeyer@626
|
6 // Copyright (c) 2013 Alex Brandmeyer. All rights reserved.
|
alexbrandmeyer@626
|
7 //
|
alexbrandmeyer@626
|
8
|
alexbrandmeyer@626
|
9 #include "ihc_coeffs.h"
|
alexbrandmeyer@626
|
10
|
alexbrandmeyer@626
|
11 void IHCCoeffs::Design(const IHCParams& ihc_params, const FPType fs) {
|
alexbrandmeyer@626
|
12 // TODO (alexbrandmeyer): verify acceptability of/documentation level needed
|
alexbrandmeyer@626
|
13 // for use of short intermediate variable names.
|
alexbrandmeyer@626
|
14 if (ihc_params.just_hwr_) {
|
alexbrandmeyer@626
|
15 just_hwr_ = ihc_params.just_hwr_;
|
alexbrandmeyer@626
|
16 } else {
|
alexbrandmeyer@626
|
17 // This section calculates conductance values using two pre-defined scalars.
|
alexbrandmeyer@626
|
18 FloatArray x(1);
|
alexbrandmeyer@626
|
19 FPType conduct_at_10, conduct_at_0;
|
alexbrandmeyer@626
|
20 x(0) = 10.0;
|
alexbrandmeyer@626
|
21 x = CARFACDetect(x);
|
alexbrandmeyer@626
|
22 conduct_at_10 = x(0);
|
alexbrandmeyer@626
|
23 x(0) = 0.0;
|
alexbrandmeyer@626
|
24 x = CARFACDetect(x);
|
alexbrandmeyer@626
|
25 conduct_at_0 = x(0);
|
alexbrandmeyer@626
|
26 if (ihc_params.one_cap_) {
|
alexbrandmeyer@626
|
27 FPType ro = 1 / conduct_at_10 ;
|
alexbrandmeyer@626
|
28 FPType c = ihc_params.tau1_out_ / ro;
|
alexbrandmeyer@626
|
29 FPType ri = ihc_params.tau1_in_ / c;
|
alexbrandmeyer@626
|
30 FPType saturation_output = 1 / ((2 * ro) + ri);
|
alexbrandmeyer@626
|
31 FPType r0 = 1 / conduct_at_0;
|
alexbrandmeyer@626
|
32 FPType current = 1 / (ri + r0);
|
alexbrandmeyer@626
|
33 cap1_voltage_ = 1 - (current * ri);
|
alexbrandmeyer@626
|
34 just_hwr_ = false;
|
alexbrandmeyer@626
|
35 lpf_coeff_ = 1 - exp( -1 / (ihc_params.tau_lpf_ * fs));
|
alexbrandmeyer@626
|
36 out1_rate_ = ro / (ihc_params.tau1_out_ * fs);
|
alexbrandmeyer@626
|
37 in1_rate_ = 1 / (ihc_params.tau1_in_ * fs);
|
alexbrandmeyer@626
|
38 one_cap_ = ihc_params.one_cap_;
|
alexbrandmeyer@626
|
39 output_gain_ = 1 / (saturation_output - current);
|
alexbrandmeyer@626
|
40 rest_output_ = current / (saturation_output - current);
|
alexbrandmeyer@626
|
41 rest_cap1_ = cap1_voltage_;
|
alexbrandmeyer@626
|
42 } else {
|
alexbrandmeyer@626
|
43 FPType ro = 1 / conduct_at_10;
|
alexbrandmeyer@626
|
44 FPType c2 = ihc_params.tau2_out_ / ro;
|
alexbrandmeyer@626
|
45 FPType r2 = ihc_params.tau2_in_ / c2;
|
alexbrandmeyer@626
|
46 FPType c1 = ihc_params.tau1_out_ / r2;
|
alexbrandmeyer@626
|
47 FPType r1 = ihc_params.tau1_in_ / c1;
|
alexbrandmeyer@626
|
48 FPType saturation_output = 1 / (2 * ro + r2 + r1);
|
alexbrandmeyer@626
|
49 FPType r0 = 1 / conduct_at_0;
|
alexbrandmeyer@626
|
50 FPType current = 1 / (r1 + r2 + r0);
|
alexbrandmeyer@626
|
51 cap1_voltage_ = 1 - (current * r1);
|
alexbrandmeyer@626
|
52 cap2_voltage_ = cap1_voltage_ - (current * r2);
|
alexbrandmeyer@626
|
53 just_hwr_ = false;
|
alexbrandmeyer@626
|
54 lpf_coeff_ = 1 - exp(-1 / (ihc_params.tau_lpf_ * fs));
|
alexbrandmeyer@626
|
55 out1_rate_ = 1 / (ihc_params.tau1_out_ * fs);
|
alexbrandmeyer@626
|
56 in1_rate_ = 1 / (ihc_params.tau1_in_ * fs);
|
alexbrandmeyer@626
|
57 out2_rate_ = ro / (ihc_params.tau2_out_ * fs);
|
alexbrandmeyer@626
|
58 in2_rate_ = 1 / (ihc_params.tau2_in_ * fs);
|
alexbrandmeyer@626
|
59 one_cap_ = ihc_params.one_cap_;
|
alexbrandmeyer@626
|
60 output_gain_ = 1 / (saturation_output - current);
|
alexbrandmeyer@626
|
61 rest_output_ = current / (saturation_output - current);
|
alexbrandmeyer@626
|
62 rest_cap1_ = cap1_voltage_;
|
alexbrandmeyer@626
|
63 rest_cap2_ = cap2_voltage_;
|
alexbrandmeyer@626
|
64 }
|
alexbrandmeyer@626
|
65 }
|
alexbrandmeyer@626
|
66 ac_coeff_ = 2 * PI * ihc_params.ac_corner_hz_ / fs;
|
alexbrandmeyer@626
|
67 } |