Changes in directory llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT:
LICENSE added (r1.1) Makefile added (r1.1) README added (r1.1) ddc.h added (r1.1) ddcmath.h added (r1.1) fftmisc.c added (r1.1) fourier.h added (r1.1) fourierf.c added (r1.1) main.c added (r1.1) --- Log message: readd mibench --- Diffs of the changes: (+560 -0) LICENSE | 42 +++++++++++++++++ Makefile | 7 ++ README | 42 +++++++++++++++++ ddc.h | 57 +++++++++++++++++++++++ ddcmath.h | 16 ++++++ fftmisc.c | 95 ++++++++++++++++++++++++++++++++++++++ fourier.h | 65 ++++++++++++++++++++++++++ fourierf.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.c | 86 ++++++++++++++++++++++++++++++++++ 9 files changed, 560 insertions(+) Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/LICENSE diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/LICENSE:1.1 *** /dev/null Tue Jan 9 18:01:25 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/LICENSE Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,42 ---- + + ============================================================== + | | + | readme.txt - by Don Cross <[EMAIL PROTECTED]> | + | | + ============================================================== + + The file FFT.ZIP contains C source code for performing Discrete Fast Fourier + Transforms (DFFTs) and inverse DFFTs. This source code is public domain. + Use at your own risk. For more information, point your web browser at: + + http://www.intersrv.com/~dcross/fft.html + + Also, feel free to send questions/comments about this source code to me + by e-mail at the address above. + + ------------------------------------------------------------------------------ + + *** SMALL REQUESTS **** + + If you want to give away copies of this source code, that's fine, so long + as you do the following: + + - Do not charge any money for this source code, except for possibly a + reasonable fee to cover postage, disk duplication, etc. I wrote this + code and I want it to be FREE to EVERYONE! + + - Do not remove my name, e-mail address, or URL from any of the files in + this collection. + + - Please keep this readme.txt file with the source and headers so that others + can get in touch with me to ask questions and/or find my web page to read + the online tutorial. + + - If you make any modifications to the source code, please add comments to + it which include your name, e-mail address, web page URL (if any), and + explain what you did to the code. + + - If you use this source code in an interesting program, please let me know. + I promise will never try to get money from you, even if you use this code + in a commercial program. I just want to know what kind of clever and + creative things people do with Fourier Transforms. Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/Makefile diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/Makefile:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/Makefile Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,7 ---- + LEVEL = ../../../.. + + PROG = telecomm-fft + LDFLAGS = -lm + RUN_OPTIONS = 8 32768 -i + + include $(LEVEL)/MultiSource/Makefile.multisrc Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/README diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/README:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/README Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,42 ---- + + ============================================================== + | | + | readme.txt - by Don Cross <[EMAIL PROTECTED]> | + | | + ============================================================== + + The file FFT.ZIP contains C source code for performing Discrete Fast Fourier + Transforms (DFFTs) and inverse DFFTs. This source code is public domain. + Use at your own risk. For more information, point your web browser at: + + http://www.intersrv.com/~dcross/fft.html + + Also, feel free to send questions/comments about this source code to me + by e-mail at the address above. + + ------------------------------------------------------------------------------ + + *** SMALL REQUESTS **** + + If you want to give away copies of this source code, that's fine, so long + as you do the following: + + - Do not charge any money for this source code, except for possibly a + reasonable fee to cover postage, disk duplication, etc. I wrote this + code and I want it to be FREE to EVERYONE! + + - Do not remove my name, e-mail address, or URL from any of the files in + this collection. + + - Please keep this readme.txt file with the source and headers so that others + can get in touch with me to ask questions and/or find my web page to read + the online tutorial. + + - If you make any modifications to the source code, please add comments to + it which include your name, e-mail address, web page URL (if any), and + explain what you did to the code. + + - If you use this source code in an interesting program, please let me know. + I promise will never try to get money from you, even if you use this code + in a commercial program. I just want to know what kind of clever and + creative things people do with Fourier Transforms. Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/ddc.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/ddc.h:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/ddc.h Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,57 ---- + /*============================================================================ + + ddc.h - Don Cross, October 1992. + + Generic ddclib stuff. + + ============================================================================*/ + + #ifndef __DDC_DDC_H + #define __DDC_DDC_H + + // If you add something to DDCRET, please add the appropriate string + // to the function DDCRET_String() in the file 'source\ddcret.cpp'. + + enum DDCRET + { + DDC_SUCCESS, // The operation succeded + DDC_FAILURE, // The operation failed for unspecified reasons + DDC_OUT_OF_MEMORY, // Operation failed due to running out of memory + DDC_FILE_ERROR, // Operation encountered file I/O error + DDC_INVALID_CALL, // Operation was called with invalid parameters + DDC_USER_ABORT, // Operation was aborted by the user + DDC_INVALID_FILE // File format does not match + }; + + + const char *DDCRET_String ( DDCRET ); // See source\ddcret.cpp + + + #define TRUE 1 + #define FALSE 0 + + typedef int dBOOLEAN; + + typedef unsigned char BYTE; + + typedef unsigned char UINT8; + typedef signed char INT8; + + typedef unsigned short int UINT16; + typedef signed short int INT16; + typedef unsigned long int UINT32; + typedef signed long int INT32; + + #ifdef __BORLANDC__ + #if sizeof(UINT16) != 2 + #error Need to fix UINT16 and INT16 + #endif + + #if sizeof(UINT32) != 4 + #error Need to fix UINT32 and INT32 + #endif + #endif + + #endif /* __DDC_DDC_H */ + + /*--- end of file ddc.h ---*/ Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/ddcmath.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/ddcmath.h:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/ddcmath.h Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,16 ---- + /*========================================================================== + + ddcmath.h - Don Cross <[EMAIL PROTECTED]>, October 1994. + + Contains useful math stuff. + + ==========================================================================*/ + + #ifndef __ddcmath_h + #define __ddcmath_h + + #define DDC_PI (3.14159265358979323846) + + #endif /* __ddcmath_h */ + + /*--- end of file ddcmath.h ---*/ Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fftmisc.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fftmisc.c:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fftmisc.c Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,95 ---- + /*============================================================================ + + fftmisc.c - Don Cross <[EMAIL PROTECTED]> + + http://www.intersrv.com/~dcross/fft.html + + Helper routines for Fast Fourier Transform implementation. + Contains common code for fft_float() and fft_double(). + + See also: + fourierf.c + fourierd.c + ..\include\fourier.h + + Revision history: + + 1998 September 19 [Don Cross] + Improved the efficiency of IsPowerOfTwo(). + Updated coding standards. + + ============================================================================*/ + + #include <stdlib.h> + #include <stdio.h> + #include <math.h> + + #include "fourier.h" + + #define TRUE 1 + #define FALSE 0 + + #define BITS_PER_WORD (sizeof(unsigned) * 8) + + + int IsPowerOfTwo ( unsigned x ) + { + if ( x < 2 ) + return FALSE; + + if ( x & (x-1) ) // Thanks to 'byang' for this cute trick! + return FALSE; + + return TRUE; + } + + + unsigned NumberOfBitsNeeded ( unsigned PowerOfTwo ) + { + unsigned i; + + if ( PowerOfTwo < 2 ) + { + fprintf ( + stderr, + ">>> Error in fftmisc.c: argument %d to NumberOfBitsNeeded is too small.\n", + PowerOfTwo ); + + exit(1); + } + + for ( i=0; ; i++ ) + { + if ( PowerOfTwo & (1 << i) ) + return i; + } + } + + + + unsigned ReverseBits ( unsigned index, unsigned NumBits ) + { + unsigned i, rev; + + for ( i=rev=0; i < NumBits; i++ ) + { + rev = (rev << 1) | (index & 1); + index >>= 1; + } + + return rev; + } + + + double Index_to_frequency ( unsigned NumSamples, unsigned Index ) + { + if ( Index >= NumSamples ) + return 0.0; + else if ( Index <= NumSamples/2 ) + return (double)Index / (double)NumSamples; + + return -(double)(NumSamples-Index) / (double)NumSamples; + } + + + /*--- end of file fftmisc.c---*/ Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fourier.h diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fourier.h:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fourier.h Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,65 ---- + /*============================================================================ + + fourier.h - Don Cross <[EMAIL PROTECTED]> + + http://www.intersrv.com/~dcross/fft.html + + Contains definitions for doing Fourier transforms + and inverse Fourier transforms. + + ============================================================================*/ + + #ifdef __cplusplus + extern "C" { + #endif + + /* + ** fft() computes the Fourier transform or inverse transform + ** of the complex inputs to produce the complex outputs. + ** The number of samples must be a power of two to do the + ** recursive decomposition of the FFT algorithm. + ** See Chapter 12 of "Numerical Recipes in FORTRAN" by + ** Press, Teukolsky, Vetterling, and Flannery, + ** Cambridge University Press. + ** + ** Notes: If you pass ImaginaryIn = NULL, this function will "pretend" + ** that it is an array of all zeroes. This is convenient for + ** transforming digital samples of real number data without + ** wasting memory. + */ + + void fft_double ( + unsigned NumSamples, /* must be a power of 2 */ + int InverseTransform, /* 0=forward FFT, 1=inverse FFT */ + double *RealIn, /* array of input's real samples */ + double *ImaginaryIn, /* array of input's imag samples */ + double *RealOut, /* array of output's reals */ + double *ImaginaryOut ); /* array of output's imaginaries */ + + + void fft_float ( + unsigned NumSamples, /* must be a power of 2 */ + int InverseTransform, /* 0=forward FFT, 1=inverse FFT */ + float *RealIn, /* array of input's real samples */ + float *ImaginaryIn, /* array of input's imag samples */ + float *RealOut, /* array of output's reals */ + float *ImaginaryOut ); /* array of output's imaginaries */ + + + int IsPowerOfTwo ( unsigned x ); + unsigned NumberOfBitsNeeded ( unsigned PowerOfTwo ); + unsigned ReverseBits ( unsigned index, unsigned NumBits ); + + /* + ** The following function returns an "abstract frequency" of a + ** given index into a buffer with a given number of frequency samples. + ** Multiply return value by sampling rate to get frequency expressed in Hz. + */ + double Index_to_frequency ( unsigned NumSamples, unsigned Index ); + + #ifdef __cplusplus + } + #endif + + + /*--- end of file fourier.h ---*/ Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fourierf.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fourierf.c:1.1 *** /dev/null Tue Jan 9 18:01:37 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/fourierf.c Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,150 ---- + /*============================================================================ + + fourierf.c - Don Cross <[EMAIL PROTECTED]> + + http://www.intersrv.com/~dcross/fft.html + + Contains definitions for doing Fourier transforms + and inverse Fourier transforms. + + This module performs operations on arrays of 'float'. + + Revision history: + + 1998 September 19 [Don Cross] + Updated coding standards. + Improved efficiency of trig calculations. + + ============================================================================*/ + + #include <stdlib.h> + #include <stdio.h> + #include <math.h> + + #include "fourier.h" + #include "ddcmath.h" + + #define CHECKPOINTER(p) CheckPointer(p,#p) + + static void CheckPointer ( void *p, char *name ) + { + if ( p == NULL ) + { + fprintf ( stderr, "Error in fft_float(): %s == NULL\n", name ); + exit(1); + } + } + + + void fft_float ( + unsigned NumSamples, + int InverseTransform, + float *RealIn, + float *ImagIn, + float *RealOut, + float *ImagOut ) + { + unsigned NumBits; /* Number of bits needed to store indices */ + unsigned i, j, k, n; + unsigned BlockSize, BlockEnd; + + double angle_numerator = 2.0 * DDC_PI; + double tr, ti; /* temp real, temp imaginary */ + + if ( !IsPowerOfTwo(NumSamples) ) + { + fprintf ( + stderr, + "Error in fft(): NumSamples=%u is not power of two\n", + NumSamples ); + + exit(1); + } + + if ( InverseTransform ) + angle_numerator = -angle_numerator; + + CHECKPOINTER ( RealIn ); + CHECKPOINTER ( RealOut ); + CHECKPOINTER ( ImagOut ); + + NumBits = NumberOfBitsNeeded ( NumSamples ); + + /* + ** Do simultaneous data copy and bit-reversal ordering into outputs... + */ + + for ( i=0; i < NumSamples; i++ ) + { + j = ReverseBits ( i, NumBits ); + RealOut[j] = RealIn[i]; + ImagOut[j] = (ImagIn == NULL) ? 0.0 : ImagIn[i]; + } + + /* + ** Do the FFT itself... + */ + + BlockEnd = 1; + for ( BlockSize = 2; BlockSize <= NumSamples; BlockSize <<= 1 ) + { + double delta_angle = angle_numerator / (double)BlockSize; + double sm2 = sin ( -2 * delta_angle ); + double sm1 = sin ( -delta_angle ); + double cm2 = cos ( -2 * delta_angle ); + double cm1 = cos ( -delta_angle ); + double w = 2 * cm1; + double ar[3], ai[3]; + double temp; + + for ( i=0; i < NumSamples; i += BlockSize ) + { + ar[2] = cm2; + ar[1] = cm1; + + ai[2] = sm2; + ai[1] = sm1; + + for ( j=i, n=0; n < BlockEnd; j++, n++ ) + { + ar[0] = w*ar[1] - ar[2]; + ar[2] = ar[1]; + ar[1] = ar[0]; + + ai[0] = w*ai[1] - ai[2]; + ai[2] = ai[1]; + ai[1] = ai[0]; + + k = j + BlockEnd; + tr = ar[0]*RealOut[k] - ai[0]*ImagOut[k]; + ti = ar[0]*ImagOut[k] + ai[0]*RealOut[k]; + + RealOut[k] = RealOut[j] - tr; + ImagOut[k] = ImagOut[j] - ti; + + RealOut[j] += tr; + ImagOut[j] += ti; + } + } + + BlockEnd = BlockSize; + } + + /* + ** Need to normalize if inverse transform... + */ + + if ( InverseTransform ) + { + double denom = (double)NumSamples; + + for ( i=0; i < NumSamples; i++ ) + { + RealOut[i] /= denom; + ImagOut[i] /= denom; + } + } + } + + + /*--- end of file fourierf.c ---*/ Index: llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/main.c diff -c /dev/null llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/main.c:1.1 *** /dev/null Tue Jan 9 18:01:38 2007 --- llvm-test/MultiSource/Benchmarks/MiBench/telecomm-FFT/main.c Tue Jan 9 18:01:15 2007 *************** *** 0 **** --- 1,86 ---- + #include <stdio.h> + #include <stdlib.h> + #include <math.h> + + int main(int argc, char *argv[]) { + unsigned MAXSIZE; + unsigned MAXWAVES; + unsigned i,j; + float *RealIn; + float *ImagIn; + float *RealOut; + float *ImagOut; + float *coeff; + float *amp; + int invfft=0; + + if (argc<3) + { + printf("Usage: fft <waves> <length> -i\n"); + printf("-i performs an inverse fft\n"); + printf("make <waves> random sinusoids"); + printf("<length> is the number of samples\n"); + exit(-1); + } + else if (argc==4) + invfft = !strncmp(argv[3],"-i",2); + MAXSIZE=atoi(argv[2]); + MAXWAVES=atoi(argv[1]); + + srand(1); + + RealIn=(float*)malloc(sizeof(float)*MAXSIZE); + ImagIn=(float*)malloc(sizeof(float)*MAXSIZE); + RealOut=(float*)malloc(sizeof(float)*MAXSIZE); + ImagOut=(float*)malloc(sizeof(float)*MAXSIZE); + coeff=(float*)malloc(sizeof(float)*MAXWAVES); + amp=(float*)malloc(sizeof(float)*MAXWAVES); + + /* Makes MAXWAVES waves of random amplitude and period */ + for(i=0;i<MAXWAVES;i++) + { + coeff[i] = rand()%1000; + amp[i] = rand()%1000; + } + for(i=0;i<MAXSIZE;i++) + { + /* RealIn[i]=rand();*/ + RealIn[i]=0; + for(j=0;j<MAXWAVES;j++) + { + /* randomly select sin or cos */ + if (rand()%2) + { + RealIn[i]+=coeff[j]*cos(amp[j]*i); + } + else + { + RealIn[i]+=coeff[j]*sin(amp[j]*i); + } + ImagIn[i]=0; + } + } + + /* regular*/ + fft_float (MAXSIZE,invfft,RealIn,ImagIn,RealOut,ImagOut); + + printf("RealOut:\n"); + for (i=0;i<MAXSIZE;i++) + printf("%f \t", RealOut[i]); + printf("\n"); + + printf("ImagOut:\n"); + for (i=0;i<MAXSIZE;i++) + printf("%f \t", ImagOut[i]); + printf("\n"); + + free(RealIn); + free(ImagIn); + free(RealOut); + free(ImagOut); + free(coeff); + free(amp); + exit(0); + + + } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits