Interpolates two kernels with x: 0 -> 1 and returns the result.
| 517 | |
| 518 | // Interpolates two kernels with x: 0 -> 1 and returns the result. |
| 519 | std::unique_ptr<HRTFKernel> MakeInterpolatedKernel(HRTFKernel * kernel1, HRTFKernel * kernel2, float x) |
| 520 | { |
| 521 | ASSERT(kernel1 && kernel2); |
| 522 | if (!kernel1 || !kernel2) |
| 523 | return 0; |
| 524 | |
| 525 | ASSERT(x >= 0.0 && x < 1.0); |
| 526 | x = std::min(1.0f, std::max(0.0f, x)); |
| 527 | |
| 528 | float sampleRate1 = kernel1->sampleRate(); |
| 529 | float sampleRate2 = kernel2->sampleRate(); |
| 530 | |
| 531 | ASSERT(sampleRate1 == sampleRate2); |
| 532 | if (sampleRate1 != sampleRate2) |
| 533 | return 0; |
| 534 | |
| 535 | float frameDelay = (1 - x) * kernel1->frameDelay() + x * kernel2->frameDelay(); |
| 536 | //kernel1->fftFrame()->print(); |
| 537 | |
| 538 | std::unique_ptr<FFTFrame> interpolatedFrame = FFTFrame::createInterpolatedFrame(*kernel1->fftFrame(), *kernel2->fftFrame(), x); |
| 539 | return std::unique_ptr<HRTFKernel>(new HRTFKernel(std::move(interpolatedFrame), frameDelay, sampleRate1)); |
| 540 | } |
| 541 | |
| 542 | |
| 543 | // @fixme - will change for new HRTF databases |
no test coverage detected