MCPcopy Create free account
hub / github.com/clMathLibraries/clFFT / get_R2C_fftwf_output

Function get_R2C_fftwf_output

src/callback-client/callback-client.cpp:520–576  ·  view source on GitHub ↗

Compute reference output using fftw for float type

Source from the content-addressed store, hash-verified

518
519// Compute reference output using fftw for float type
520fftwf_complex* get_R2C_fftwf_output(size_t* lengths, size_t fftbatchLength, int batch_size,
521 clfftLayout in_layout, clfftDim dim)
522{
523 //In FFTW last dimension has the fastest changing index
524 int fftwLengths[3] = {(int)lengths[2], (int)lengths[1], (int)lengths[0]};
525 int inembed[3] = {(int)lengths[2], (int)lengths[1], (int)(lengths[0] + 2)};
526 int outembed[3] = {(int)lengths[2], (int)lengths[1], (int)(lengths[0]/2 + 1)};
527
528 fftwf_plan refPlan;
529
530 int infftVectorLength = inembed[0] * inembed[1] * inembed[2];
531 int outfftVectorLength = outembed[0] * outembed[1] * outembed[2];
532
533 float *refin = (float*) malloc(sizeof(float)*fftbatchLength);
534 fftwf_complex *refout = (fftwf_complex*)fftwf_malloc(sizeof(fftwf_complex)*outfftVectorLength*batch_size);
535
536 refPlan = fftwf_plan_many_dft_r2c(dim, &fftwLengths[3 - dim], batch_size,
537 refin, &inembed[3 - dim], 1, infftVectorLength,
538 refout, &outembed[3 - dim], 1, outfftVectorLength, FFTW_ESTIMATE);
539
540 uint24_t* in24bitData = (uint24_t*)malloc(sizeof(uint24_t) * fftbatchLength);
541
542 //Initialize Data
543 srand(1);
544 for (size_t idx = 0; idx < fftbatchLength; ++idx)
545 {
546 int randomVal = (int)rand();
547
548 in24bitData[idx][0] = (randomVal >> 16) & 0xFF;
549 in24bitData[idx][1] = (randomVal >> 8) & 0xFF;
550 in24bitData[idx][2] = randomVal & 0xFF;
551 }
552
553 float val;
554
555 for( size_t i = 0; i < fftbatchLength; i++)
556 {
557 val = (float)(in24bitData[i][0] << 16 | in24bitData[i][1] << 8 | in24bitData[i][2]) ;
558
559 refin[i] = val;
560 }
561
562 fftwf_execute(refPlan);
563
564 free(refin);
565
566 fftwf_destroy_plan(refPlan);
567
568 //Execute post-process code
569 for (size_t idx = 0; idx < (outfftVectorLength*batch_size); ++idx)
570 {
571 float magnitude = sqrtf(pow(refout[idx][0], 2) + pow(refout[idx][1], 2));
572 refout[idx][0] = magnitude;
573 }
574
575 return refout;
576}

Callers 2

runR2C_FFT_WithCallbackFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected