real fft no longer needs an internal buffer.
This commit is contained in:
parent
4508ebd585
commit
42667b0a5f
3 changed files with 38 additions and 37 deletions
|
@ -478,8 +478,8 @@ static void ki_bfly_generic(
|
||||||
|
|
||||||
static
|
static
|
||||||
void compute_bitrev_table(
|
void compute_bitrev_table(
|
||||||
int * Fout,
|
int Fout,
|
||||||
int f,
|
int *f,
|
||||||
const size_t fstride,
|
const size_t fstride,
|
||||||
int in_stride,
|
int in_stride,
|
||||||
int * factors,
|
int * factors,
|
||||||
|
@ -495,7 +495,7 @@ void compute_bitrev_table(
|
||||||
int j;
|
int j;
|
||||||
for (j=0;j<p;j++)
|
for (j=0;j<p;j++)
|
||||||
{
|
{
|
||||||
Fout[j] = f;
|
*f = Fout+j;
|
||||||
f += fstride*in_stride;
|
f += fstride*in_stride;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -539,8 +539,8 @@ void kf_work(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
|
||||||
void ki_work(
|
void ki_work(
|
||||||
kiss_fft_cpx * Fout,
|
kiss_fft_cpx * Fout,
|
||||||
const kiss_fft_cpx * f,
|
const kiss_fft_cpx * f,
|
||||||
const size_t fstride,
|
const size_t fstride,
|
||||||
|
@ -636,7 +636,7 @@ kiss_fft_cfg kiss_fft_alloc(int nfft,void * mem,size_t * lenmem )
|
||||||
|
|
||||||
/* bitrev */
|
/* bitrev */
|
||||||
st->bitrev = (int*)((char*)st + memneeded - sizeof(int)*nfft);
|
st->bitrev = (int*)((char*)st + memneeded - sizeof(int)*nfft);
|
||||||
compute_bitrev_table(st->bitrev, 0, 1,1, st->factors,st);
|
compute_bitrev_table(0, st->bitrev, 1,1, st->factors,st);
|
||||||
}
|
}
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
@ -654,10 +654,10 @@ void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<st->nfft;i++)
|
for (i=0;i<st->nfft;i++)
|
||||||
{
|
{
|
||||||
fout[i] = fin[st->bitrev[i]];
|
fout[st->bitrev[i]] = fin[i];
|
||||||
#ifndef FIXED_POINT
|
#ifndef FIXED_POINT
|
||||||
fout[i].r *= st->scale;
|
fout[st->bitrev[i]].r *= st->scale;
|
||||||
fout[i].i *= st->scale;
|
fout[st->bitrev[i]].i *= st->scale;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
kf_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1);
|
kf_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1);
|
||||||
|
@ -678,7 +678,7 @@ void kiss_ifft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout
|
||||||
/* Bit-reverse the input */
|
/* Bit-reverse the input */
|
||||||
int i;
|
int i;
|
||||||
for (i=0;i<st->nfft;i++)
|
for (i=0;i<st->nfft;i++)
|
||||||
fout[i] = fin[st->bitrev[i]];
|
fout[st->bitrev[i]] = fin[i];
|
||||||
ki_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1);
|
ki_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,10 @@ typedef struct kiss_fft_state* kiss_fft_cfg;
|
||||||
|
|
||||||
kiss_fft_cfg kiss_fft_alloc(int nfft,void * mem,size_t * lenmem);
|
kiss_fft_cfg kiss_fft_alloc(int nfft,void * mem,size_t * lenmem);
|
||||||
|
|
||||||
|
/** Internal function. Can be useful when you want to do the bit-reversing yourself */
|
||||||
|
void ki_work(kiss_fft_cpx * Fout, const kiss_fft_cpx * f, const size_t fstride,
|
||||||
|
int in_stride,int * factors,const kiss_fft_cfg st,int N,int s2,int m2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kiss_fft(cfg,in_out_buf)
|
* kiss_fft(cfg,in_out_buf)
|
||||||
*
|
*
|
||||||
|
|
|
@ -26,7 +26,6 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
|
||||||
struct kiss_fftr_state{
|
struct kiss_fftr_state{
|
||||||
kiss_fft_cfg substate;
|
kiss_fft_cfg substate;
|
||||||
kiss_fft_cpx * tmpbuf;
|
|
||||||
kiss_twiddle_cpx * super_twiddles;
|
kiss_twiddle_cpx * super_twiddles;
|
||||||
#ifdef USE_SIMD
|
#ifdef USE_SIMD
|
||||||
long pad;
|
long pad;
|
||||||
|
@ -46,7 +45,7 @@ kiss_fftr_cfg kiss_fftr_alloc(int nfft,void * mem,size_t * lenmem)
|
||||||
nfft >>= 1;
|
nfft >>= 1;
|
||||||
|
|
||||||
kiss_fft_alloc (nfft, NULL, &subsize);
|
kiss_fft_alloc (nfft, NULL, &subsize);
|
||||||
memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft) + sizeof(kiss_twiddle_cpx)*nfft;
|
memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_twiddle_cpx)*nfft;
|
||||||
|
|
||||||
if (lenmem == NULL) {
|
if (lenmem == NULL) {
|
||||||
st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded);
|
st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded);
|
||||||
|
@ -59,8 +58,7 @@ kiss_fftr_cfg kiss_fftr_alloc(int nfft,void * mem,size_t * lenmem)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */
|
st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */
|
||||||
st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize);
|
st->super_twiddles = (kiss_twiddle_cpx*) (((char *) st->substate) + subsize);
|
||||||
st->super_twiddles = (kiss_twiddle_cpx*)(st->tmpbuf + nfft);
|
|
||||||
kiss_fft_alloc(nfft, st->substate, &subsize);
|
kiss_fft_alloc(nfft, st->substate, &subsize);
|
||||||
#ifndef FIXED_POINT
|
#ifndef FIXED_POINT
|
||||||
st->substate->scale *= .5;
|
st->substate->scale *= .5;
|
||||||
|
@ -135,26 +133,25 @@ void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar
|
||||||
|
|
||||||
ncfft = st->substate->nfft;
|
ncfft = st->substate->nfft;
|
||||||
|
|
||||||
st->tmpbuf[0].r = freqdata[0] + freqdata[1];
|
timedata[2*st->substate->bitrev[0]] = freqdata[0] + freqdata[1];
|
||||||
st->tmpbuf[0].i = freqdata[0] - freqdata[1];
|
timedata[2*st->substate->bitrev[0]+1] = freqdata[0] - freqdata[1];
|
||||||
|
|
||||||
for (k = 1; k <= ncfft / 2; ++k) {
|
for (k = 1; k <= ncfft / 2; ++k) {
|
||||||
kiss_fft_cpx fk, fnkc, fek, fok, tmp;
|
kiss_fft_cpx fk, fnkc, fek, fok, tmp;
|
||||||
|
int k1, k2;
|
||||||
|
k1 = st->substate->bitrev[k];
|
||||||
|
k2 = st->substate->bitrev[ncfft-k];
|
||||||
fk.r = freqdata[2*k];
|
fk.r = freqdata[2*k];
|
||||||
fk.i = freqdata[2*k+1];
|
fk.i = freqdata[2*k+1];
|
||||||
fnkc.r = freqdata[2*(ncfft - k)];
|
fnkc.r = freqdata[2*(ncfft-k)];
|
||||||
fnkc.i = -freqdata[2*(ncfft - k)+1];
|
fnkc.i = -freqdata[2*(ncfft-k)+1];
|
||||||
|
|
||||||
C_ADD (fek, fk, fnkc);
|
C_ADD (fek, fk, fnkc);
|
||||||
C_SUB (tmp, fk, fnkc);
|
C_SUB (tmp, fk, fnkc);
|
||||||
C_MUL (fok, tmp, st->super_twiddles[k]);
|
C_MUL (fok, tmp, st->super_twiddles[k]);
|
||||||
C_ADD (st->tmpbuf[k], fek, fok);
|
timedata[2*k1] = fek.r + fok.r;
|
||||||
C_SUB (st->tmpbuf[ncfft - k], fek, fok);
|
timedata[2*k1+1] = fek.i + fok.i;
|
||||||
#ifdef USE_SIMD
|
timedata[2*k2] = fek.r - fok.r;
|
||||||
st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0);
|
timedata[2*k2+1] = fok.i - fek.i;
|
||||||
#else
|
|
||||||
st->tmpbuf[ncfft - k].i *= -1;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
kiss_ifft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata);
|
ki_work((kiss_fft_cpx*)timedata, NULL, 1,1, st->substate->factors,st->substate, 1, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue