- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Hello everyone!

Those days, I have been playing around with the IPP FTT functions.

I especially try to compare the performance between a complex FTT and a real FFT (1D single-precison).

**I have already red that complex FTT are faster than real FFT, for instance here :**

1. Hello, according our expert, amount of processed data in functions ippsFFTFwd_CToC_32fcand ippsFFTFwd_RToPerm is the same, but in the last function more calculations are needed. It is the reason why this function work slower for the same buffer size. Regards, Vladimir

2. Also according to this speed benchmark, http://www.fftw.org/speed/CoreDuo-3.0GHz-icc/ , complexFTT seems to be 30% faster as realFFT

**However, when i'm testing both on my core2duo 1.8ghz, real FFT are faster...**

-- IPP FTT 1D speed test (fft size: 256) --

fft_1D_real: 1620.1 clocks per FFT > FASTER !

fft_1D_complex: 2261.6 clocks per FFT

Did I misunderstand something ?

Thanx for your help! ++Josh

Here is my test code :

[cpp]#include

#include

#include

#include

#include "ipp.h"

#define FFT_SIZE 256

#define FFT_ORDER 8

#define LOOP_MAX 200000

using namespace std;

// REAL FTT

IppStatus fft_ipp_real()

{

int i, loop;

IppStatus status;

IppsFFTSpec_R_32f *mySpecReal;

Ipp32f *input = ippsMalloc_32f(FFT_SIZE);

Ipp32f *output = ippsMalloc_32f(FFT_SIZE + 2);

for(i = 0; i < FFT_SIZE; i++)

{

input= (float)cos(0.8 * i);

}

status = ippsFFTInitAlloc_R_32f(&mySpecReal, FFT_ORDER, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast);

int bufferSize = 0;

status = ippsFFTGetBufSize_R_32f(mySpecReal, &bufferSize);

Ipp8u *myBuffer = (bufferSize > 0 ? ippsMalloc_8u(bufferSize) : NULL);

for(loop = 0; loop < LOOP_MAX; loop++)

{

status = ippsFFTFwd_RToCCS_32f(input, output, mySpecReal, myBuffer);

}

ippsFFTFree_R_32f(mySpecReal);

ippsFree(myBuffer);

ippsFree(input);

ippsFree(output);

return status;

}

// COMPLEX FTT

IppStatus fft_ipp_complex()

{

int i, loop;

IppStatus status;

IppsFFTSpec_C_32fc *mySpecComplex;

Ipp32fc *input = ippsMalloc_32fc(FFT_SIZE);

Ipp32fc *output = ippsMalloc_32fc(FFT_SIZE + 2);

for(i = 0; i < FFT_SIZE; i++)

{

input.re = (float)cos(0.8 * i);

input.im = 0;

}

status = ippsFFTInitAlloc_C_32fc(&mySpecComplex, FFT_ORDER, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast);

int bufferSize = 0;

status = ippsFFTGetBufSize_C_32fc(mySpecComplex, &bufferSize);

Ipp8u *myBuffer = (bufferSize > 0 ? ippsMalloc_8u(bufferSize) : NULL);

for(loop = 0; loop < LOOP_MAX; loop++)

{

status = ippsFFTFwd_CToC_32fc(input, output, mySpecComplex, myBuffer);

}

ippsFFTFree_C_32fc(mySpecComplex);

ippsFree(myBuffer);

ippsFree(input);

ippsFree(output);

return status;

}

// THE MAIN

int main(int argc, char **argv)

{

Ipp64u startClocks;

ippStaticInit();

printf("\n-- IPP FTT 1D speed test (fft size: %d) --\n\n", FFT_SIZE);

startClocks = ippGetCpuClocks();

fft_ipp_real();

printf("fft_1D_real: %.1f clocks per FFT\n", (float)(ippGetCpuClocks() - startClocks) / (float)LOOP_MAX);

startClocks = ippGetCpuClocks();

fft_ipp_complex();

printf("fft_1D_complex: %.1f clocks per FFT", (float)(ippGetCpuClocks() - startClocks) / (float)LOOP_MAX);

printf("\n\nPress any key to exit...\n");

getch();

return 0;

}

[/cpp]

Link Copied

2 Replies

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content

Real FFT functions are faster than complex FFT functionsfor the identical size of transform (their execution time is less) because theyperform 2x less calculations.

Performance of FFT functions (www.fftw.org) is calculatedaccording to thenext formulas

5*n*log (n)/time - for complex FFT

5*n*log (n)/time/2 - for real FFT

Therefore if the execution time of real FFT function is more than half (0.5x)of the execution time of complex FFT function its performanceis less.

Topic Options

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page