test_vs_dft.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "kiss_fft.h"
  2. void check(kiss_fft_cpx * in,kiss_fft_cpx * out,int nfft,int isinverse)
  3. {
  4. int bin,k;
  5. double errpow=0,sigpow=0;
  6. for (bin=0;bin<nfft;++bin) {
  7. double ansr = 0;
  8. double ansi = 0;
  9. double difr;
  10. double difi;
  11. for (k=0;k<nfft;++k) {
  12. double phase = -2*M_PI*bin*k/nfft;
  13. double re = cos(phase);
  14. double im = sin(phase);
  15. if (isinverse)
  16. im = -im;
  17. #ifdef FIXED_POINT
  18. re /= nfft;
  19. im /= nfft;
  20. #endif
  21. ansr += in[k].r * re - in[k].i * im;
  22. ansi += in[k].r * im + in[k].i * re;
  23. }
  24. difr = ansr - out[bin].r;
  25. difi = ansi - out[bin].i;
  26. errpow += difr*difr + difi*difi;
  27. sigpow += ansr*ansr+ansi*ansi;
  28. }
  29. printf("nfft=%d inverse=%d,snr = %f\n",nfft,isinverse,10*log10(sigpow/errpow) );
  30. }
  31. void test1d(int nfft,int isinverse)
  32. {
  33. size_t buflen = sizeof(kiss_fft_cpx)*nfft;
  34. kiss_fft_cpx * in = (kiss_fft_cpx*)malloc(buflen);
  35. kiss_fft_cpx * out= (kiss_fft_cpx*)malloc(buflen);
  36. kiss_fft_cfg cfg = kiss_fft_alloc(nfft,isinverse,0,0);
  37. int k;
  38. for (k=0;k<nfft;++k) {
  39. in[k].r = (rand() % 65536) - 32768;
  40. in[k].i = (rand() % 65536) - 32768;
  41. }
  42. kiss_fft(cfg,in,out);
  43. check(in,out,nfft,isinverse);
  44. free(in);
  45. free(out);
  46. free(cfg);
  47. }
  48. int main(int argc,char ** argv)
  49. {
  50. if (argc>1) {
  51. int k;
  52. for (k=1;k<argc;++k) {
  53. test1d(atoi(argv[k]),0);
  54. test1d(atoi(argv[k]),1);
  55. }
  56. }else{
  57. test1d(32,0);
  58. test1d(32,1);
  59. }
  60. return 0;
  61. }