in XDSP/XDSP.h [711:776]
inline void FFTInterleaved(
_Inout_updates_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pReal,
_Out_writes_(((1 << uLog2Length) * uChannelCount) / 4) XMVECTOR* __restrict pImaginary,
_In_reads_(1 << uLog2Length) const XMVECTOR* __restrict pUnityTable,
_In_ const size_t uChannelCount,
_In_ const size_t uLog2Length) noexcept
{
assert(pReal);
assert(pImaginary);
assert(pUnityTable);
assert(reinterpret_cast<uintptr_t>(pReal) % 16 == 0);
assert(reinterpret_cast<uintptr_t>(pImaginary) % 16 == 0);
assert(reinterpret_cast<uintptr_t>(pUnityTable) % 16 == 0);
assert(uChannelCount > 0 && uChannelCount <= 6);
assert(uLog2Length >= 2 && uLog2Length <= 9);
XMVECTOR vRealTemp[768];
XMVECTOR vImaginaryTemp[768];
const size_t uLength = size_t(1) << uLog2Length;
if (uChannelCount > 1)
{
Deinterleave(vRealTemp, pReal, uChannelCount, uLength);
}
else
{
memcpy_s(vRealTemp, sizeof(vRealTemp), pReal, (uLength >> 2) * sizeof(XMVECTOR));
}
memset(vImaginaryTemp, 0, (uChannelCount * (uLength >> 2)) * sizeof(XMVECTOR));
if (uLength > 16)
{
for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel)
{
FFT(&vRealTemp[uChannel * (uLength >> 2)], &vImaginaryTemp[uChannel * (uLength >> 2)], pUnityTable, uLength);
}
}
else if (uLength == 16)
{
for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel)
{
FFT16(&vRealTemp[uChannel * (uLength >> 2)], &vImaginaryTemp[uChannel * (uLength >> 2)]);
}
}
else if (uLength == 8)
{
for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel)
{
FFT8(&vRealTemp[uChannel * (uLength >> 2)], &vImaginaryTemp[uChannel * (uLength >> 2)]);
}
}
else if (uLength == 4)
{
for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel)
{
FFT4(&vRealTemp[uChannel * (uLength >> 2)], &vImaginaryTemp[uChannel * (uLength >> 2)]);
}
}
for (size_t uChannel = 0; uChannel < uChannelCount; ++uChannel)
{
FFTUnswizzle(&pReal[uChannel * (uLength >> 2)], &vRealTemp[uChannel * (uLength >> 2)], uLog2Length);
FFTUnswizzle(&pImaginary[uChannel * (uLength >> 2)], &vImaginaryTemp[uChannel * (uLength >> 2)], uLog2Length);
}
}