annotate carfac/ihc_coeffs.cc @ 635:0bdd58ee6e92

ffmpeg no longer accepts a qscale value of 0. Changed qscale to 1, which also gives a very high quality output
author sness@sness.net
date Fri, 24 May 2013 22:38:09 +0000
parents 586b0677aae8
children
rev   line source
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 }