#!/bin/bash -x
# test_2020x.sh
# David Rowe Feb 2022
#
# Script to support testing experimental 2020A and 2020B modes and 700E control.
CODEC2_PATH=$HOME/codec2
PATH=$PATH:$CODEC2_PATH/build_linux/src:$CODEC2_PATH/build_linux/misc
FADING_DIR=$CODEC2_PATH/build_linux/unittest
No_AWGN=-20
No_AWGN_LOW=-17
No_Multipath=-25
serial=0
compressor_gain=6
# Approximation of Hilbert clipper analog compressor
function analog_compressor {
input_file=$1
output_file=$2
gain=$3
cat $input_file | ch - - 2>/dev/null | \
ch - - --No -100 --clip 16384 --gain $gain 2>/dev/null | \
# final line prints peak and CPAPR for SSB
ch - - --clip 16384 |
# manually adjusted to get similar peak levels for SSB and FreeDV
sox -t .s16 -r 8000 -c 1 -v 0.85 - -t .s16 $output_file
}
function run_sim_ssb() {
fullfile=$1
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
channel=$2
No=-100
if [ "$channel" == "awgn" ]; then
channel_opt=""
No=$No_AWGN
fi
if [ "$channel" == "awgnlow" ]; then
channel_opt=""
No=$No_AWGN_LOW
fi
if [ "$channel" == "mpp" ] || [ "$channel" == "mpd" ]; then
channel_opt='--'${channel}
No=$No_Multipath
fi
fn=${filename}_ssb_${channel}.wav
analog_compressor ${fullfile} ${filename}_ssb.raw ${compressor_gain}
tmp=$(mktemp)
ch ${filename}_ssb.raw $tmp --No $No ${channel_opt} --fading_dir ${FADING_DIR} 2>t.txt
cat $tmp | sox -t .s16 -r 8000 -c 1 - ${fn} trim 0 6
snr=$(cat t.txt | grep "SNR3k(dB):" | tr -s ' ' | cut -d' ' -f3)
echo "
"
echo "| ${serial} | ssb | | | ${channel} | ${snr} | "
echo "
"
serial=$((serial+1))
}
function run_sim() {
fullfile=$1
filename=$(basename -- "$fullfile")
extension="${filename##*.}"
filename="${filename%.*}"
mode=$2
if [ "$mode" == "700E" ] || [ "$mode" == "700D" ]; then
rateHz=8000
else
rateHz=16000
fi
clip=$3
if [ "$clip" == "clip" ]; then
clipflag=1
clip_html="yes"
else
clipflag=0
clip_html="no"
fi
channel=$4
No=-100
if [ "$channel" == "awgn" ]; then
channel_opt=""
No=$No_AWGN
fi
if [ "$channel" == "awgnlow" ]; then
channel_opt=""
No=$No_AWGN_LOW
fi
if [ "$channel" == "mpp" ] || [ "$channel" == "mpd" ]; then
channel_opt='--'${channel}
No=$No_Multipath
fi
indopt=$5
indopt_flag=""
indopt_html="no"
indopt_str=""
if [ "$indopt" == "indopt" ]; then
indopt_flag="--indopt 1"
indopt_str="_indopt"
indopt_html="yes"
fi
if [ "$indopt" == "no_indopt" ]; then
indopt_flag="--indopt 0"
indopt_str="_no_indopt"
fi
fn=${filename}_${mode}_${clip}_${channel}${indopt_str}.wav
tmp=$(mktemp)
# note we let ch finish to get SNR stats (trim at end of sox causes an early termination)
freedv_tx ${mode} ${fullfile} - --clip ${clipflag} ${indopt_flag} | \
ch - $tmp --No $No ${channel_opt} --fading_dir ${FADING_DIR} 2>t.txt
freedv_rx ${mode} ${indopt_flag} $tmp - | \
sox -t .s16 -r ${rateHz} -c 1 - ${fn} trim 0 6
snr=$(cat t.txt | grep "SNR3k(dB):" | tr -s ' ' | cut -d' ' -f3)
echo ""
echo "| ${serial} | ${mode} | ${clip_html} | ${indopt_html} | ${channel} | ${snr} | "
echo "
"
serial=$((serial+1))
}
# convert speech input file to format we need
SPEECH_IN_16k_WAV=~/Downloads/speech_orig_16k.wav
SPEECH_IN_16k_RAW=speech_orig_16k.raw
SPEECH_IN_8k_RAW=speech_orig_8k.raw
sox $SPEECH_IN_16k_WAV -t .s16 $SPEECH_IN_16k_RAW
sox $SPEECH_IN_16k_WAV -t .s16 -r 8000 $SPEECH_IN_8k_RAW
echo ""
echo "| Serial | Mode | Clip | index_opt | Channel | SNR (dB) |
"
# run simulations
run_sim_ssb $SPEECH_IN_8k_RAW awgn
run_sim_ssb $SPEECH_IN_8k_RAW mpp
run_sim_ssb $SPEECH_IN_8k_RAW mpd
run_sim $SPEECH_IN_16k_RAW 2020 noclip clean
run_sim $SPEECH_IN_8k_RAW 700E clip clean
run_sim $SPEECH_IN_16k_RAW 2020 noclip awgn
run_sim $SPEECH_IN_16k_RAW 2020 noclip mpp
run_sim $SPEECH_IN_16k_RAW 2020 noclip mpd
run_sim $SPEECH_IN_16k_RAW 2020 clip awgn
run_sim $SPEECH_IN_16k_RAW 2020 clip mpp
run_sim $SPEECH_IN_16k_RAW 2020 clip mpd
run_sim $SPEECH_IN_16k_RAW 2020B clip awgn indopt
run_sim $SPEECH_IN_16k_RAW 2020B clip mpp indopt
run_sim $SPEECH_IN_16k_RAW 2020B clip mpp no_indopt
run_sim $SPEECH_IN_16k_RAW 2020B clip mpd indopt
run_sim $SPEECH_IN_16k_RAW 2020B clip mpd no_indopt
run_sim $SPEECH_IN_8k_RAW 700E clip awgn
run_sim $SPEECH_IN_8k_RAW 700E clip mpp
run_sim $SPEECH_IN_8k_RAW 700E clip mpd
# Low SNR samples
run_sim_ssb $SPEECH_IN_8k_RAW awgnlow
run_sim $SPEECH_IN_8k_RAW 700E clip awgnlow
run_sim $SPEECH_IN_16k_RAW 2020 clip awgnlow
run_sim $SPEECH_IN_16k_RAW 2020A clip awgnlow indopt
exit