On
05.04.2012, at 22:57, Mark Borgerding <
mark@xxxxxxxxxxxxxx> wrote:
> I tried to keep this in mind when writing originally. It does not handle it, but it might not be too hard.
> There are at least two Achille's heels, both in kiss_cpx_fft::make_twiddles ( file==ei_kissfft_impl.h )
> 1. The exp() function, as others have mentioned.
> 2. The calculation of pi, as done via acos(-1)
>
> Stepping back, what make_twiddles does is make one full cycle of a complex sinusoid with nfft points and unity magnitude.
> This problem easily decomposes into a primitive root-finding problem. This can be done very efficiently in most cases for the FFT, since people tend to use a length that is a multiple of small primes (2,3,5)
> (Let me know if this is not clear and I can provide an example.)
> In other words, if we had a root-finding function
>
> template<typename Scalar>
> Scalar nth_root( const RealScalar & x, int n); // maybe implemented via Newton-Raphson ?
>
> then make_twiddles could be specialized to use it for types other than complex<float|double|long double>
> The real_twiddles function also contains some trig calls -- these could derived in a similar way.
>
>
>
>
> On 04/05/2012 07:04 AM, Pavel Holoborodko wrote:
>> Yes, I have my own multiple precision complex exp() in std space, as
>> well as other math. functions. Seems to work fine in all other
>> contexts (including Eigen itself), but doesn't help with FFT :(
>>
>> On Apr 5, 2012, at 19:52, "Björn Piltz"<
bjornpiltz@xxxxxxxxxxxxxx> wrote:
>>
>>> I think std::exp() might be a candidate.
>>>
>>> Try adding
>>> namespace std { std::complex<Real> exp(const std::complex<Real>&); }
>>> to your file to see if it's the culprit.
>>>
>>> Björn
>>>
>>
>
>
>