#!/bin/csh -f
# ----------------------------------------------------------------- #
#             The Speech Signal Processing Toolkit (SPTK)           #
#             developed by SPTK Working Group                       #
#             http://sp-tk.sourceforge.net/                         #
# ----------------------------------------------------------------- #
#                                                                   #
#  Copyright (c) 1984-2007  Tokyo Institute of Technology           #
#                           Interdisciplinary Graduate School of    #
#                           Science and Engineering                 #
#                                                                   #
#                1996-2015  Nagoya Institute of Technology          #
#                           Department of Computer Science          #
#                                                                   #
# All rights reserved.                                              #
#                                                                   #
# Redistribution and use in source and binary forms, with or        #
# without modification, are permitted provided that the following   #
# conditions are met:                                               #
#                                                                   #
# - Redistributions of source code must retain the above copyright  #
#   notice, this list of conditions and the following disclaimer.   #
# - Redistributions in binary form must reproduce the above         #
#   copyright notice, this list of conditions and the following     #
#   disclaimer in the documentation and/or other materials provided #
#   with the distribution.                                          #
# - Neither the name of the SPTK working group nor the names of its #
#   contributors may be used to endorse or promote products derived #
#   from this software without specific prior written permission.   #
#                                                                   #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND            #
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,       #
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF          #
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          #
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS #
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,          #
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED   #
# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     #
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON #
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,   #
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY    #
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE           #
# POSSIBILITY OF SUCH DAMAGE.                                       #
# ----------------------------------------------------------------- #

#########################################################################
#                                                                       #
#   Draw a Running Log Spectrum Graph                                   #
#                                                                       #
#                                               1988.5  K.Tokuda        #
#                                               1996.6  K.Koishida      #
#                                               1998.7  M.Tamura        #
#                                               2010.6  T.Sawada        #
#                                               2013.2  T.Okada         #
#                                                                       #
#########################################################################

set path    = ( /usr/pkg/SPTK/bin $path )
set sptkver = '3.9'
set cvsid   = '$Id: grlogsp.in,v 1.24 2015/12/14 05:45:40 uratec Exp $'

set cmnd = $0
set cmnd = $cmnd:t

set h    = 1.5
set w    = 0.25
set z    = 1
set F    = 1
@ xo     = 95
@ yo     = 30
@ x      = 1
@ ymin   = -100
@ yscale = 100

set yy   = ("" "")
set p    = 2
set ln   = 1
set cs   = 2
@ cy     = -8
@ cyy    = -14
@ cyyy   = -20

@ g      = 0
@ s      = 0
@ l      = 256

set trans = 0
set help  = 0
set file

set xname = ( "Normalized frequency" \
              "Normalized frequency (rad)" \
              "" \
              "Frequency (kHz)" \
              "Frequency (kHz)" \
              "Frequency (kHz)" \
              "" \
              "Frequency (kHz)" \
              "" \
              "Frequency (kHz)" \
              "" "" "" "" "" \
              "Frequency (kHz)" \
              "" "" "" "" "" \
              "Frequency (kHz)" \
              "" \
              "Frequency (kHz)" \
              "" "" "" "" "" "" "" "" \
              "" "" "" "" "" "" "" "" \
              "" "" "" "" "" "" "" \
              "Frequency (kHz)" )

