double_test.c
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2. ** Copyright (C) 1999-2000 Erik de Castro Lopo <erikd@zip.com.au>
  3. **  
  4. ** This program is free software; you can redistribute it and/or modify
  5. ** it under the terms of the GNU General Public License as published by
  6. ** the Free Software Foundation; either version 2 of the License, or
  7. ** (at your option) any later version.
  8. ** 
  9. ** This program is distributed in the hope that it will be useful,
  10. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ** GNU General Public License for more details.
  13. ** 
  14. ** You should have received a copy of the GNU General Public License
  15. ** along with this program; if not, write to the Free Software 
  16. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <unistd.h>
  21. #include <math.h>
  22. #include <sndfile.h>
  23. #define SAMPLE_RATE 11025
  24. #define BUFFER_SIZE (1<<14)
  25. static void scaled_test (char *str, char *filename, int filetype, int bitwidth, double tolerance) ;
  26. static int error_function (double data, double orig, double margin) ;
  27. static void gen_signal (double *data, unsigned int datalen) ;
  28. static double orig_data [BUFFER_SIZE] ;
  29. static double test_data [BUFFER_SIZE] ;
  30. int main (int argc, char *argv[])
  31. {
  32. scaled_test ("pcm8" , "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 8, 0.001) ;
  33. scaled_test ("pcm16", "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 16, 0.001) ;
  34. scaled_test ("pcm24", "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 24, 0.001) ;
  35. scaled_test ("pcm32", "test.wav", SF_FORMAT_WAV | SF_FORMAT_PCM, 32, 0.001) ;
  36. scaled_test ("ulaw", "test.au", SF_FORMAT_AU | SF_FORMAT_ULAW, 16, 0.05) ;
  37. scaled_test ("alaw", "test.au", SF_FORMAT_AU | SF_FORMAT_ALAW, 16, 0.05) ;
  38. scaled_test ("imaadpcm", "test.wav", SF_FORMAT_WAV | SF_FORMAT_IMA_ADPCM, 16, 0.21) ;
  39. scaled_test ("msadpcm" , "test.wav", SF_FORMAT_WAV | SF_FORMAT_MS_ADPCM, 16, 0.7) ;
  40. scaled_test ("gsm610"  , "test.wav", SF_FORMAT_WAV | SF_FORMAT_GSM610, 16, 3.0) ;
  41. scaled_test ("g721_32", "test.au", SF_FORMAT_AU | SF_FORMAT_G721_32, 16, 1.1) ;
  42. scaled_test ("g723_24", "test.au", SF_FORMAT_AU | SF_FORMAT_G723_24, 16, 1.1) ;
  43. return 0;
  44. } /* main */
  45. /*============================================================================================
  46.  * Here are the test functions.
  47.  */ 
  48. static
  49. void scaled_test (char *str, char *filename, int filetype, int bitwidth, double tolerance)
  50. { SNDFILE *file ;
  51. SF_INFO sfinfo ;
  52. unsigned int k ;
  53. double scale ;
  54. printf ("    scaled_test : %s ", str) ;
  55. for (k = strlen (str) ; k < 10 ; k++)
  56. putchar ('.') ;
  57. putchar (' ') ;
  58. gen_signal (orig_data, BUFFER_SIZE) ;
  59. sfinfo.samplerate  = SAMPLE_RATE ;
  60. sfinfo.samples     = BUFFER_SIZE ;
  61. sfinfo.channels    = 1 ;
  62. sfinfo.pcmbitwidth = bitwidth ;
  63. sfinfo.format     = filetype ;
  64. if (! (file = sf_open_write (filename, &sfinfo)))
  65. { printf ("sf_open_write failed with error : ") ;
  66. sf_perror (NULL) ;
  67. exit (1) ;
  68. } ;
  69. if (sf_write_double (file, orig_data, BUFFER_SIZE, 1) != BUFFER_SIZE)
  70. { printf ("sf_write_int failed with error : ") ;
  71. sf_perror (file) ;
  72. exit (1) ;
  73. } ;
  74. sf_close (file) ;
  75. memset (test_data, 0, sizeof (test_data)) ;
  76. if (! (file = sf_open_read (filename, &sfinfo)))
  77. { printf ("sf_open_read failed with error : ") ;
  78. sf_perror (NULL) ;
  79. exit (1) ;
  80. } ;
  81. if (sfinfo.format != filetype)
  82. { printf ("Returned format incorrect (0x%08X => 0x%08X).n", filetype, sfinfo.format) ;
  83. exit (1) ;
  84. } ;
  85. if (sfinfo.samples < BUFFER_SIZE)
  86. { printf ("Incorrect number of samples in file (too short). (%d should be %d)n", sfinfo.samples, BUFFER_SIZE) ;
  87. exit (1) ;
  88. } ;
  89. if (sfinfo.channels != 1)
  90. { printf ("Incorrect number of channels in file.n") ;
  91. exit (1) ;
  92. } ;
  93. if (sfinfo.pcmbitwidth != bitwidth)
  94. { printf ("Incorrect bit width (%d => %d).n", bitwidth, sfinfo.pcmbitwidth) ;
  95. exit (1) ;
  96. } ;
  97. if ((k = sf_read_double (file, test_data, BUFFER_SIZE, 1)) < 0.99 * BUFFER_SIZE)
  98. { printf ("short read (%d).n", k) ;
  99. exit (1) ;
  100. } ;
  101. sf_close (file) ;
  102. scale = bitwidth > 8 ? 32000.0 : 120.0 ;
  103. for (k = 0 ; k < BUFFER_SIZE ; k++)
  104. if (error_function (scale * test_data [k], scale * orig_data [k], tolerance))
  105. { printf ("Incorrect sample (#%d : %f should be %f).n", k, test_data [k], orig_data [k]) ;
  106. exit (1) ;
  107. } ;
  108. unlink (filename) ;
  109. printf ("okn") ;
  110. } /* scaled_test */
  111. /*========================================================================================
  112. ** Auxiliary functions
  113. */
  114. static
  115. void gen_signal (double *data, unsigned int datalen)
  116. { unsigned int k, ramplen ;
  117. double amp = 0.0 ;
  118. ramplen = datalen / 20 ;
  119. for (k = 0 ; k < datalen ; k++)
  120. { if (k <= ramplen)
  121. amp = k / ((double) ramplen) ;
  122. else if (k > datalen - ramplen)
  123. amp = (datalen - k) / ((double) ramplen) ;
  124. data [k] = amp * (0.4 * sin (33.3 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))
  125. + 0.3 * cos (201.1 * 2.0 * M_PI * ((double) (k+1)) / ((double) SAMPLE_RATE))) ;
  126. } ;
  127. return ;
  128. } /* gen_signal */
  129. static
  130. int error_function (double data, double orig, double margin)
  131. { double error ;
  132. if (fabs (orig) <= 500.0)
  133. error = fabs (fabs (data) - fabs(orig)) / 2000.0 ;
  134. else if (fabs (orig) <= 1000.0)
  135. error = fabs (data - orig) / 3000.0 ;
  136. else
  137. error = fabs (data - orig) / fabs (orig) ;
  138. if (error > margin)
  139. { printf ("nn*******************nError : %fn", error) ;
  140. return 1 ;
  141. } ;
  142. return 0 ;
  143. } /* error_function */