Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- if [ ! $# -eq 4 ]
- then
- echo "Incorrect number of arguments:" $# "/ 4"
- exit
- fi
- error=0
- if [ ! -f $1 ]
- then
- echo "Log file" $1 "not found"
- error=1
- fi
- if [ ! -f $2 ]
- then
- echo "Eeg file" $2 "not found"
- error=1
- fi
- if [ ! -f $3 ]
- then
- echo "Audio file" $3 "not found"
- error=1
- fi
- if [ $error -eq 1 ]
- then
- echo "At least one file doesn't exist, goodbye"
- exit
- fi
- if [ ! -r $1 ]
- then
- echo "Log file" $1 "not readable"
- error=1
- fi
- if [ ! -r $2 ]
- then
- echo "Eeg file" $2 "not readable"
- error=1
- fi
- if [ ! -r $3 ]
- then
- echo "Audio file" $3 "not readable"
- error=1
- fi
- if [ $error -eq 1 ]
- then
- echo "At least one file is unreadable, goodbye"
- exit 0
- fi
- if [ ! -d $4 ]
- then
- echo "Directory $4 doesnt exist, trying to create it"
- mkdir -p $4
- if [ $? -ne 0 ]
- then
- echo "Couldn't create directory $4, bye"
- exit
- fi
- fi
- if [ ! -w $4 ]
- then
- echo "No write permissions for directory $4, bye"
- exit
- fi
- if [ "${EEG_TZ}" == "" ]
- then
- EEG_TZ="UTC"
- fi
- eegDate=$(grep -E '^<StartRecordingDate>' "$2" | sed -E 's_.*>(.*)[.](.*)[.](.*)<.*_\3-\2-\1_')
- eegFullHour=$(grep -E '^<StartRecordingTime>' "$2" | sed -E 's_.*>(.*)<.*_\1_')
- if [ $eegDate = "" -o $eegFullHour = "" ]
- then
- echo "Eeg start not found, bye"
- fi
- eegS=$(echo $eegDate $eegFullHour)
- eegStart=$(date --date "$eegS" +%s.%N | sed -E 's_0+$__')
- hz=$(grep -E '^<SamplingRate>' $2 | grep -oE '[0-9]+')
- duplicates=$(grep -oE '^[^ ]+' timetable.log | sort | uniq -d)
- # TODO check if not empty
- wavStart=$(grep -E '^beep' $1 | grep -oE '[0-9.]+$')
- #TODO check if eeg/wav start is empty
- tickCount=$(grep -cE '^<tick>' $2)
- firstTick=$(grep -nE '^<tick>' eeg.xml | head -n 1 | cut -d':' -f1)
- echo "ticks = $tickCount"
- eegDuration=$(echo "$tickCount / $hz" | bc -l)
- eegEnd=$(echo "$eegStart + $eegDuration" | bc)
- wavDuration=$(sox $3 -n stat 2>&1 | grep '^Length' | sed -E 's_.*[[:space:]]([.0-9]+$)_\1_')
- wavEnd=$(echo "$wavStart + $wavDuration" | bc)
- echo "[file] [start] [end] [duration]"
- echo "eeg $eegStart $eegEnd $eegDuration"
- echo "wav $wavStart $wavEnd $wavDuration"
- st=$(cat $1)
- IFS=$'\n'
- for x in $st; do
- name=$(echo $x | grep -oE '^[^ ]+')
- # in case someone decides to put multiple spaces
- durationExpr=$(echo $x | sed -E 's_^.*[[:space:]]+([0-9.]+)[[:space:]]([0-9.]+)$_\2-\1_')
- # in unix time
- uStart=$(echo $durationExpr | cut -d'-' -f2)
- uEnd=$(echo $durationExpr | cut -d'-' -f1)
- duration=$(echo $durationExpr | bc | sed -E 's_^[.]_0._')
- pissOff="0"
- fail=$(echo "$duration < 0.2" | bc)
- if [ $fail -eq "1" ]
- then
- echo "Duration for $name is too short ($duration)"
- pissOff="1"
- fi
- fail=$(echo "$uStart < $eegStart" | bc)
- if [ $fail -eq "1" ]
- then
- echo "Start of $name is before eeg start"
- pissOff="1"
- fi
- fail=$(echo "$uStart < $wavStart" | bc)
- if [ $fail -eq "1" ]
- then
- echo "Start of $name is before wav start"
- pissOff="1"
- fi
- fail=$(echo "$uEnd > $eegEnd" | bc)
- if [ $fail -eq "1" ]
- then
- echo "End of $name is after eeg end"
- pissOff="1"
- fi
- fail=$(echo "$uEnd > $wavEnd" | bc)
- if [ $fail -eq "1" ]
- then
- echo "End of $name is after wav end"
- pissOff="1"
- fi
- if [ $pissOff -eq "1" ]
- then
- echo "At least one error encountered with $name, skipping"
- continue
- fi
- audioFileName="${4}/${name}_lar.wav"
- audioStart=$(echo "$uStart-$wavStart" | bc)
- #echo $audioFileName
- sox "$3" "$audioFileName" trim $audioStart $duration
- eegFileName="${4}/${name}_eeg.xml"
- startTick=$(echo "($uStart - $eegStart) * $hz" | bc | awk -F'.' '{print $1}')
- endTick=$(echo "($uEnd - $eegStart) * $hz" | bc | awk -F'.' '{print $1}')
- tickDiff=$(echo "$endTick - $startTick + 1" | bc)
- tailArg=$((endTick + firstTick))
- #echo "$startTick $endTick $tailArg"
- head -n $tailArg $2 | tail -n $tickDiff > $eegFileName
- echo "$name - done"
- done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement