| 1133 | } |
| 1134 | |
| 1135 | void SampleUtils::fillSincTable(float * table, int order, int subdivisions, double kaiserBesserBeta) |
| 1136 | { |
| 1137 | double v, posI, posIshifted; |
| 1138 | double multiplier = 1.0 / besselI0(kaiserBesserBeta); |
| 1139 | double twoInvOrder = 2.0 / (double)order; |
| 1140 | double dTmp; |
| 1141 | double invSubDivisions = 1.0 / (double)subdivisions; |
| 1142 | |
| 1143 | // i2: Offset in terms of fractional samples ('subsamples') |
| 1144 | for (int i2 = 0; i2 < subdivisions; ++i2) |
| 1145 | { |
| 1146 | // i: Offset in terms of whole samples |
| 1147 | for (int i = 0; i < order; ++i) |
| 1148 | { |
| 1149 | posI = (double)i + (double)(subdivisions - i2 - 1) * invSubDivisions; |
| 1150 | posIshifted = posI - (double)order / 2.0; |
| 1151 | |
| 1152 | // sinc(0) cannot be calculated straightforward (limit needed for 0/0) |
| 1153 | if (fabs(posIshifted) > 0.000001) |
| 1154 | { |
| 1155 | v = sin(posIshifted * M_PI) / (posIshifted * M_PI); |
| 1156 | |
| 1157 | // Kaiser-bessel window |
| 1158 | dTmp = twoInvOrder * posI - 1.; |
| 1159 | v *= besselI0(kaiserBesserBeta * sqrt(1. - dTmp * dTmp)) * multiplier; |
| 1160 | } |
| 1161 | else |
| 1162 | v = 1.0; |
| 1163 | |
| 1164 | table[i2 * order + i] = (float)v; |
| 1165 | } |
| 1166 | } |
| 1167 | } |
| 1168 | |
| 1169 | double SampleUtils::besselI0(double x) |
| 1170 | { |
nothing calls this directly
no outgoing calls
no test coverage detected