/* * Copyright (C) 2002-2007 Akira Nukada. All rights reserved. * Copyright (C) 2002-2007 The SSI Project. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE SSI PROJECT ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE SSI PROJECT BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * */ #include "libfftss.h" void fftss_execute_inplace_dft_1d(fftss_plan_1d p, double *in, double *out) { double *b0, *b1, *b2, *b3; long i; if (in == out) out = p->work; b0 = in; b1 = out; if (p->logn2 < 2) { if (p->logn2 == 1) { double xr0, xi0, xr1, xi1; xr0 = b0[0] + b0[2]; xi0 = b0[1] + b0[3]; xr1 = b0[0] - b0[2]; xi1 = b0[1] - b0[3]; b0[0] = xr0; b0[1] = xi0; b0[2] = xr1; b0[3] = xi1; } return; } if (p->stages & 1) { b1 = in; b2 = out; } else { b1 = out; b2 = in; } p->k[0].kern(b0, b1, p->w, p->k[0].bsize, p->k[0].blocks); for (i = 1; i < p->stages; i++) { p->k[i].kern(b1, b2, p->w, p->k[i].bsize, p->k[i].blocks); b3 = b2; b2 = b1; b1 = b3; } }