Цитата(sigmaN @ Sep 21 2009, 04:53)

Вопрос решен в таком виде:
Сложно. Можно сделать проще. Я не стал связываться с
кодом для С283хх, а использовал свою подпрограмму для
С67хх, но всё так просто, что копируется в структуру 1
в 1. Этот способ - чистой воды overkill и упражнение в
алгебре. Для проверки правильности я использовал
rffti(), обратное преобразование, которое работает
напрямую с выходом прямого.
Код
// ---------------------------------------------------------------------------
//
// InvRFFT() - simulates inverse real FFT
//
// all input/output arrays are of length 2**log2n real entries
//
// on input
//
// log2n - base 2 log of Real FFT length
// w - twiddle factors table
// x - input array for Inverse Real FFT (stored in the order
// of Forward Real FFT output array)
// f - scratch array
//
// on input
//
// s - output array of inverse coeffs stored in natural order
//
// notes
//
// this is a math exercise, not suitable for real work
//
// ---------------------------------------------------------------------------
#define real float
void InvRFFT (int log2n, const real *w, real *x, real *f, real *s)
{
int i, n, n2;
real invn;
n = 1 << log2n; // RFFT length
n2 = n >> 1; // half length
invn = 1.0E0F / (real)(n); // 1/N scale factor
// add real and imag parts
f[0] = x[0];
for (i = 1; i < n2; i++)
{
f[i] = x[i] + x[n-i]; // add real and mirror imag
f[n-i] = x[i] - x[n-i]; // add mirror real and conj imag
}
f[n2] = x[n2];
rfftf (log2n, (real *)w, (real *)f); // FORWARD RFFT
// add real and imag parts and scale down to form inverse real fft
// get rid of scaling if done inside forward real fft
s[0] = f[0] * invn; // save a few clocks on division
for (i = 1; i < n2; i++)
{
s[i] = (f[i] + f[n-i]) * invn;
s[n-i] = (f[i] - f[n-i]) * invn;
}
s[n2] = f[n2] * invn;
return; // all done, exit
}
Сообщение отредактировал AndrewN - Sep 21 2009, 15:47