bugfix.notes
上传用户:szhypcb168
上传日期:2007-01-06
资源大小:2187k
文件大小:17k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1. Date: Wed, 24 Mar 93 12:30:44 -0500
  2. From: kabal@aldebaran.ee.mcgill.ca (Peter Kabal)
  3. Message-Id: <9303241730.AA07509@aldebaran.EE.McGill.CA>
  4. To: jpcampb@afterlife.ncsc.mil (Joe Campbell)
  5. Subject: celp distribution
  6. Content-Length: 17181
  7. X-Lines: 539
  8. Status: RO
  9. Joe, I grabbed the latest version from furmint.nectar.cs.cmu.edu.  Vince
  10. Cale has now put everything in a tar.Z file.  I had grabbed the stuff earlier
  11. when it was just loose in some directories.  Some of the stuff has been badly
  12. mangled.  I ran a diff with the latest version, and there is an apology
  13. in the comments to the effect that he has messed up the ifdefs.  Indeed he
  14. has, that is why the C-version does not run.
  15. I suggest you send him (and me), the correct celp.c and makefile.  That
  16. should put the distribution back in order.  There are other bits and
  17. pieces lying around which probably were not in the original distribution.
  18. Back to the Fortran version.  The version I have now runs on both Sun and
  19. DEC without further modification.  The DEC version complains about speech
  20. differences, but after processing the DEC and Sun output files measure
  21. up to within 80 dB.  The DEC output file is slightly longer than the Sun,
  22. but that is presumably due to differences in how they handle partial
  23. records at the end.
  24. Fortran routines for 1016 CELP
  25. The following renames were required:
  26. bitperm.h  ->  bitpermute.h
  27. bitprot.h  -> bitprotect.h
  28. cbgain.tlb -> cbgain.table
  29. cbsearch.f -> cbsearch.F
  30. csub.f     -> csub.F
  31. dcodham.f  -> decodeham.f
  32. disto.f    -> distortion.f
  33. encodham.f -> encodeham.f
  34. gaindcod.f -> gaindecode.f
  35. gainncd2.f -> gainencode2.f
  36. gainncod.f -> gainencode.f
  37. ldelaynr.f -> ldelay_nr.f
  38. lsp34.tbl  -> lsp34.table
  39. lspd34.f   -> lspdecode34.f
  40. mexcite.f  -> mexcite.F
  41. mtrxgen.f  -> matrixgen.f
  42. pgain.tbl  -> pagain.table
  43. ptdcode.f  -> pitchdecode.f
  44. ptncod.f   -> pitchencode.f
  45. postfilt.f -> postfilt2.f
  46. read_err.f -> read_error.f
  47. readme.mke -> readme.make
  48. savesg.f   -> save_sg.f
  49. smcbgn.f   -> smoothcbgain.f
  50. smpgn.f    -> smoothpgain.f
  51. smt.f      -> smoothtau.f
  52. wrterr.f   -> write_error.f
  53. In addition, the following routines were more extensively modified and
  54. renamed:
  55. celp.f     -> celp.F     changes + ultrix changes
  56. cli.f      -> cli.F      changes + ultrix changes
  57. iodisk.f   -> iodisk.F   changes + ultrix changes
  58. makefile.mke -> Makefile
  59. psearch.f  -> psearch.F  changes + ultrix changes
  60. Sun refers to Fortran under SunOS 4.1.3.
  61. DEC refers to DEC Fortran 3.2 running under Ultrix 4.2.
  62. Changes:
  63. (1) "implicit undefined" is a Sun'ism.  The equivalent for DEC is
  64.     "implicit none".  However, the best strategy is not to have such a
  65.     statement at all.  Both Sun & DEC Fortran accept the -u option which
  66.     turns on this option without having to modify the source.  This is
  67.     the preferred way for portable code.  This affects ALL fortran routines.
  68. (2) DEC Fortran (and the F77 standard) do not allow null character strings.
  69.     Since strings are padded with blanks anyway, the portable solution is
  70.     to use ' ' instead of ''. (cli.F)
  71. (3) Both Sun and DEC use the extension .F to signify that the file contains
  72.     conditionals which need the C-preprocessor.
  73. (4) Consider a file which is read only.  For Sun an OPEN succeeds on this
  74.     file, and only if one attempts to write will an error be signalled.
  75.     For DEC, an open fails unless the "readonly" option is specified in
  76.     the open.  The readonly option is ignored by Sun, but with a warning.
  77.     I have put conditionals (ifdef ultrix) around such changes.
  78. (5) The interpretation of the record size for unformatted reads is according
  79.     to the F77 standard in terms of "processor defined units".  Sun uses
  80.     bytes and DEC uses longwords (4 bytes).  I have put conditionals around
  81.     such changes. (iodisk.F)
  82. (6) The routine celp.f (renamed to celp.F) had a number of unexplained
  83.     errors.  First the header had been mangled so that comment characters
  84.     were not in place on some statements.  Second, the reference to
  85.     bitprotect treated it as a character, when in fact it is an integer.
  86.     Third the only routine available is postfilt2, yet the code calls out
  87.     postfilt.
  88. (7) There are some incompatibilities for an unformatted read of a character
  89.     string in routine cli.F.  The F77 standard indicates that on the
  90.     external record, the string should be in quotes.  I changed this to a
  91.     formatted read.
  92. (8) The code in psearch.F had some consistency checks on parameter values.
  93.     With DEC Fortran, these were optimized right out of the code.  This
  94.     made part of the code unreachable, causing a compilation error.
  95. Here are my diffs (not including the "implicit undefined" stuff which applies
  96. practically to all files).
  97. *** celp32/celp.f Mon Oct 26 17:19:36 1992
  98. --- ../celp-1016/celp32/celp.F Wed Mar 10 17:32:26 1993
  99. ***************
  100. *** 7,13 ****
  101.   * resulting from this code.  Further reproduction or distribution   *
  102.   * of this code without prior written permission of the U.S.         *
  103.   * Government is prohibited.  See NCS Technical Information Bulletin *
  104. ! * on FS 1016 CELP Speech Coding.   *                                                                         *   *
  105.   ***************************************************************************
  106.   C
  107.   C ROUTINE
  108. --- 7,14 ----
  109.   * resulting from this code.  Further reproduction or distribution   *
  110.   * of this code without prior written permission of the U.S.         *
  111.   * Government is prohibited.  See NCS Technical Information Bulletin *
  112. ! * on FS 1016 CELP Speech Coding.                                    *
  113. ! *                                                                         *
  114.   ***************************************************************************
  115.   C
  116.   C ROUTINE
  117. ***************
  118. *** 146,152 ****
  119.   C**************************************************************************
  120.   C*-
  121.           program celp
  122. !  implicit undefined (a-z)
  123.    include 'ccsub.com'
  124.   convex #include "ccsub.com"
  125.           real sold(maxll), snew(maxll), ssub(maxll)
  126. --- 147,153 ----
  127.   C**************************************************************************
  128.   C*-
  129.           program celp
  130.    include 'ccsub.com'
  131.   convex #include "ccsub.com"
  132.           real sold(maxll), snew(maxll), ssub(maxll)
  133. ***************
  134. *** 285,292 ****
  135. --- 286,295 ----
  136.   c This issue can be reviewed by reading the UNIX man pages
  137.   c on ieee floating point (man -k ieee).
  138.   c
  139. + #ifdef sun
  140.    call abrupt_underflow()
  141.   #include <f77/f77_floatingpoint.h>
  142. + #endif
  143.   cSUN? call ieee_handler("set", "underflow", SIGFPE_DEFAULT)
  144.   c
  145.   c *** parse the command line
  146. ***************
  147. *** 377,385 ****
  148.   c
  149.   c *bit stream channel file
  150.    if (analy) then
  151. !     open(unit=25, file=ofile(1:oflen)//'.chan')
  152.    else
  153.       open(unit=25, file=ifile(1:iflen)//'.chan', status='old')
  154.    end if
  155.   c
  156.   c *quantizer design (data collection) files
  157. --- 380,393 ----
  158.   c
  159.   c *bit stream channel file
  160.    if (analy) then
  161. !     open(unit=25, file=ofile(1:oflen)//'.chan', status='new')
  162.    else
  163. + #ifdef ultrix
  164. +     open(unit=25, file=ifile(1:iflen)//'.chan', status='old',
  165. +      -         readonly)
  166. + #else
  167.       open(unit=25, file=ifile(1:iflen)//'.chan', status='old')
  168. + #endif
  169.    end if
  170.   c
  171.   c *quantizer design (data collection) files
  172. ***************
  173. *** 387,393 ****
  174. --- 395,406 ----
  175.   copt open(unit=21, file='pgain.data')
  176.   c
  177.   c *read stochastic code book vector file (by 20)
  178. + #ifdef ultrix
  179. +  open(unit=11, file='./codebook.h', status='old', err=112,
  180. +      -      readonly)
  181. + #else
  182.    open(unit=11, file='./codebook.h', status='old', err=112)
  183. + #endif
  184.    i = 1
  185.    do 110 j = 1, (2*(maxncsize-1)+l)/20
  186.       read(11, *, err=112) (x(k), k=i,i-1+20)
  187. ***************
  188. *** 400,406 ****
  189. --- 413,424 ----
  190.   115 continue
  191.   c
  192.   c *read adaptive code book index (pitch delay) file
  193. + #ifdef ultrix
  194. +  open(unit=12, file='./pdelay.h', status='old', err=122,
  195. +      -      readonly)
  196. + #else
  197.    open(unit=12, file='./pdelay.h', status='old', err=122)
  198. + #endif
  199.    do 120 i = 0, maxpd-1
  200.       read(12, *, err=122) pdelay(i)
  201.   120 continue
  202. ***************
  203. *** 412,419 ****
  204. --- 430,444 ----
  205.   c *read pitch delay coding tables for bit assignment
  206.   c *pdencode.h for encoding, pddecode.h for decoding
  207.   c *generate pdtabi for delta delay coding
  208. + #ifdef ultrix
  209. +  open(unit=13, file='./pdencode.h', status='old', err=132,
  210. +      -      readonly)
  211. +  open(unit=14, file='./pddecode.h', status='old', err=142,
  212. +      -      readonly)
  213. + #else
  214.    open(unit=13, file='./pdencode.h', status='old', err=132)
  215.    open(unit=14, file='./pddecode.h', status='old', err=142)
  216. + #endif
  217.    do 130 i = 0, maxpd-1
  218.       read(13, '(z)', err=132) pdencode(i)
  219.       read(14, *, err=142) pddecode(i)
  220. ***************
  221. *** 427,441 ****
  222.   145 continue
  223.   c
  224.   c *read bit protection file
  225.    open(unit=15, file='./bitprotect.h', status='old', err=152)
  226. !     read(15, *, err=152) bitprotect(1:codelength2)
  227.    close(15)
  228.    go to 155
  229.   152    stop ' celp:  Problem with file "bitprotect.h"'
  230.   155 continue
  231.   c
  232.   c *read bit permutation file (by 12)
  233.    open(unit=16, file='./bitpermute.h', status='old', err=162)
  234.    i = 1
  235.    do 160 j = 1, streambits/12
  236.       read(16, *, err=162) (bitpermute(k), k=i,i+11)
  237. --- 452,476 ----
  238.   145 continue
  239.   c
  240.   c *read bit protection file
  241. + #ifdef ultrix
  242. +  open(unit=15, file='./bitprotect.h', status='old', err=152,
  243. +      -      readonly)
  244. + #else
  245.    open(unit=15, file='./bitprotect.h', status='old', err=152)
  246. ! #endif
  247. !     read(15, *, err=152) (bitprotect(i),i=1,codelength2)
  248.    close(15)
  249.    go to 155
  250.   152    stop ' celp:  Problem with file "bitprotect.h"'
  251.   155 continue
  252.   c
  253.   c *read bit permutation file (by 12)
  254. + #ifdef ultrix
  255. +  open(unit=16, file='./bitpermute.h', status='old', err=162,
  256. +      -      readonly)
  257. + #else
  258.    open(unit=16, file='./bitpermute.h', status='old', err=162)
  259. + #endif
  260.    i = 1
  261.    do 160 j = 1, streambits/12
  262.       read(16, *, err=162) (bitpermute(k), k=i,i+11)
  263. ***************
  264. *** 916,922 ****
  265.   c
  266.   c       *** post filtering
  267.   c
  268. !    call postfilt(vdecoded(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  269.   canaly   call postfilt(v(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  270.   clocomp   call postfilt2(vdecoded(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  271.   c
  272. --- 951,957 ----
  273.   c
  274.   c       *** post filtering
  275.   c
  276. !    call postfilt2(vdecoded(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  277.   canaly   call postfilt(v(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  278.   clocomp   call postfilt2(vdecoded(k),l,alpha,beta,ip,op,dp1,dp2,dp3,dp4)
  279.   c
  280. *** celp32/cli.f Mon Oct 26 17:19:37 1992
  281. --- ../celp-1016/celp32/cli.F Wed Mar 10 20:28:50 1993
  282. ***************
  283. *** 152,158 ****
  284.   c
  285.   c note:  ncsize, no, and gamma are passed through common
  286.   c
  287. -  implicit undefined(a-z)
  288.    include 'ccsub.com'
  289.   convex  #include "ccsub.com"
  290.    character*80 ifile, ofile, stype*10
  291. --- 152,157 ----
  292. ***************
  293. *** 174,180 ****
  294.    logical flag, qflag
  295.   c
  296.    data switch /'-i','-o', '-p', '-q', '-m', '-l', '-c'/
  297. !  data pfile /''/, qfile /''/, mfile /''/, lfile /'celp.log'/
  298.    data type /'cbgain', 'pitch', 'spectrum'/
  299.    data qtype /'kang','log','max2','arcsin','none'/
  300.   c
  301. --- 173,179 ----
  302.    logical flag, qflag
  303.   c
  304.    data switch /'-i','-o', '-p', '-q', '-m', '-l', '-c'/
  305. !  data pfile /' '/, qfile /' '/, mfile /' '/, lfile /'celp.log'/
  306.    data type /'cbgain', 'pitch', 'spectrum'/
  307.    data qtype /'kang','log','max2','arcsin','none'/
  308.   c
  309. ***************
  310. *** 225,232 ****
  311.   c *** read input parameter file if requested
  312.   c           (all parameters are required)
  313.   c
  314. !  if (pfile .ne. '') then
  315.       open(unit=69, file=pfile)
  316.       read(69, *) ncsize 
  317.       read(69, *) l
  318.       read(69, *) ll
  319. --- 224,235 ----
  320.   c *** read input parameter file if requested
  321.   c           (all parameters are required)
  322.   c
  323. !  if (pfile .ne. ' ') then
  324. ! #ifdef ultrix
  325. !     open(unit=69, file=pfile, status='OLD', readonly)
  326. ! #else
  327.       open(unit=69, file=pfile)
  328. + #endif
  329.       read(69, *) ncsize 
  330.       read(69, *) l
  331.       read(69, *) ll
  332. ***************
  333. *** 243,257 ****
  334.       if (mxsw2 .ne. 1) mxsw = .false.
  335.   c
  336.       read(69, *) prewt
  337. !     read(69, *) pstype
  338.       close(unit=69)
  339.    end if
  340.   c
  341.   c *** read quantization characteristics file if requested
  342.   c           (not all parameters are required)
  343.   c
  344. !  if (qfile .ne. '') then
  345.       open(unit=70, file=qfile)
  346.       do 300 i = 1, maxtype
  347.          read(70, 69) temp
  348.   69       format(a)
  349. --- 246,264 ----
  350.       if (mxsw2 .ne. 1) mxsw = .false.
  351.   c
  352.       read(69, *) prewt
  353. !     read(69, '(A)') pstype
  354.       close(unit=69)
  355.    end if
  356.   c
  357.   c *** read quantization characteristics file if requested
  358.   c           (not all parameters are required)
  359.   c
  360. !  if (qfile .ne. ' ') then
  361. ! #ifdef ultrix
  362. !     open(unit=70, file=qfile, status='OLD', readonly)
  363. ! #else
  364.       open(unit=70, file=qfile)
  365. + #endif
  366.       do 300 i = 1, maxtype
  367.          read(70, 69) temp
  368.   69       format(a)
  369. ***************
  370. *** 299,306 ****
  371.   c
  372.   c *** read bit error characteristics file if requested
  373.   c
  374. !  if (mfile .ne. '') then
  375.       open(unit=72, file=mfile)
  376.       do 74 i = 1, bits
  377.          read(72, 73) mask(i)
  378.   73       format(i1)
  379. --- 306,317 ----
  380.   c
  381.   c *** read bit error characteristics file if requested
  382.   c
  383. !  if (mfile .ne. ' ') then
  384. ! #ifdef ultrix
  385. !     open(unit=72, file=mfile, status='OLD', readonly)
  386. ! #else
  387.       open(unit=72, file=mfile)
  388. + #endif
  389.       do 74 i = 1, bits
  390.          read(72, 73) mask(i)
  391.   73       format(i1)
  392. ***************
  393. *** 397,408 ****
  394. --- 408,427 ----
  395.    if (lfile .ne. 'none') then  
  396.       if (lfile .eq. 'celp.log') then
  397.   cvax       open(unit=71, file=lfile, access='append')
  398. + #ifdef ultrix
  399. +        open(unit=71, file=lfile, status='UNKNOWN')
  400. + #else
  401.          open(unit=71, file=lfile)
  402. + #endif
  403.   601       read(71, 69, end=602) temp
  404.          goto 601
  405.   602       continue
  406.       else
  407. + #ifdef ultrix
  408. +        open(unit=71, file=lfile, status='NEW')
  409. + #else
  410.          open(unit=71, file=lfile)
  411. + #endif
  412.       end if
  413.       write(71, *) getlog(), host, fdate()
  414.       write(71, *)'          Program: '//prog(1:lnblnk(prog))
  415. *** celp32/iodisk.f Mon Oct 26 17:19:42 1992
  416. --- ../celp-1016/celp32/iodisk.F Fri Mar 12 11:11:33 1993
  417. ***************
  418. *** 41,47 ****
  419.   C**************************************************************************
  420.   C*-
  421.    function iodisk(mode, lun, fname, nrec, iar, size)
  422. !  implicit undefined(a-z)
  423.    integer mode, lun, nrec, size, iodisk
  424.    integer*2 iar(size)    
  425.    character*(*) fname
  426. --- 41,47 ----
  427.   C**************************************************************************
  428.   C*-
  429.    function iodisk(mode, lun, fname, nrec, iar, size)
  430.    integer mode, lun, nrec, size, iodisk
  431.    integer*2 iar(size)    
  432.    character*(*) fname
  433. ***************
  434. *** 68,81 ****
  435. --- 68,93 ----
  436.       nrec = nrec+1
  437.    else if (mode .eq. 3) then
  438.   c *open file for read
  439. + #ifdef ultrix
  440. +     if (mod(size,2).ne.0) stop 'frame size must be even'
  441.       open(lun, file=fname, access='direct', status='old',
  442. +      +         recl=size/2, readonly, err=333)
  443. + #else
  444. +     open(lun, file=fname, access='direct', status='old',
  445.        +         recl=2*size, err=333)
  446. + #endif
  447.    else if (mode .eq. 4) then
  448.   c *open file for write
  449.   c *unlink = UNIX file delete
  450.       call unlink(fname)
  451. + #ifdef ultrix
  452. +     if (mod(size,2).ne.0) stop 'frame size must be even'
  453. +     open(lun, file=fname, access='direct', status='new',
  454. +      +         recl=size/2, err=444)
  455. + #else
  456.       open(lun, file=fname, access='direct', status='new',
  457.        +         recl=2*size, err=444)
  458. + #endif
  459.    else if (mode .eq. -1) then
  460.   c *close file
  461.       close(lun, err=555)
  462. *** celp32/psearch.f Mon Oct 26 17:19:50 1992
  463. --- ../celp-1016/celp32/psearch.F Wed Mar 10 20:33:25 1993
  464. ***************
  465. *** 83,89 ****
  466.   C**************************************************************************
  467.   C*-
  468.    subroutine psearch(s, l)
  469. !  implicit undefined (a-z)
  470.    integer l
  471.    real s(l)
  472.    include 'ccsub.com'
  473. --- 83,89 ----
  474.   C**************************************************************************
  475.   C*-
  476.    subroutine psearch(s, l)
  477.    integer l
  478.    real s(l)
  479.    include 'ccsub.com'
  480. ***************
  481. *** 102,107 ****
  482. --- 102,110 ----
  483.    real v0(maxbufptr), v0shift(maxlp), frac
  484.   c *length of truncated impulse response
  485.    parameter (len = 30)
  486. +  save oldptr, submult
  487. + c
  488. +  data oldptr/1/
  489.   c
  490.   c Choose type of pitch delay search:
  491.   c
  492. ***************
  493. *** 132,146 ****
  494.       stop ' psearch: incorrect pitch search type (pstype)'
  495.    end if
  496.   c
  497. -  save oldptr, submult
  498. - c
  499. -  data oldptr/1/
  500.   c
  501.   c
  502.    if (len .gt. l) stop ' psearch:  impulse response too long'
  503.   c
  504.    bufptr = mmax+no+2*l+maxnp-1
  505. !  if (maxlp .lt. maxl) stop ' psearch:  maxlp < maxl'
  506.   #ifdef SUNGRAPH
  507.   c *save impulse response in file 'pitch'
  508.    call save_sg(pitch_ir_vid,h,l,'save pitch_ir_vid')
  509. --- 135,146 ----
  510.       stop ' psearch: incorrect pitch search type (pstype)'
  511.    end if
  512.   c
  513.   c
  514.   c
  515.    if (len .gt. l) stop ' psearch:  impulse response too long'
  516.   c
  517.    bufptr = mmax+no+2*l+maxnp-1
  518.   #ifdef SUNGRAPH
  519.   c *save impulse response in file 'pitch'
  520.    call save_sg(pitch_ir_vid,h,l,'save pitch_ir_vid')
  521. ***************
  522. *** 159,165 ****
  523. --- 159,170 ----
  524.       bb(3) = 0.0
  525.       bb(1) = mmin
  526.   c *load pitch submultiple delay table
  527. + #ifdef ultrix
  528. +     open(unit=8, file='./submult.h', status='old', err=22,
  529. +      -         readonly)
  530. + #else
  531.       open(unit=8, file='./submult.h', status='old', err=22)
  532. + #endif
  533.       do 20 i = 0, maxpd-1
  534.          read(8, *, err=22) (submult(i,j), j=0,3)
  535.   20    continue