Line data Source code
1 : /** 2 : * \file TimeVaryingSecondOrderSVFFilter.cpp 3 : */ 4 : 5 : #include "TimeVaryingSecondOrderSVFFilter.h" 6 : 7 : #include <boost/math/constants/constants.hpp> 8 : 9 : #include <cassert> 10 : 11 : namespace ATK 12 : { 13 : template<typename SVFCoefficients> 14 : class TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::SVFState 15 : { 16 : public: 17 : typename SVFCoefficients::DataType iceq1{0}; 18 : typename SVFCoefficients::DataType iceq2{0}; 19 : }; 20 : 21 : template<typename SVFCoefficients> 22 35 : TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::TimeVaryingSecondOrderSVFFilter(gsl::index nb_channels) 23 35 : :SVFCoefficients(nb_channels), state(std::make_unique<SVFState[]>(nb_channels)) 24 : { 25 35 : } 26 : 27 : template<typename SVFCoefficients> 28 35 : TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::~TimeVaryingSecondOrderSVFFilter() 29 : { 30 35 : } 31 : 32 : template<typename SVFCoefficients> 33 58 : void TimeVaryingSecondOrderSVFFilter<SVFCoefficients>::full_setup() 34 : { 35 58 : state = std::make_unique<SVFState[]>(nb_input_ports - 1); 36 58 : } 37 : 38 : template<typename DataType> 39 58 : void TimeVaryingSecondOrderSVFFilter<DataType>::process_impl(gsl::index size) const 40 : { 41 58 : assert(nb_input_ports - 1 == nb_output_ports); 42 : 43 3801146 : for(gsl::index i = 0; i < size; ++i) 44 : { 45 3801088 : update_coeffs(converted_inputs[0][i]); 46 : 47 7602196 : for(gsl::index j = 0; j < nb_input_ports - 1; ++j) 48 : { 49 3801088 : const DataType* ATK_RESTRICT input = converted_inputs[j+1]; 50 3801088 : DataType* ATK_RESTRICT output = outputs[j]; 51 : 52 3801088 : DataType v3 = input[i] - state[j].iceq2; 53 3801088 : DataType v1 = a1 * state[j].iceq1 + a2 * v3; 54 3801088 : DataType v2 = state[j].iceq2 + a2 * state[j].iceq1 + a3 * v3; 55 3801088 : state[j].iceq1 = 2 * v1 - state[j].iceq1; 56 3801088 : state[j].iceq2 = 2 * v2 - state[j].iceq2; 57 : 58 3801088 : output[i] = m0 * input[i] + m1 * v1 + m2 * v2; 59 : } 60 : } 61 58 : } 62 : 63 : template<typename DataType> 64 35 : TimeVaryingSecondOrderSVFBaseCoefficients<DataType>::TimeVaryingSecondOrderSVFBaseCoefficients(gsl::index nb_channels) 65 35 : :TypedBaseFilter<DataType>(1 + nb_channels, nb_channels) 66 : { 67 35 : } 68 : 69 : template<typename DataType_> 70 5 : void TimeVaryingSecondOrderSVFBaseCoefficients<DataType_>::set_Q(DataType_ Q) 71 : { 72 5 : if(Q <= 0) 73 : { 74 1 : throw std::out_of_range("Q must be strictly positive"); 75 : } 76 4 : this->Q = Q; 77 4 : setup(); 78 4 : } 79 : 80 : template<typename DataType> 81 1 : DataType TimeVaryingSecondOrderSVFBaseCoefficients<DataType>::get_Q() const 82 : { 83 1 : return Q; 84 : } 85 : 86 : template<typename DataType_> 87 4 : TimeVaryingSecondOrderSVFLowPassCoefficients<DataType_>::TimeVaryingSecondOrderSVFLowPassCoefficients(gsl::index nb_channels) 88 4 : :Parent(nb_channels) 89 : { 90 4 : } 91 : 92 : template<typename DataType> 93 524288 : void TimeVaryingSecondOrderSVFLowPassCoefficients<DataType>::update_coeffs(DataType g) const 94 : { 95 524288 : auto k = 1/Q; 96 524288 : a1 = 1 / (1 + g * (g + k)); 97 524288 : a2 = g * a1; 98 524288 : a3 = g * a2; 99 524288 : m0 = 0; 100 524288 : m1 = 0; 101 524288 : m2 = 1; 102 524288 : } 103 : 104 : template<typename DataType_> 105 5 : TimeVaryingSecondOrderSVFBandPassCoefficients<DataType_>::TimeVaryingSecondOrderSVFBandPassCoefficients(gsl::index nb_channels) 106 5 : :Parent(nb_channels) 107 : { 108 5 : } 109 : 110 : template<typename DataType> 111 393216 : void TimeVaryingSecondOrderSVFBandPassCoefficients<DataType>::update_coeffs(DataType g) const 112 : { 113 393216 : auto k = 1 / Q; 114 393216 : a1 = 1 / (1 + g * (g + k)); 115 393216 : a2 = g * a1; 116 393216 : a3 = g * a2; 117 393216 : m0 = 0; 118 393216 : m1 = 1; 119 393216 : m2 = 0; 120 393216 : } 121 : 122 : template<typename DataType_> 123 4 : TimeVaryingSecondOrderSVFHighPassCoefficients<DataType_>::TimeVaryingSecondOrderSVFHighPassCoefficients(gsl::index nb_channels) 124 4 : :Parent(nb_channels) 125 : { 126 4 : } 127 : 128 : template<typename DataType> 129 524288 : void TimeVaryingSecondOrderSVFHighPassCoefficients<DataType>::update_coeffs(DataType g) const 130 : { 131 524288 : auto k = 1 / Q; 132 524288 : a1 = 1 / (1 + g * (g + k)); 133 524288 : a2 = g * a1; 134 524288 : a3 = g * a2; 135 524288 : m0 = 1; 136 524288 : m1 = -k; 137 524288 : m2 = -1; 138 524288 : } 139 : 140 : template<typename DataType_> 141 4 : TimeVaryingSecondOrderSVFNotchCoefficients<DataType_>::TimeVaryingSecondOrderSVFNotchCoefficients(gsl::index nb_channels) 142 4 : :Parent(nb_channels) 143 : { 144 4 : } 145 : 146 : template<typename DataType> 147 524288 : void TimeVaryingSecondOrderSVFNotchCoefficients<DataType>::update_coeffs(DataType g) const 148 : { 149 524288 : auto k = 1 / Q; 150 524288 : a1 = 1 / (1 + g * (g + k)); 151 524288 : a2 = g * a1; 152 524288 : a3 = g * a2; 153 524288 : m0 = 1; 154 524288 : m1 = -k; 155 524288 : m2 = 0; 156 524288 : } 157 : 158 : template<typename DataType_> 159 4 : TimeVaryingSecondOrderSVFPeakCoefficients<DataType_>::TimeVaryingSecondOrderSVFPeakCoefficients(gsl::index nb_channels) 160 4 : :Parent(nb_channels) 161 : { 162 4 : } 163 : 164 : template<typename DataType> 165 524288 : void TimeVaryingSecondOrderSVFPeakCoefficients<DataType>::update_coeffs(DataType g) const 166 : { 167 524288 : auto k = 1 / Q; 168 524288 : a1 = 1 / (1 + g * (g + k)); 169 524288 : a2 = g * a1; 170 524288 : a3 = g * a2; 171 524288 : m0 = 1; 172 524288 : m1 = -k; 173 524288 : m2 = 2; 174 524288 : } 175 : 176 : template<typename DataType_> 177 6 : TimeVaryingSecondOrderSVFBellCoefficients<DataType_>::TimeVaryingSecondOrderSVFBellCoefficients(gsl::index nb_channels) 178 6 : :Parent(nb_channels) 179 : { 180 : 181 6 : } 182 : 183 : template<typename DataType_> 184 6 : void TimeVaryingSecondOrderSVFBellCoefficients<DataType_>::set_gain(DataType_ gain) 185 : { 186 6 : if(gain <= 0) 187 : { 188 1 : throw std::out_of_range("Gain must be strictly positive"); 189 : } 190 5 : this->gain = gain; 191 5 : setup(); 192 5 : } 193 : 194 : template<typename DataType> 195 1 : DataType TimeVaryingSecondOrderSVFBellCoefficients<DataType>::get_gain() const 196 : { 197 1 : return gain; 198 : } 199 : 200 : template<typename DataType> 201 524288 : void TimeVaryingSecondOrderSVFBellCoefficients<DataType>::update_coeffs(DataType g) const 202 : { 203 524288 : auto k = 1 / (Q * gain); 204 524288 : a1 = 1 / (1 + g * (g + k)); 205 524288 : a2 = g * a1; 206 524288 : a3 = g * a2; 207 524288 : m0 = 1; 208 524288 : m1 = k * (gain * gain - 1); 209 524288 : m2 = 0; 210 524288 : } 211 : 212 : template<typename DataType_> 213 4 : TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType_>::TimeVaryingSecondOrderSVFLowShelfCoefficients(gsl::index nb_channels) 214 4 : :Parent(nb_channels) 215 : { 216 : 217 4 : } 218 : 219 : template<typename DataType_> 220 4 : void TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType_>::set_gain(DataType_ gain) 221 : { 222 4 : this->gain = gain; 223 4 : setup(); 224 4 : } 225 : 226 : template<typename DataType> 227 1 : DataType TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType>::get_gain() const 228 : { 229 1 : return gain; 230 : } 231 : 232 : template<typename DataType> 233 393216 : void TimeVaryingSecondOrderSVFLowShelfCoefficients<DataType>::update_coeffs(DataType g) const 234 : { 235 393216 : auto k = 1 / Q; 236 393216 : a1 = 1 / (1 + g * (g + k)); 237 393216 : a2 = g * a1; 238 393216 : a3 = g * a2; 239 393216 : m0 = 1; 240 393216 : m1 = k * (gain - 1); 241 393216 : m2 = gain * gain - 1; 242 393216 : } 243 : 244 : template<typename DataType_> 245 4 : TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType_>::TimeVaryingSecondOrderSVFHighShelfCoefficients(gsl::index nb_channels) 246 4 : :Parent(nb_channels) 247 : { 248 4 : } 249 : 250 : template<typename DataType_> 251 4 : void TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType_>::set_gain(DataType_ gain) 252 : { 253 4 : this->gain = gain; 254 4 : setup(); 255 4 : } 256 : 257 : template<typename DataType> 258 1 : DataType TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType>::get_gain() const 259 : { 260 1 : return gain; 261 : } 262 : 263 : template<typename DataType> 264 393216 : void TimeVaryingSecondOrderSVFHighShelfCoefficients<DataType>::update_coeffs(DataType g) const 265 : { 266 393216 : auto k = 1 / (Q* gain); 267 393216 : a1 = 1 / (1 + g * (g + k)); 268 393216 : a2 = g * a1; 269 393216 : a3 = g * a2; 270 393216 : m0 = gain * gain; 271 393216 : m1 = k * (1 - gain) * gain; 272 393216 : m2 = 1 - gain * gain; 273 393216 : } 274 : 275 : #if ATK_ENABLE_INSTANTIATION 276 : template class TimeVaryingSecondOrderSVFBaseCoefficients<float>; 277 : 278 : template class TimeVaryingSecondOrderSVFLowPassCoefficients<float>; 279 : template class TimeVaryingSecondOrderSVFBandPassCoefficients<float>; 280 : template class TimeVaryingSecondOrderSVFHighPassCoefficients<float>; 281 : template class TimeVaryingSecondOrderSVFNotchCoefficients<float>; 282 : template class TimeVaryingSecondOrderSVFPeakCoefficients<float>; 283 : template class TimeVaryingSecondOrderSVFBellCoefficients<float>; 284 : template class TimeVaryingSecondOrderSVFLowShelfCoefficients<float>; 285 : template class TimeVaryingSecondOrderSVFHighShelfCoefficients<float>; 286 : 287 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowPassCoefficients<float> >; 288 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBandPassCoefficients<float> >; 289 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighPassCoefficients<float> >; 290 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFNotchCoefficients<float> >; 291 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFPeakCoefficients<float> >; 292 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBellCoefficients<float> >; 293 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowShelfCoefficients<float> >; 294 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighShelfCoefficients<float> >; 295 : #endif 296 : template class TimeVaryingSecondOrderSVFBaseCoefficients<double>; 297 : 298 : template class TimeVaryingSecondOrderSVFLowPassCoefficients<double>; 299 : template class TimeVaryingSecondOrderSVFBandPassCoefficients<double>; 300 : template class TimeVaryingSecondOrderSVFHighPassCoefficients<double>; 301 : template class TimeVaryingSecondOrderSVFNotchCoefficients<double>; 302 : template class TimeVaryingSecondOrderSVFPeakCoefficients<double>; 303 : template class TimeVaryingSecondOrderSVFBellCoefficients<double>; 304 : template class TimeVaryingSecondOrderSVFLowShelfCoefficients<double>; 305 : template class TimeVaryingSecondOrderSVFHighShelfCoefficients<double>; 306 : 307 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowPassCoefficients<double> >; 308 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBandPassCoefficients<double> >; 309 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighPassCoefficients<double> >; 310 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFNotchCoefficients<double> >; 311 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFPeakCoefficients<double> >; 312 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFBellCoefficients<double> >; 313 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFLowShelfCoefficients<double> >; 314 : template class TimeVaryingSecondOrderSVFFilter<TimeVaryingSecondOrderSVFHighShelfCoefficients<double> >; 315 : }