separated AAX from normal build so that pffft could be used instead for licensing purposes. prevent file position jump when changing prebuffering. eliminate unecessary fft size calculations

This commit is contained in:
essej
2022-04-26 17:58:45 -04:00
parent cc80d951ea
commit 774031a7a9
13 changed files with 2253 additions and 36 deletions

View File

@ -58,6 +58,13 @@ FFT::FFT(int nsamples_, bool no_inverse)
m_workReal.resize(nsamples,false);
m_workImag.resize(nsamples,false);
//Logger::writeToLog("fftsize: " + String(nsamples) + " log2N: " + String(log2N));
#elif PS_USE_PFFFT
planpffft = pffft_new_setup(nsamples, PFFFT_REAL);
m_work.resize(2*nsamples,false);
//Logger::writeToLog("fftsize: " + String(nsamples) + " log2N: " + String(log2N));
#else
@ -88,6 +95,10 @@ FFT::~FFT()
{
#if PS_USE_VDSP_FFT
vDSP_destroy_fftsetup((FFTSetup)planfft);
#elif PS_USE_PFFFT
if (planpffft) {
pffft_destroy_setup(planpffft);
}
#else
fftwf_destroy_plan(planfftw);
if (planifftw!=nullptr)
@ -139,6 +150,24 @@ void FFT::smp2freq()
freq[0] = 0.0;
#elif PS_USE_PFFFT
const int halfsamples = nsamples / 2;
auto * databuf = data.data();
pffft_transform_ordered(planpffft, smp.data(), databuf, m_work.data(), PFFFT_FORWARD);
data[1] = 0.0f;
// compute magnitude
FloatVectorOperations::multiply(databuf, databuf, nsamples);
for (int k=1, l=2; k < halfsamples; ++k, l+=2) {
freq[k] = sqrt(databuf[l] + databuf[l+1]);
}
freq[0] = 0.0;
#else
for (int i=0;i<nsamples;i++)
@ -192,7 +221,29 @@ void FFT::freq2smp()
vDSP_vsmul(data.data(), 1, &scale, smp.data(), 1, nsamples);
#elif PS_USE_PFFFT
const int halfsamples = nsamples / 2;
auto * databuf = data.data();
for (int i=1; i < halfsamples; ++i)
{
unsigned int rand = m_randdist(m_randgen);
REALTYPE phase=rand*inv_2p15_2pi;
data[i*2] = freq[i]*cos(phase);
data[i*2+1] = freq[i]*sin(phase);
};
data[0] = data[1] = 0.0;
pffft_transform_ordered(planpffft, databuf, smp.data(), m_work.data(), PFFFT_BACKWARD);
// post scale
float scale = 1.f / nsamples;
FloatVectorOperations::multiply(smp.data(), scale, nsamples);
#else
for (int i=1;i<nsamples/2;i++)
{
unsigned int rand = m_randdist(m_randgen);
@ -204,8 +255,11 @@ void FFT::freq2smp()
data[0]=data[nsamples/2+1]=data[nsamples/2]=0.0;
fftwf_execute(planifftw);
for (int i=0;i<nsamples;i++)
smp[i]=data[i]/nsamples;
// post scale
float scale = 1.f / nsamples;
FloatVectorOperations::multiply(smp.data(), data.data(), scale, nsamples);
#endif
};