diff options
| author | Author Name <[email protected]> | 2023-07-07 12:20:59 +0930 |
|---|---|---|
| committer | David Rowe <[email protected]> | 2023-07-07 12:29:06 +0930 |
| commit | ac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch) | |
| tree | a2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /script/test_2020x.sh | |
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'script/test_2020x.sh')
| -rwxr-xr-x | script/test_2020x.sh | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/script/test_2020x.sh b/script/test_2020x.sh new file mode 100755 index 0000000..541091c --- /dev/null +++ b/script/test_2020x.sh @@ -0,0 +1,166 @@ +#!/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 "<tr>" + echo "<td><a href=\"${fn}\">${serial}</a></td><td>ssb</td><td></td><td></td><td>${channel}</td><td>${snr}</td>" + echo "</tr>" + 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 "<tr>" + echo "<td><a href=\"${fn}\">${serial}</a></td><td>${mode}</td><td>${clip_html}</td><td>${indopt_html}</td><td>${channel}</td><td>${snr}</td>" + echo "</tr>" + 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 "<html><table>" +echo "<tr><th>Serial</th><th>Mode</th><th>Clip</th><th>index_opt</th><th>Channel</th><th>SNR (dB)</th></tr>" + +# 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 |
