fftw_dct.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <fftw3.h>
  4. #ifdef DCT_TEST_USE_SINGLE
  5. typedef float float_prec;
  6. #define PF "%.7f"
  7. #define FFTW_PLAN fftwf_plan
  8. #define FFTW_MALLOC fftwf_malloc
  9. #define FFTW_FREE fftwf_free
  10. #define FFTW_PLAN_CREATE fftwf_plan_r2r_1d
  11. #define FFTW_EXECUTE fftwf_execute
  12. #define FFTW_DESTROY_PLAN fftwf_destroy_plan
  13. #define FFTW_CLEANUP fftwf_cleanup
  14. #else
  15. typedef double float_prec;
  16. #define PF "%.18f"
  17. #define FFTW_PLAN fftw_plan
  18. #define FFTW_MALLOC fftw_malloc
  19. #define FFTW_FREE fftw_free
  20. #define FFTW_PLAN_CREATE fftw_plan_r2r_1d
  21. #define FFTW_EXECUTE fftw_execute
  22. #define FFTW_DESTROY_PLAN fftw_destroy_plan
  23. #define FFTW_CLEANUP fftw_cleanup
  24. #endif
  25. enum type {
  26. DCT_I = 1,
  27. DCT_II = 2,
  28. DCT_III = 3,
  29. DCT_IV = 4,
  30. DST_I = 5,
  31. DST_II = 6,
  32. DST_III = 7,
  33. DST_IV = 8,
  34. };
  35. int gen(int type, int sz)
  36. {
  37. float_prec *a, *b;
  38. FFTW_PLAN p;
  39. int i, tp;
  40. a = FFTW_MALLOC(sizeof(*a) * sz);
  41. if (a == NULL) {
  42. fprintf(stderr, "failure\n");
  43. exit(EXIT_FAILURE);
  44. }
  45. b = FFTW_MALLOC(sizeof(*b) * sz);
  46. if (b == NULL) {
  47. fprintf(stderr, "failure\n");
  48. exit(EXIT_FAILURE);
  49. }
  50. switch(type) {
  51. case DCT_I:
  52. tp = FFTW_REDFT00;
  53. break;
  54. case DCT_II:
  55. tp = FFTW_REDFT10;
  56. break;
  57. case DCT_III:
  58. tp = FFTW_REDFT01;
  59. break;
  60. case DCT_IV:
  61. tp = FFTW_REDFT11;
  62. break;
  63. case DST_I:
  64. tp = FFTW_RODFT00;
  65. break;
  66. case DST_II:
  67. tp = FFTW_RODFT10;
  68. break;
  69. case DST_III:
  70. tp = FFTW_RODFT01;
  71. break;
  72. case DST_IV:
  73. tp = FFTW_RODFT11;
  74. break;
  75. default:
  76. fprintf(stderr, "unknown type\n");
  77. exit(EXIT_FAILURE);
  78. }
  79. switch(type) {
  80. case DCT_I:
  81. case DCT_II:
  82. case DCT_III:
  83. case DCT_IV:
  84. for(i=0; i < sz; ++i) {
  85. a[i] = i;
  86. }
  87. break;
  88. case DST_I:
  89. case DST_II:
  90. case DST_III:
  91. case DST_IV:
  92. /* TODO: what should we do for dst's?*/
  93. for(i=0; i < sz; ++i) {
  94. a[i] = i;
  95. }
  96. break;
  97. default:
  98. fprintf(stderr, "unknown type\n");
  99. exit(EXIT_FAILURE);
  100. }
  101. p = FFTW_PLAN_CREATE(sz, a, b, tp, FFTW_ESTIMATE);
  102. FFTW_EXECUTE(p);
  103. FFTW_DESTROY_PLAN(p);
  104. for(i=0; i < sz; ++i) {
  105. printf(PF"\n", b[i]);
  106. }
  107. FFTW_FREE(b);
  108. FFTW_FREE(a);
  109. return 0;
  110. }
  111. int main(int argc, char* argv[])
  112. {
  113. int n, tp;
  114. if (argc < 3) {
  115. fprintf(stderr, "missing argument: program type n\n");
  116. exit(EXIT_FAILURE);
  117. }
  118. tp = atoi(argv[1]);
  119. n = atoi(argv[2]);
  120. gen(tp, n);
  121. FFTW_CLEANUP();
  122. return 0;
  123. }