#!/bin/sh
#####################################################-*-mode:shell-script-*-
##                                                                       ##
##                   Carnegie Mellon University and                      ##
##                   Alan W Black and Kevin A. Lenzo                     ##
##                      Copyright (c) 1998-2000                          ##
##                        All Rights Reserved.                           ##
##                                                                       ##
##  Permission is hereby granted, free of charge, to use and distribute  ##
##  this software and its documentation without restriction, including   ##
##  without limitation the rights to use, copy, modify, merge, publish,  ##
##  distribute, sublicense, and/or sell copies of this work, and to      ##
##  permit persons to whom this work is furnished to do so, subject to   ##
##  the following conditions:                                            ##
##   1. The code must retain the above copyright notice, this list of    ##
##      conditions and the following disclaimer.                         ##
##   2. Any modifications must be clearly marked as such.                ##
##   3. Original authors' names are not deleted.                         ##
##   4. The authors' names are not used to endorse or promote products   ##
##      derived from this software without specific prior written        ##
##      permission.                                                      ##
##                                                                       ##
##  CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK         ##
##  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING      ##
##  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT   ##
##  SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE      ##
##  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    ##
##  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN   ##
##  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,          ##
##  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF       ##
##  THIS SOFTWARE.                                                       ##
##                                                                       ##
###########################################################################
###                                                                       ##
###  Generate LPC coefficients and residual for diphones (or otherwise)   ##
###                                                                       ##
############################################################################

if [ $# = 0 ]
then
   echo "Extract lpc coefficients and residuals"
   echo "Usage:  bin/make_lpc wav/*.wav"
   echo "Expects pm/*.pm to exist, and creates lpc/*.lpc and lpc/*.res"
   echo "If etc/powfacts exists, waveform will be power normalized"
   echo "for LPC and residual extraction, wav/*.wav will be unchanged though."
   exit 1
fi

if [ ! "$ESTDIR" ]
then
   echo "environment variable ESTDIR is unset"
   echo "set it to your local speech tools directory e.g."
   echo '   bash$ export ESTDIR=/home/awb/projects/speech_tools/'
   echo or
   echo '   csh% setenv ESTDIR /home/awb/projects/speech_tools/'
   exit 1
fi

# Modification by Milan Zamazal <pdm@freebsoft.org>: Ensure locales don't break number printing.
unset LC_ALL
export LC_NUMERIC=C

for i in $*
do
   fname=`basename $i .wav`
   echo $i LPC

   # Potentially normalise the power (if powfact is there)
   # Change by Milan Zamazal <pdm@freebsoft.org>: If the corresponding etc/pf/*
   # file exists, use it instead of etc/powfacts:
   if [ -f etc/pf/$fname ]; then
       powfact=`cat etc/pf/$fname`
       $ESTDIR/bin/ch_wave -scale $powfact $i -o /tmp/tmp$$.wav
   elif [ -f etc/powfacts ]
   then
       powfact=`awk '{if ($1 == "'$fname'") print $2}' etc/powfacts`
       if [ ! "$powfact" ]
       then
           powfact=1.0
       fi
       $ESTDIR/bin/ch_wave -scale $powfact $i -o /tmp/tmp$$.wav
   else
       cat $i >/tmp/tmp$$.wav    
   fi
   # Change the overall volume too, of the normalised file
   # $ESTDIR/bin/ch_wave -scaleN 0.65 -o /tmp/tmp$$.wav /tmp/tmp$$.wav

   # and if you want to resample, now is the time (can be combine with above)
   #$ESTDIR/bin/ch_wave -F 11025 -o /tmp/tmp$$.wav /tmp/tmp$$.wav

   # Extract the LPC coefficients
   # Modification by Milan Zamazal <pdm@freebsoft.org>: -lpc_order value
   # increased to 46
  $ESTDIR/bin/sig2fv /tmp/tmp$$.wav -o lpc/$fname.lpc -otype est_binary -lpc_order 46 -coefs "lpc" -pm pm/$fname.pm -preemph 0.95 -factor 3 -window_type hamming
   # Extract the residual
   $ESTDIR/bin/sigfilter /tmp/tmp$$.wav -o lpc/$fname.res -otype nist -lpcfilter lpc/$fname.lpc -inv_filter

   rm /tmp/tmp$$.wav
done
