bahurin, БОЛЬШОЕ Вам человеческое спасибо за вразумление

Вопрос решен в таком виде:
Код
//это прямое преобразование
RFFT_F32_STRUCT *t=(RFFT_F32_STRUCT*)table;
scale = 1./t->FFTSize;
t->InBuf=in;
t->OutBuf=out;
RFFT_f32u(t); //делаем БПФ
for(i=0;i<t->FFTSize;i++)
t->OutBuf[i] *= scale;
Код
//ОБРАТНОЕ
//готовимся к обратному преобразованию
//Re[i] содержит вещественную часть Im[i] - мнимую
//отразим мнимую часть и дополним где надо нулями
Re[0] = in[0];
Im[0] = 0;
for (i=1; i<(t->FFTSize/2+1);i++){
Re[i] = in[i];
Im[i] = in[t->FFTSize-i];
}
Im[t->FFTSize/2] = 0;
//теперь восстанавливаем вторую половину спектра
// ************* mirror ***************
for (i=0; i<(t->FFTSize/2);i++)
{
Re[t->FFTSize-1-i] = Re[i+1]; //Re просто зеркально
Im[t->FFTSize-1-i] = - Im[i+1]; //Im зеркально с минусом
}
//Сложить
for (i=0; i<(t->FFTSize);i++){
t->InBuf[i]=Re[i]+Im[i];
}
RFFT_f32u(t); //делаем БПФ, теперь в OutBuf имеем time domain
Re[0] = t->OutBuf[0];
Im[0] = 0;
for (i=1; i<(t->FFTSize/2+1);i++){
Re[i] = t->OutBuf[i];
Im[i] = t->OutBuf[t->FFTSize-i];
}
Im[t->FFTSize/2] = 0;
// ************* mirror ***************
for (i=0; i<(t->FFTSize/2);i++)
{
Re[t->FFTSize-1-i] = Re[i+1]; //Re просто зеркально
Im[t->FFTSize-1-i] = - Im[i+1]; //Im зеркально с минусом
}
//Сложить
for (i=0; i<(t->FFTSize);i++){
out[i]=Re[i]+Im[i];
}
//на FFTSize делить не нужно, т.к. это делает функция прямого преобразования
Единственное, что не даёт покоя - это кусок кода парней с Техасовского форума
Код
---combine and split imag/real---
for(i=0; i< FFTsize/2;i++)
{
tempR = Re[i] - Im[i];
tempI = Re[i]] + Im[i];
Re[i] = tempR; //can also be done in one step
Im[i] = tempI;
}
Зачем, если работает и без этого!?!?!
Вот полный пример
Код
You can use the Real FFT to do IFFT, but you have to the following steps
--Split--
Re[0] = fft.OutBuf[0];
Im[0] = 0;
for (i=1; i<(FFTsize/2+1);i++)
{
Re[i] = fft.OutBuf[i]; // split real
Im[i] = fft.OutBuf[FFTsize-i]; // split imag
}
Im[FFTsize/2] = 0;
---combine and split imag/real--- //ЧТО ЭТО И ЗАЧЕМ
for(i=0; i< FFTsize/2;i++)
{
tempR = Re[i] - Im[i];
tempI = Re[i]] + Im[i];
Re[i] = tempR; //can also be done in one step
Im[i] = tempI;
}
--mirror---
// ************* mirror ***************
for (i=0; i<(FFTsize/2);i++)
{
Re[FFTsize-1-i] = Re[i+1];
Im[FFTsize-1-i] = - Im[i+1];
}
// ************ add ******************* //А ТУТ "-" ВМЕСТО "+"
for (i=0; i<FFTsize;i++)
{
fft.InBuf[i] = Re[i] - Im[i];
}
And now you can do the FFT again to get the IFFT
After this, you will need to the Split, Mirror routine again
The last step is to divide the all the result by [fftSize]
А вообще всё хорошо. Завтра на асме все эти отражения реализую и будет супер
The truth is out there...