set xs = ( "0 0.25 0.5" \
           0\ \'1.57\ \"\\pi/2\"\ \'3.14\ \"\\pi\" \
           "" \
           "0 1 2 3 4" \
           "0 1 2 3 4 5" \
           "0 2 4 6" \
           "" \
           "0 2 4 6 8" \
           "" \
           "0 2 4 6 8 10" \
           "" "" "" "" "" \
           "0 4 8 12 16" \
           "" "" "" "" "" \
           "0 11 22" \
           "" \
           "0 6 12 18 24" \
           "" "" "" "" "" "" "" "" \
           "" "" "" "" "" "" "" "" \
           "" "" "" "" "" "" "" \
           "0 16 32 48" )

set xx = ( "0 0.5" \
           "0 3.14" \
           "" \
           "0 4" \
           "0 5" \
           "0 6" \
           "" \
           "0 8" \
           "" \
           "0 10" \
           "" "" "" "" "" \
           "0 16" \
           "" "" "" "" "" \
           "0 22" \
           "" \
           "0 24" \
           "" "" "" "" "" "" "" "" \
           "" "" "" "" "" "" "" "" \
           "" "" "" "" "" "" "" \
           "0 48" )

set xl = ( 0.5 \
           3.14 \
           "" \
           4 \
           5 \
           6 \
           "" \
           8 \
           "" \
           10 \
           "" "" "" "" "" \
           16 \
           "" "" "" "" "" \
           22 \
           "" \
           24 \
           "" "" "" "" "" "" "" "" \
           "" "" "" "" "" "" "" "" \
           "" "" "" "" "" "" "" \
           48 )

set on_x = (25 60 95 130 165 200 235 270 305 340)

@ i = 0
while ($i < $#argv)
        @ i++
        switch ("$argv[$i]")
        case -t:
                set trans = 1
                breaksw
        case -f:
                @ i++
                set f = $argv[$i]
                breaksw
        case -H:
                @ i++
                set h = $argv[$i]
                breaksw
        case -W:
                @ i++
                set w = $argv[$i]
                breaksw
        case -F:
                @ i++
                set F = $argv[$i]
                breaksw
        case -o:
                @ i++
                @ xo = $argv[$i]
                @ i++
                @ yo = $argv[$i]
                breaksw
        case -O:
                @ i++
                @ on = $argv[$i]
                breaksw
        case -x:
                @ i++
                @ x = $argv[$i]
                breaksw
        case -y:
                @ i++
                @ ymin = $argv[$i]
                breaksw
        case -yo:
                @ i++
                @ yo = $argv[$i]
                breaksw
        case -yy:
                @ i++
                @ yscale = $argv[$i]
                breaksw
        case -p:
                @ i++
                set p = $argv[$i]
                breaksw
        case -ln:
                @ i++
                set ln = $argv[$i]
                breaksw
        case -c:
                @ i++
                set c = "$argv[$i]"
                breaksw
        case -c2:
                @ i++
                set cc = "$argv[$i]"
                breaksw
        case -c3:
                @ i++
                set ccc = "$argv[$i]"
                breaksw
        case -cy:
                @ i++
                set cy = "$argv[$i]"
                breaksw
        case -cy2:
                @ i++
                set cyy = "$argv[$i]"
                breaksw
        case -cy3:
                @ i++
                set cyyy = "$argv[$i]"
                breaksw
        case -cs:
                @ i++
                set cs = "$argv[$i]"
                breaksw
        case -g:
                @ i++
                @ g = $argv[$i]
                breaksw
        case -s:
                @ i++
                set s = $argv[$i]
                breaksw
        case -e:
                @ i++
                set e = $argv[$i]
                breaksw
        case -l:
                @ i++
                @ l = $argv[$i]
                breaksw
        case -n:
                @ i++
                @ n = $argv[$i]
                breaksw
        case -z:
                @ i++
                set z = $argv[$i]
                breaksw
        case -help:
                set help = 1
        case -h:
                set exit_status = 0
                goto usage
                breaksw
        default:
                set file = "$argv[$i]"
                if ( ! -f "$file" ) then
                        echo2 "${cmnd} : Cannot open file ${file}\!"
                        set exit_status = 1
                        goto usage
                endif
                breaksw
        endsw
end

# when input stream is stdin
if ("$file" == "") then
    rm -fr /tmp/sptk-grlogsp-$uid-$$
    cat > /tmp/sptk-grlogsp-$uid-$$
    set file=/tmp/sptk-grlogsp-$uid-$$
endif

goto main

usage:
        echo2 ''
        echo2 " $cmnd - draw a running log spectrum graph"
        echo2 ''
        echo2 '  usage:'
        echo2 '       grlogsp.sh [ options ] [ infile ] > stdout'
        echo2 '  options:'
        echo2 '       -F   F         : factor                       [1]    '
        echo2 '       -t             : transpose x and y axes       [FALSE]'
        echo2 '       -O   O         : origin of graph              [6]    '
        echo2 '                       (if O is more than 6, drawing area is over A4 range)'
if ( $help ) then
        echo2 '                         1 ( 25, yo) <mm>   +----------------------+'
        echo2 '                         2 ( 60, yo) <mm>   |                      |'
        echo2 '                         3 ( 95, yo) <mm>   |                      |'
        echo2 '                         4 (130, yo) <mm>   | 1 2 3 4 5 6 7 8 9 10 |'
        echo2 '                         5 (165, yo) <mm>   +----------------------+'
        echo2 '                         6 (200, yo) <mm>  '
        echo2 '                         7 (235, yo) <mm>  '
        echo2 '                         8 (270, yo) <mm>  '
        echo2 '                         9 (305, yo) <mm>  '
        echo2 '                        10 (340, yo) <mm>  '
        echo2 '                         (yo+100,x) <mm> if -t is specified'
endif
        echo2 '       -x   x         : x scale                      [1]'
if ( $help ) then
        echo2 '                       1  (Normalized frequency <0, 0.5>)'
        echo2 '                       2  (Normalized frequency <0, pi/2, pi>)'
        echo2 '                       4  (Frequency <0,  1,  2,  3,  4      kHz>)'
        echo2 '                       5  (Frequency <0,  1,  2,  3,  4,  5  kHz>)'
        echo2 '                       8  (Frequency <0,  2,  4,  6,  8      kHz>)'
        echo2 '                       10 (Frequency <0,  2,  4,  6,  8, 10  kHz>)'
        echo2 '                       16 (Frequency <0,  4,  8, 12, 16      kHz>)'
        echo2 '                       22 (Frequency <0, 11, 22              kHz>)'
        echo2 '                       24 (Frequency <0,  6, 12, 18, 24      kHz>)'
        echo2 '                       48 (Frequency <0, 16, 32, 48          kHz>)'        
endif
        echo2 '       -y   ymin      : y minimum                    [-100]'
        echo2 '       -yy  yy        : y scale           <dB/10mm>  [100]'
        echo2 '       -yo  yo        : y offset                     [30]'
        echo2 '       -p   p         : pen no.                      [2]'
        echo2 '       -ln  ln        : line number                  [1]'
        echo2 '       -s   s         : start frame number           [0]'
        echo2 '       -e   e         : end frame number             [EOF]'
        echo2 '       -n   n         : number of frame              [EOF]'
        echo2 '       -l   l         : frame length                 [256]'
        echo2 '       -c   "c"       : comment for the graph        [""]'
        echo2 '       -c2  "c2"      : comment for the graph        [""]'
        echo2 '       -c3  "c3"      : comment for the graph        [""]'
        echo2 '       -h             : print this message'
        echo2 '       -help          : print help in detail'
if ( $help ) then
        echo2 '       (level 2)'
        echo2 '       -W   W         : width of the graph  <100mm>  [0.25]'
        echo2 '       -H   H         : height of the graph <100mm>  [1.5]'
        echo2 '       -z   z         : moving width           <mm>  [False]'
        echo2 '                       (if -z option does not exist, z is the same as F)'
        echo2 '       -o   xo yo     : origin of the graph          [30, 65]'
        echo2 '                       (if -o option exists, -O is not effective)'
        echo2 '       -g   g         : type of the graph            [0]'
        echo2 '                         0 (no frame)'
        echo2 '                         1 (half frame)'
        echo2 '                         2 (with frame)'
        echo2 '       -cy  cy        : first comment position       [-8]'
        echo2 '       -cy2 cy2       : second comment position      [-14]'
        echo2 '       -cy3 cy3       : third comment position       [-20]'
        echo2 '       -cs  cs        : comment size                 [1]'
        echo2 '       -f   f         : additional data file for fig [NULL]'
endif
        echo2 '  infile:'
        echo2 "       log spectrum (float)                          [stdin]"
        echo2 '  stdout:'
        echo2 '       XY-plotter command'
        echo2 ''
        echo2 " SPTK: version $sptkver"
        echo2 " CVS Info: $cvsid"
        echo2 ''
exit 0

main:
if ($?on) then
        @ xo = $on_x[$on]
endif

set xo  = `echo "$xo * $F" | bc -l`
set yo  = `echo "$yo * $F" | bc -l`
set cs  = `echo "$cs * $F" | bc -l`
@ yy[1] = $ymin
@ yy[2] = $yy[1] + $yscale * 10

set ww = $w
if( $trans ) then
        set T = "-t"
        set xxo = $xo
        set xo = $yo
        set yo = $xxo
        set yo = `echo "$yo + 100" | bc -l`
        set w = $h
        set h = -$ww
else
        set T = ""
endif


if ($?ccc) then
        if ($trans ) then
                set xoc = `echo "$xo + ($cyyy - 5) * $F" | bc -l`
                set yoc = $yo
        else
                set xoc = $xo
                set yoc = `echo "$yo + $cyyy * $F" | bc -l`
        endif
        fig $T -W $w -H $h -o $xoc $yoc -g 0 -F $F << EOF
                csize $cs
                xname "$ccc"
EOF
endif
if ($?cc) then
        if ($trans ) then
                set xoc = `echo "$xo + ($cyy - 5) * $F" | bc -l`
                set yoc = $yo
        else
                set xoc = $xo
                set yoc = `echo "$yo + $cyy * $F" | bc -l`
        endif
        fig $T -W $w -H $h -o $xoc $yoc -g 0 -F $F << EOF
                csize $cs
                xname "$cc"
EOF
endif
if ($?c) then
        if ($trans ) then
                set xoc = `echo "$xo + ($cy - 5) * $F" | bc -l`
                set yoc = $yo
        else
                set xoc = $xo
                set yoc = `echo "$yo + $cy * $F" | bc -l`
        endif
        fig $T -W $w -H $h -o $xoc $yoc -g 0 -F $F << EOF
                csize $cs
                xname "$c"
EOF
endif

fig $T -W $w -H $h -o $xo $yo -g $g -F $F<< EOF
        x        $xx[$x]
        xscale        $xs[$x]
        xname "$xname[$x]"
EOF

if ($?f) then
        fig $f -W $w -H $h -o $xo $yo -g 0 -F $F
endif

@ lhi = $l / 2 + 1
@ s = $s * $lhi
set z = `echo "$z * $F" | bc -l`

if ($?n) then
        @ e = $s + $n * $lhi - 1
        set ee = "-e $e"
else if ($?e) then
        @ e = $e * $lhi - 1
        if( $e < $s ) then
                echo2 "${cmnd} : Invalid start or end frame number!"
                exit 1
        endif
        set ee = "-e $e"
else
        set ee = ""
endif

if ($trans) set T = "-t -1"

bcut +f -s $s $ee "$file" |\
fdrw $T -W $ww -o $xo $yo -g 0 -y $yy -n $lhi -p $p -m $ln -z $z -F $F

rm -fr /tmp/sptk-grlogsp-$uid-$$
