|
楼主 |
发表于 2013-8-13 12:47:57
|
显示全部楼层
改进后的代码生成工具:- #include <stdio.h>
- #include <math.h>
- typedef signed char int8_;
- typedef unsigned char uint8_;
- typedef signed short int16_;
- typedef unsigned short uint16_;
- typedef signed long int32_;
- typedef unsigned long uint32_;
- typedef float flt_;
- typedef double lflt_;
- /**********************************************************************************************
- #define _W_N_n_ Wn
- #define _Exchange(Buffer,A,B,Temp)\
- {\
- Temp = Buffer[A];\
- Buffer[A] = Buffer[B];\
- Buffer[B] = Temp;\
- }
- #define _ReOrder(Buffer,Temp)\
- {\
- _Exchange(Buffer, %lu, %lu, Temp);\
- _Exchange(Buffer, %lu, %lu, Temp);\
- ......
- ......
- _Exchange(Buffer, %lu, %lu, Temp);\
- _Exchange(Buffer, %lu, %lu, Temp);\
- }
- #define _Butter(BufferR,BufferV,A,B,MR,MV,TempR,TempV)
- {\
- TempR = (MR) * BufferR[B] - (MV) * BufferV[B];\
- TempV = (MR) * BufferV[B] + (MV) * BufferR[B];\
- BufferR[B] = BufferR[A] - TempR;\
- BufferV[B] = BufferV[A] - TempV;\
- BufferR[A] += TempR;\
- BufferV[A] += TempV;\
- }
- #define _Butter0(BufferR,BufferV,A,B,TempR,TempV)
- {\
- TempR = BufferR[B];\
- TempV = BufferV[B];\
- BufferR[B] = BufferR[A] - TempR;\
- BufferV[B] = BufferV[A] - TempV;\
- BufferR[A] += TempR;\
- BufferV[A] += TempV;\
- }
- #define _Butter1(BufferR,BufferV,A,B,TempR,TempV)
- {\
- TempR = 0 - BufferV[B];\
- TempV = BufferR[B];\
- BufferR[B] = BufferR[A] - TempR;\
- BufferV[B] = BufferV[A] - TempV;\
- BufferR[A] += TempR;\
- BufferV[A] += TempV;\
- }
- #define _Butters(BufferR,BufferV,TempR,TempV)\
- {\
- _Butter(BufferR, BufferV, %lu, %lu, %lf, %lf, TempR, TempV);\
- _Butter(BufferR, BufferV, %lu, %lu, %lf, %lf, TempR, TempV);\
- ......
- ......
- _Butter(BufferR, BufferV, %lu, %lu, %lf, %lf, TempR, TempV);\
- _Butter(BufferR, BufferV, %lu, %lu, %lf, %lf, TempR, TempV);\
- }
- **********************************************************************************************/
- static int8_ CreateW(FILE* File, uint32_ N)
- {
- uint32_ i, j;
- lflt_ Pi = 3.1415926535 * 2.0 / N, Temp = 0.0;
- for (i = N >> 1, j = 0; i; i--, j++, Temp += Pi)
- {
- if (!fprintf(File, (const char*)"#define _WR_%lu_%lu_ (%.20lf)\n", N, j, cos(Temp)))
- break;
- if (!fprintf(File, (const char*)"#define _WV_%lu_%lu_ (%.20lf)\n", N, j, sin(Temp)))
- break;
- }
- return i ? -1 : 0;
- }
- static uint8_ N2K(uint32_ N)
- {
- uint8_ k;
- for (k = 0, N--; N ; N >>= 1, k++)
- ;
- return k;
- }
- static int8_ CreateReOrder(FILE* File, uint32_ N)
- {
- uint32_ u, v, i, j, k = N >> 1;
- if (!fprintf(File, (const char*)"#define _Exchange(Buffer,A,B,Temp)\\\n{\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTemp = Buffer[A];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBuffer[A] = Buffer[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBuffer[B] = Temp;\\\n}\n"))
- return -1;
- if (!fprintf(File, (const char*)"#define _ReOrder(Buffer,Temp)\\\n{\\\n"))
- return -1;
- for (u = 0, i = 0, j = 1; j < N; j++)
- {
- for (v = k; i >= v; i-= v, v >>= 1)
- ;
- i += v;
- if (j < i)
- {
- if (!fprintf(File, (const char*)"\t_Exchange(Buffer, %lu, %lu, Temp);\\\n", j, i))
- break;
- u++;
- }
- }
- if (!fprintf(File, (const char*)"}\n"))
- return -1;
- return (N - (1 << ((N2K(N) + 1) >> 1))) >> 1 == u ? 0 : -1;
- }
- static int8_ CreateButter(FILE* File, uint32_ N, uint8_ K)
- {
- uint32_ v, u, i, j, J = 1 << K, X = 1 << (K + 1), Y = 1 << (N2K(N) - K - 1);
- for (v = 0, i = N >> (K + 1); i; i--)
- {
- for (j = J; j > 0; j--, v++)
- {
- u = (j - 1) * Y;
- if (0 == u)
- {
- if (!fprintf(File, (const char*)"\t_Butter0(BufferR, BufferV, %lu, %lu, TempR, TempV);\\\n", (i - 1) * X + j - 1, i * X + j - J - 1))
- return -1;
- }
- else if (N >> 2 == u)
- {
- if (!fprintf(File, (const char*)"\t_Butter1(BufferR, BufferV, %lu, %lu, TempR, TempV);\\\n", (i - 1) * X + j - 1, i * X + j - J - 1))
- return -1;
- }
- else
- {
- if (!fprintf(File, (const char*)"\t_Butter(BufferR, BufferV, %lu, %lu, _WR_%lu_%lu_, _WV_%lu_%lu_, TempR, TempV);\\\n", (i - 1) * X + j - 1, i * X + j - J - 1, N, u, N, u))
- return -1;
- }
- }
- }
- return (N >> 1) == v ? 0 : -1;
- }
- static int8_ CreateButters(FILE* File, uint32_ N)
- {
- uint8_ k, K = N2K(N);
- if (!fprintf(File, (const char*)"#define _Butter(BufferR,BufferV,A,B,MR,MV,TempR,TempV)\\\n{\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTempR = (MR) * BufferR[B] - (MV) * BufferV[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTempV = (MR) * BufferV[B] + (MV) * BufferR[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferR[B] = BufferR[A] - TempR;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferV[B] = BufferV[A] - TempV;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferR[A] += TempR;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferV[A] += TempV;\\\n}\n"))
- return -1;
- if (!fprintf(File, (const char*)"#define _Butter0(BufferR,BufferV,A,B,TempR,TempV)\\\n{\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTempR = BufferR[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTempV = BufferV[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferR[B] = BufferR[A] - TempR;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferV[B] = BufferV[A] - TempV;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferR[A] += TempR;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferV[A] += TempV;\\\n}\n"))
- return -1;
- if (!fprintf(File, (const char*)"#define _Butter1(BufferR,BufferV,A,B,TempR,TempV)\\\n{\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTempR = 0 - BufferV[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tTempV = BufferR[B];\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferR[B] = BufferR[A] - TempR;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferV[B] = BufferV[A] - TempV;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferR[A] += TempR;\\\n"))
- return -1;
- if (!fprintf(File, (const char*)"\tBufferV[A] += TempV;\\\n}\n"))
- return -1;
- if (!fprintf(File, (const char*)"#define _Butters(BufferR,BufferV,TempR,TempV)\\\n{\\\n"))
- return -1;
- for (k = 0; k < K; k++)
- if (CreateButter(File, N, k))
- return -1;
- if (!fprintf(File, (const char*)"}\n"))
- return -1;
- return 0 == K - k ? 0: -1;
- }
- int8_ CreateDitFftFile(const char* FileName, uint32_ N)
- {
- FILE* File = fopen(FileName, "w");
- if (!File)
- return -1;
- if (CreateW(File, N))
- {
- fclose(File);
- return -1;
- }
- if (CreateReOrder(File, N))
- {
- fclose(File);
- return -1;
- }
- if (CreateButters(File, N))
- {
- fclose(File);
- return -1;
- }
- fclose(File);
- return 0;
- }
复制代码 |
|