Chris@19
|
1 #!/bin/bash
|
Chris@19
|
2
|
Chris@19
|
3 mydir="`dirname $0`"
|
Chris@19
|
4
|
Chris@19
|
5 # Our input sweep is at 96kHz, so these factors correspond to 48, 24,
|
Chris@19
|
6 # 12, 6, 3, and 1.5kHz.
|
Chris@19
|
7
|
Chris@19
|
8 factors="2 4 8 16 32 64"
|
Chris@24
|
9 signals="sweep lengthy"
|
Chris@28
|
10 impls="zoh decimate decimate_b resample_hq resample_mq resample_lq src"
|
Chris@19
|
11
|
Chris@19
|
12 original=96000
|
Chris@19
|
13
|
Chris@26
|
14 resample="$mydir/qm-dsp-resample/resample"
|
Chris@23
|
15 decimate="$mydir/qm-dsp-decimate/decimate"
|
Chris@28
|
16 decimate_b="$mydir/qm-dsp-decimate/decimate-b"
|
Chris@23
|
17
|
Chris@24
|
18 indir="$mydir"/testsignals
|
Chris@24
|
19
|
Chris@24
|
20 outdir="$mydir"/out
|
Chris@24
|
21 mkdir -p "$outdir"
|
Chris@24
|
22
|
Chris@23
|
23 if [ ! -x "$resample" ]; then
|
Chris@26
|
24 echo "Program $resample not found: make not run, or make failed?"
|
Chris@23
|
25 exit 1
|
Chris@23
|
26 fi
|
Chris@23
|
27
|
Chris@23
|
28 if [ ! -x "$decimate" ]; then
|
Chris@26
|
29 echo "Program $decimate not found: make not run, or make failed?"
|
Chris@23
|
30 exit 1
|
Chris@23
|
31 fi
|
Chris@23
|
32
|
Chris@28
|
33 if [ ! -x "$decimate_b" ]; then
|
Chris@28
|
34 echo "Program $decimate_b not found: make not run, or make failed?"
|
Chris@28
|
35 exit 1
|
Chris@28
|
36 fi
|
Chris@28
|
37
|
Chris@23
|
38 if ! sndfile-resample 2>&1 | grep -q samplerate ; then
|
Chris@23
|
39 echo "Program sndfile-resample not found in PATH?"
|
Chris@23
|
40 exit 1
|
Chris@23
|
41 fi
|
Chris@23
|
42
|
Chris@24
|
43 if ! sndfile-info 2>&1 | grep -q libsndfile ; then
|
Chris@24
|
44 echo "Program sndfile-info not found in PATH?"
|
Chris@24
|
45 exit 1
|
Chris@24
|
46 fi
|
Chris@24
|
47
|
Chris@19
|
48 do_src() {
|
Chris@19
|
49 factor="$1"
|
Chris@19
|
50 infile="$2"
|
Chris@19
|
51 outfile="$3"
|
Chris@22
|
52 time sndfile-resample -to "$(($original/$factor))" "$infile" "$outfile"
|
Chris@19
|
53 }
|
Chris@19
|
54
|
Chris@24
|
55 do_zoh() {
|
Chris@19
|
56 factor="$1"
|
Chris@19
|
57 infile="$2"
|
Chris@19
|
58 outfile="$3"
|
Chris@24
|
59 time sndfile-resample -to "$(($original/$factor))" -c 3 "$infile" "$outfile"
|
Chris@19
|
60 }
|
Chris@19
|
61
|
Chris@20
|
62 do_resample_hq() {
|
Chris@19
|
63 factor="$1"
|
Chris@19
|
64 infile="$2"
|
Chris@19
|
65 outfile="$3"
|
Chris@23
|
66 time "$resample" --snr 100 --bandwidth 0.02 --to "$(($original/$factor))" "$infile" "$outfile"
|
Chris@20
|
67 }
|
Chris@20
|
68
|
Chris@20
|
69 do_resample_mq() {
|
Chris@20
|
70 factor="$1"
|
Chris@20
|
71 infile="$2"
|
Chris@20
|
72 outfile="$3"
|
Chris@23
|
73 time "$resample" --snr 70 --bandwidth 0.03 --to "$(($original/$factor))" "$infile" "$outfile"
|
Chris@20
|
74 }
|
Chris@20
|
75
|
Chris@20
|
76 do_resample_lq() {
|
Chris@20
|
77 factor="$1"
|
Chris@20
|
78 infile="$2"
|
Chris@20
|
79 outfile="$3"
|
Chris@23
|
80 time "$resample" --snr 50 --bandwidth 0.05 --to "$(($original/$factor))" "$infile" "$outfile"
|
Chris@19
|
81 }
|
Chris@19
|
82
|
Chris@21
|
83 decimate_twice() {
|
Chris@21
|
84 first="$1"
|
Chris@21
|
85 second="$2"
|
Chris@21
|
86 infile="$3"
|
Chris@21
|
87 outfile="$4"
|
Chris@23
|
88 "$decimate" --by "$first" "$infile" "$outfile".tmp
|
Chris@23
|
89 "$decimate" --by "$second" "$outfile".tmp "$outfile"
|
Chris@21
|
90 rm "$outfile".tmp
|
Chris@21
|
91 }
|
Chris@21
|
92
|
Chris@19
|
93 do_decimate() {
|
Chris@19
|
94 factor="$1"
|
Chris@19
|
95 infile="$2"
|
Chris@19
|
96 outfile="$3"
|
Chris@22
|
97 time case "$factor" in
|
Chris@21
|
98 16) decimate_twice 4 4 "$infile" "$outfile";;
|
Chris@21
|
99 32) decimate_twice 8 4 "$infile" "$outfile";;
|
Chris@21
|
100 64) decimate_twice 8 8 "$infile" "$outfile";;
|
Chris@23
|
101 *) "$decimate" --by "$factor" "$infile" "$outfile";;
|
Chris@21
|
102 esac
|
Chris@19
|
103 }
|
Chris@19
|
104
|
Chris@28
|
105 do_decimate_b() {
|
Chris@28
|
106 factor="$1"
|
Chris@28
|
107 infile="$2"
|
Chris@28
|
108 outfile="$3"
|
Chris@28
|
109 time "$decimate_b" --by "$factor" "$infile" "$outfile"
|
Chris@28
|
110 }
|
Chris@28
|
111
|
Chris@24
|
112 for s in $signals; do
|
Chris@24
|
113 for f in $factors; do
|
Chris@24
|
114 for impl in $impls; do
|
Chris@24
|
115 echo "signal $s, factor $f, impl $impl..."
|
Chris@24
|
116 stem="$s"_"$f"_"$impl"
|
Chris@24
|
117 do_$impl "$f" "$indir"/*"$s"*.wav "$outdir"/"$stem".wav > "$outdir"/"$stem".log 2>&1
|
Chris@24
|
118 done
|
Chris@19
|
119 done
|
Chris@19
|
120 done
|
Chris@19
|
121
|
Chris@24
|
122 # timings
|
Chris@24
|
123
|
Chris@24
|
124 lengthyframes=`sndfile-info testsignals/sine-lengthy.wav | grep '^Frames' | awk '{ print $3; }'`
|
Chris@24
|
125
|
Chris@24
|
126 for f in $factors; do
|
Chris@24
|
127 echo "For $lengthyframes input frames, decimation factor $f..."
|
Chris@24
|
128 for log in out/lengthy_"$f"_*.log; do
|
Chris@24
|
129 impl=`basename "$log" .log | sed 's/^.*lengthy_[0-9]*_//'`
|
Chris@24
|
130 seconds=`grep '^real' "$log" | tail -1 | sed 's/^.*m\([0-9.]*\)s$/\1/'`
|
Chris@24
|
131 fps=`echo "$lengthyframes $seconds / p" | dc`
|
Chris@24
|
132 fps=`printf "%11d" "$fps"`
|
Chris@24
|
133 echo "$fps fps [$seconds s]: $impl"
|
Chris@24
|
134 done | sort -rn
|
Chris@24
|
135 echo
|
Chris@24
|
136 done
|
Chris@24
|
137
|
Chris@24
|
138 for impl in $impls; do
|
Chris@24
|
139 echo "For $lengthyframes input frames, implementation $impl..."
|
Chris@24
|
140 for log in out/lengthy_*_"$impl".log; do
|
Chris@24
|
141 f=`basename "$log" .log | sed 's/^.*lengthy_//' | sed 's/_.*//'`
|
Chris@24
|
142 seconds=`grep '^real' "$log" | tail -1 | sed 's/^.*m\([0-9.]*\)s$/\1/'`
|
Chris@24
|
143 fps=`echo "$lengthyframes $seconds / p" | dc`
|
Chris@24
|
144 fps=`printf "%11d" "$fps"`
|
Chris@24
|
145 echo "$fps fps [$seconds s]: factor $f"
|
Chris@24
|
146 done | sort -rn
|
Chris@24
|
147 echo
|
Chris@24
|
148 done
|