23#include "resid-config.h"
499 enum { value = summer_offset<i - 1>::value + ((2 + i - 1) << 16) };
503struct summer_offset<0>
512 enum { value = mixer_offset<i - 1>::value + ((i - 1) << 16) };
516struct mixer_offset<1>
522struct mixer_offset<0>
533 void enable_filter(
bool enable);
534 void adjust_filter_bias(
double dac_bias);
535 void set_chip_model(chip_model model);
536 void set_voice_mask(reg4 mask);
538 void clock(
int voice1,
int voice2,
int voice3);
539 void clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3);
543 void writeFC_LO(reg8);
544 void writeFC_HI(reg8);
545 void writeRES_FILT(reg8);
546 void writeMODE_VOL(reg8);
549 void input(
short sample);
597 chip_model sid_model;
616 unsigned short opamp_rev[1 << 16];
618 unsigned short summer[summer_offset<5>::value];
619 unsigned short gain[16][1 << 16];
620 unsigned short resonance[16][1 << 16];
621 unsigned short mixer[mixer_offset<8>::value];
623 unsigned short f0_dac[1 << 11];
628 int Vddt_Vw_2, Vw_bias;
641 int solve_gain_d(opamp_t* opamp,
double n,
int vi_t,
int& x, model_filter_t& mf);
642 int solve_integrate_6581(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
643 int solve_integrate_8580(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
646 static unsigned short vcr_kVg[1 << 16];
647 static unsigned short vcr_n_Ids_term[1 << 16];
649 static model_filter_t model_filter[2];
658 mutable int index = 0;
662 for (
int i=0; i<1024; i++)
663 buffer[i] = rand() % (1<<19);
665 int getNoise()
const { index = (index + 1) & 0x3ff;
return buffer[index]; }
678#if RESID_INLINING || defined(RESID_FILTER_CC)
684void Filter::clock(
int voice1,
int voice2,
int voice3)
686 model_filter_t& f = model_filter[sid_model];
688 v1 = ((voice1*f.voice_scale_s14 + rnd.getNoise()) >> 18) + f.voice_DC;
689 v2 = ((voice2*f.voice_scale_s14 + rnd.getNoise()) >> 18) + f.voice_DC;
690 v3 = ((voice3*f.voice_scale_s14 + rnd.getNoise()) >> 18) + f.voice_DC;
699 offset = summer_offset<0>::value;
703 offset = summer_offset<1>::value;
707 offset = summer_offset<1>::value;
711 offset = summer_offset<2>::value;
715 offset = summer_offset<1>::value;
719 offset = summer_offset<2>::value;
723 offset = summer_offset<2>::value;
727 offset = summer_offset<3>::value;
731 offset = summer_offset<1>::value;
735 offset = summer_offset<2>::value;
739 offset = summer_offset<2>::value;
743 offset = summer_offset<3>::value;
747 offset = summer_offset<2>::value;
751 offset = summer_offset<3>::value;
755 offset = summer_offset<3>::value;
758 Vi = ve + v3 + v2 + v1;
759 offset = summer_offset<4>::value;
764 if (sid_model == 0) {
766 Vlp = solve_integrate_6581(1, Vbp, Vlp_x, Vlp_vc, f);
767 Vbp = solve_integrate_6581(1, Vhp, Vbp_x, Vbp_vc, f);
771 Vlp = solve_integrate_8580(1, Vbp, Vlp_x, Vlp_vc, f);
772 Vbp = solve_integrate_8580(1, Vhp, Vbp_x, Vbp_vc, f);
775 assert((Vbp >= 0) && (Vbp < (1 << 16)));
776 const int idx = offset + f.resonance[res][Vbp] + Vlp + Vi;
777 assert((idx >= 0) && (idx < summer_offset<5>::value));
785void Filter::clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3)
787 model_filter_t& f = model_filter[sid_model];
789 v1 = ((voice1*f.voice_scale_s14 + rnd.getNoise()) >> 18) + f.voice_DC;
790 v2 = ((voice2*f.voice_scale_s14 + rnd.getNoise()) >> 18) + f.voice_DC;
791 v3 = ((voice3*f.voice_scale_s14 + rnd.getNoise()) >> 18) + f.voice_DC;
797 if (unlikely(!enabled)) {
808 offset = summer_offset<0>::value;
812 offset = summer_offset<1>::value;
816 offset = summer_offset<1>::value;
820 offset = summer_offset<2>::value;
824 offset = summer_offset<1>::value;
828 offset = summer_offset<2>::value;
832 offset = summer_offset<2>::value;
836 offset = summer_offset<3>::value;
840 offset = summer_offset<1>::value;
844 offset = summer_offset<2>::value;
848 offset = summer_offset<2>::value;
852 offset = summer_offset<3>::value;
856 offset = summer_offset<2>::value;
860 offset = summer_offset<3>::value;
864 offset = summer_offset<3>::value;
867 Vi = ve + v3 + v2 + v1;
868 offset = summer_offset<4>::value;
874 cycle_count delta_t_flt = 3;
876 if (sid_model == 0) {
879 if (unlikely(delta_t < delta_t_flt)) {
880 delta_t_flt = delta_t;
884 Vlp = solve_integrate_6581(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
885 Vbp = solve_integrate_6581(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
886 assert((Vbp >= 0) && (Vbp < (1 << 16)));
887 const int idx = offset + f.resonance[res][Vbp] + Vlp + Vi;
888 assert((idx >= 0) && (idx < summer_offset<5>::value));
891 delta_t -= delta_t_flt;
897 if (unlikely(delta_t < delta_t_flt)) {
898 delta_t_flt = delta_t;
902 Vlp = solve_integrate_8580(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
903 Vbp = solve_integrate_8580(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
904 assert((Vbp >= 0) && (Vbp < (1 << 16)));
905 const int idx = offset + f.resonance[res][Vbp] + Vlp + Vi;
906 assert((idx >= 0) && (idx < summer_offset<5>::value));
909 delta_t -= delta_t_flt;
919void Filter::input(
short sample)
930 model_filter_t& f = model_filter[sid_model];
931 ve = (sample*f.voice_scale_s14*3 >> 14) + f.mixer[0];
939short Filter::output()
941 model_filter_t& f = model_filter[sid_model];
977 const int dc_offset = 32767 * ((1 << 12) - f.filterGain);
979 switch (mix & 0x7f) {
982 offset = mixer_offset<0>::value;
986 offset = mixer_offset<1>::value;
990 offset = mixer_offset<1>::value;
994 offset = mixer_offset<2>::value;
998 offset = mixer_offset<1>::value;
1002 offset = mixer_offset<2>::value;
1006 offset = mixer_offset<2>::value;
1010 offset = mixer_offset<3>::value;
1014 offset = mixer_offset<1>::value;
1018 offset = mixer_offset<2>::value;
1022 offset = mixer_offset<2>::value;
1026 offset = mixer_offset<3>::value;
1030 offset = mixer_offset<2>::value;
1034 offset = mixer_offset<3>::value;
1038 offset = mixer_offset<3>::value;
1041 Vi = ve + v3 + v2 + v1;
1042 offset = mixer_offset<4>::value;
1045 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12);
1046 offset = mixer_offset<1>::value;
1049 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v1;
1050 offset = mixer_offset<2>::value;
1053 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v2;
1054 offset = mixer_offset<2>::value;
1057 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1058 offset = mixer_offset<3>::value;
1061 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v3;
1062 offset = mixer_offset<2>::value;
1065 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1066 offset = mixer_offset<3>::value;
1069 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1070 offset = mixer_offset<3>::value;
1073 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1074 offset = mixer_offset<4>::value;
1077 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve;
1078 offset = mixer_offset<2>::value;
1081 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1082 offset = mixer_offset<3>::value;
1085 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1086 offset = mixer_offset<3>::value;
1089 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1090 offset = mixer_offset<4>::value;
1093 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1094 offset = mixer_offset<3>::value;
1097 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1098 offset = mixer_offset<4>::value;
1101 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1102 offset = mixer_offset<4>::value;
1105 Vi = ((((Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1106 offset = mixer_offset<5>::value;
1109 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12);
1110 offset = mixer_offset<1>::value;
1113 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v1;
1114 offset = mixer_offset<2>::value;
1117 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v2;
1118 offset = mixer_offset<2>::value;
1121 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1122 offset = mixer_offset<3>::value;
1125 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v3;
1126 offset = mixer_offset<2>::value;
1129 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1130 offset = mixer_offset<3>::value;
1133 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1134 offset = mixer_offset<3>::value;
1137 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1138 offset = mixer_offset<4>::value;
1141 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve;
1142 offset = mixer_offset<2>::value;
1145 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1146 offset = mixer_offset<3>::value;
1149 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1150 offset = mixer_offset<3>::value;
1153 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1154 offset = mixer_offset<4>::value;
1157 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1158 offset = mixer_offset<3>::value;
1161 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1162 offset = mixer_offset<4>::value;
1165 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1166 offset = mixer_offset<4>::value;
1169 Vi = ((((Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1170 offset = mixer_offset<5>::value;
1173 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12);
1174 offset = mixer_offset<2>::value;
1177 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v1;
1178 offset = mixer_offset<3>::value;
1181 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v2;
1182 offset = mixer_offset<3>::value;
1185 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1186 offset = mixer_offset<4>::value;
1189 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3;
1190 offset = mixer_offset<3>::value;
1193 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1194 offset = mixer_offset<4>::value;
1197 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1198 offset = mixer_offset<4>::value;
1201 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1202 offset = mixer_offset<5>::value;
1205 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve;
1206 offset = mixer_offset<3>::value;
1209 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1210 offset = mixer_offset<4>::value;
1213 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1214 offset = mixer_offset<4>::value;
1217 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1218 offset = mixer_offset<5>::value;
1221 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1222 offset = mixer_offset<4>::value;
1225 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1226 offset = mixer_offset<5>::value;
1229 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1230 offset = mixer_offset<5>::value;
1233 Vi = ((((Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1234 offset = mixer_offset<6>::value;
1237 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12);
1238 offset = mixer_offset<1>::value;
1241 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v1;
1242 offset = mixer_offset<2>::value;
1245 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v2;
1246 offset = mixer_offset<2>::value;
1249 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1250 offset = mixer_offset<3>::value;
1253 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v3;
1254 offset = mixer_offset<2>::value;
1257 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1258 offset = mixer_offset<3>::value;
1261 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1262 offset = mixer_offset<3>::value;
1265 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1266 offset = mixer_offset<4>::value;
1269 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve;
1270 offset = mixer_offset<2>::value;
1273 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1274 offset = mixer_offset<3>::value;
1277 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1278 offset = mixer_offset<3>::value;
1281 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1282 offset = mixer_offset<4>::value;
1285 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1286 offset = mixer_offset<3>::value;
1289 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1290 offset = mixer_offset<4>::value;
1293 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1294 offset = mixer_offset<4>::value;
1297 Vi = ((((Vhp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1298 offset = mixer_offset<5>::value;
1301 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12);
1302 offset = mixer_offset<2>::value;
1305 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v1;
1306 offset = mixer_offset<3>::value;
1309 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v2;
1310 offset = mixer_offset<3>::value;
1313 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1314 offset = mixer_offset<4>::value;
1317 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3;
1318 offset = mixer_offset<3>::value;
1321 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1322 offset = mixer_offset<4>::value;
1325 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1326 offset = mixer_offset<4>::value;
1329 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1330 offset = mixer_offset<5>::value;
1333 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve;
1334 offset = mixer_offset<3>::value;
1337 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1338 offset = mixer_offset<4>::value;
1341 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1342 offset = mixer_offset<4>::value;
1345 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1346 offset = mixer_offset<5>::value;
1349 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1350 offset = mixer_offset<4>::value;
1353 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1354 offset = mixer_offset<5>::value;
1357 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1358 offset = mixer_offset<5>::value;
1361 Vi = ((((Vhp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1362 offset = mixer_offset<6>::value;
1365 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12);
1366 offset = mixer_offset<2>::value;
1369 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v1;
1370 offset = mixer_offset<3>::value;
1373 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v2;
1374 offset = mixer_offset<3>::value;
1377 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1378 offset = mixer_offset<4>::value;
1381 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v3;
1382 offset = mixer_offset<3>::value;
1385 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1386 offset = mixer_offset<4>::value;
1389 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1390 offset = mixer_offset<4>::value;
1393 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1394 offset = mixer_offset<5>::value;
1397 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve;
1398 offset = mixer_offset<3>::value;
1401 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1402 offset = mixer_offset<4>::value;
1405 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1406 offset = mixer_offset<4>::value;
1409 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1410 offset = mixer_offset<5>::value;
1413 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1414 offset = mixer_offset<4>::value;
1417 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1418 offset = mixer_offset<5>::value;
1421 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1422 offset = mixer_offset<5>::value;
1425 Vi = ((((Vhp + Vbp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1426 offset = mixer_offset<6>::value;
1429 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12);
1430 offset = mixer_offset<3>::value;
1433 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v1;
1434 offset = mixer_offset<4>::value;
1437 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v2;
1438 offset = mixer_offset<4>::value;
1441 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v2 + v1;
1442 offset = mixer_offset<5>::value;
1445 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3;
1446 offset = mixer_offset<4>::value;
1449 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v1;
1450 offset = mixer_offset<5>::value;
1453 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2;
1454 offset = mixer_offset<5>::value;
1457 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + v3 + v2 + v1;
1458 offset = mixer_offset<6>::value;
1461 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve;
1462 offset = mixer_offset<4>::value;
1465 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v1;
1466 offset = mixer_offset<5>::value;
1469 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2;
1470 offset = mixer_offset<5>::value;
1473 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v2 + v1;
1474 offset = mixer_offset<6>::value;
1477 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3;
1478 offset = mixer_offset<5>::value;
1481 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v1;
1482 offset = mixer_offset<6>::value;
1485 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2;
1486 offset = mixer_offset<6>::value;
1489 Vi = ((((Vhp + Vbp + Vlp) * f.filterGain) + dc_offset) >> 12) + ve + v3 + v2 + v1;
1490 offset = mixer_offset<7>::value;
1495 const int idx1 = offset + Vi;
1496 assert((idx1 >= 0) && (idx1 < mixer_offset<8>::value));
1497 const int idx2 = f.mixer[idx1];
1498 assert((idx2 >= 0) && (idx2 < (1 << 16)));
1499 return (
short)(f.gain[vol][idx2] - (1 << 15));
1557int Filter::solve_gain(opamp_t* opamp,
int n,
int vi,
int& x, model_filter_t& mf)
1566 int ak = mf.ak, bk = mf.bk;
1568 int a = n + (1 << 7);
1571 if (b_vi < 0) b_vi = 0;
1572 int c = n*int(
unsigned(b_vi)*
unsigned(b_vi) >> 12);
1578 int vx = opamp[x].vx;
1579 int dvx = opamp[x].dvx;
1584 int vo = vx + (x << 1) - (1 << 16);
1585 if (vo >= (1 << 16)) {
1592 if (b_vx < 0) b_vx = 0;
1594 if (b_vo < 0) b_vo = 0;
1596 int f = a*int(
unsigned(b_vx)*
unsigned(b_vx) >> 12) - c - int(
unsigned(b_vo)*
unsigned(b_vo) >> 5);
1598 int df = ((b_vo*(dvx + (1 << 11)) >> 1) - (a*(b_vx*dvx >> 8))) >> 14;
1606 if (unlikely(x == xk)) {
1621 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1624 if (unlikely(x == ak)) {
1633int Filter::solve_gain_d(opamp_t* opamp,
double n,
int vi,
int& x, model_filter_t& mf)
1642 int ak = mf.ak, bk = mf.bk;
1646 double b_vi = b > vi ? double(b - vi) : 0.;
1647 double c = n*(b_vi*b_vi);
1653 int vx = opamp[x].vx;
1654 int dvx = opamp[x].dvx;
1659 int vo = vx + (x << 1) - (1 << 16);
1660 if (vo > (1 << 16) - 1) {
1666 double b_vx = b > vx ? double(b - vx) : 0.;
1667 double b_vo = b > vo ? double(b - vo) : 0.;
1669 double f = a*(b_vx*b_vx) - c - (b_vo*b_vo);
1671 double df = 2.*(b_vo - a*b_vx)*
double(dvx);
1678 x -= int(
double(1<<11)*f/df);
1680 if (unlikely(x == xk)) {
1695 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1698 if (unlikely(x == ak)) {
1827int Filter::solve_integrate_6581(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1834 int kVddt = mf.kVddt;
1837 unsigned int Vgst = kVddt - vx;
1838 unsigned int Vgdt = kVddt - vi;
1839 unsigned int Vgdt_2 = Vgdt*Vgdt;
1842 int n_I_snake = n_snake*(int(Vgst*Vgst - Vgdt_2) >> 15);
1846 int kVg = vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16];
1849 int Vgs = kVg - vx + (1 << 15);
1850 int Vgd = kVg - vi + (1 << 15);
1853 int n_I_vcr = int(
unsigned(vcr_n_Ids_term[Vgs] - vcr_n_Ids_term[Vgd]) << 15);
1856 vc -= (n_I_snake + n_I_vcr)*dt;
1869 const int idx = (vc >> 15) + (1 << 15);
1870 assert((idx >= 0) && (idx < (1 << 16)));
1871 vx = mf.opamp_rev[idx];
1874 return vx + (vc >> 14);
1897int Filter::solve_integrate_8580(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1905 unsigned int Vgst = nVgt - vx;
1906 unsigned int Vgdt = (vi < nVgt) ? nVgt - vi : 0;
1909 int n_I_rfc = (n_dac*(int(Vgst*Vgst - Vgdt*Vgdt) >> 15)) >> 4;
1915 const int idx = (vc >> 15) + (1 << 15);
1916 assert((idx >= 0) && (idx < (1 << 16)));
1917 vx = mf.opamp_rev[idx];
1920 return vx + (vc >> 14);