From DRC
#!/bin/sh
# Automatic measuring script
# Copyright (C) 2002-2005 Denis Sbragion
# Copyright (C) 2005 Chris Birkinshaw
# This program may be freely redistributed under the terms of
# the GNU GPL and is provided to you as is, without any warranty
# of any kind. Please read the file "COPYING" for details.
# Useful programs
ECHO="echo"
RM="rm"
GLSWEEP="./glsweep"
SOX="sox"
LSCONV="./lsconv"
APLAY="aplay"
ARECORD="arecord"
SYNC="sync"
SLEEP="sleep"
ALSAPLAYER=alsaplayer
# Default parameters
TMP="/tmp"
AMPLITUDE="0.5"
LEADIN="0.05"
LEADOUT="0.005"
MINGAIN="0.1"
DLSTART="0.9"
$ECHO
$ECHO "Automatic measuring script."
$ECHO "Copyright (C) 2002-2005 Denis Sbragion"
$ECHO "Copyright (C) 2005 Chris Birkinshaw"
$ECHO
$ECHO "This program may be freely redistributed under the terms of"
$ECHO "the GNU GPL and is provided to you as is, without any warranty"
$ECHO "of any kind. Please read the file "COPYING" for details."
$ECHO
# Command line check
if [ "$#" != "9" ]; then
$ECHO "Usage: measure bits rate startf endf lslen lssil indev outdev impfile"
$ECHO
$ECHO " bits: measuring bits (16 or 24)"
$ECHO " rate: sample rate"
$ECHO " startf: sweep start frequency in Hz"
$ECHO " endf: sweep end frequency in Hz"
$ECHO " lslen: log sweep length in seconds"
$ECHO " lssil: log sweep silence length in seconds"
$ECHO " indev: ALSA input device"
$ECHO " outdev: JACK output device"
$ECHO " impfile: impulse response output file"
$ECHO
$ECHO "example: measurejack 16 44100 5 21000 45 2 plughw brutefir:input-0,brutefir:input-1 impulse.pcm"
$ECHO
$ECHO "Tip: jackd must not be using the recording channels of your soundcard, i.e. launch with the -P option"
$ECHO
exit 0
fi
# Get command line parameters
BITS="$1"
RATE="$2"
STARTF="$3"
ENDF="$4"
LSLEN="$5"
LSSIL="$6"
INDEV="$7"
OUTDEV="$8"
IMPFILE="$9"
# Check bits to use
if [ "$BITS" == "24" ]; then
SOXFMT="-sl"
ARECORDFMT="S32_LE"
else
SOXFMT="-sw"
ARECORDFMT="S16_LE"
fi
# Generate the log sweep
$GLSWEEP $RATE $AMPLITUDE $STARTF $ENDF $LSLEN $LSSIL $LEADIN $LEADOUT ${TMP}/msrawsweep.pcm ${TMP}/msinverse.pcm
# Convert to WAV file
$ECHO "Converting sweep to play format..."
$SOX -t raw -r $RATE -c 1 -fl ${TMP}/msrawsweep.pcm -t wav -c 2 $SOXFMT ${TMP}/msplaysweep.wav
$RM ${TMP}/msrawsweep.pcm
# Filesystem sync
$ECHO "Waiting 5 seconds for filesystem sync..."
$SYNC
$SLEEP 5
# Record the sweep
$ECHO "Sweep recording."
$ECHO "Measuring channel: left. Reference channel: right."
$SLEEP 1
RLEN=$(( $LSLEN + $LSSIL * 2 ))
$ALSAPLAYER -o jack -d "$OUTDEV" -i text ${TMP}/msplaysweep.wav &
$ARECORD -D $INDEV -t wav -r $RATE -f $ARECORDFMT -c 2 -d $RLEN ${TMP}/msrecsweep.wav
# Remove sweep file
$RM ${TMP}/msplaysweep.wav
# Convert sweep file
$ECHO "Sweep file extraction (left channel)..."
$SOX ${TMP}/msrecsweep.wav -t raw -r $RATE -fl -c 1 ${TMP}/mssweep.pcm avg -l
# Extract reference file
$ECHO "Reference file extraction (right channel)..."
$SOX ${TMP}/msrecsweep.wav -t raw -r $RATE -fl -c 1 ${TMP}/msrefer.pcm avg -r
# Remove recorded file
$RM ${TMP}/msrecsweep.wav
# Print stats
$ECHO
$ECHO "Measuring channel (left) stats..."
$ECHO
$SOX -t raw -r $RATE -fl -c 1 ${TMP}/mssweep.pcm -e stat
$ECHO
$ECHO "Reference channel (right) stats..."
$ECHO
$SOX -t raw -r $RATE -fl -c 1 ${TMP}/msrefer.pcm -e stat
# Extract the impulse response
$LSCONV ${TMP}/mssweep.pcm ${TMP}/msinverse.pcm $IMPFILE ${TMP}/msrefer.pcm $MINGAIN $DLSTART
# Impulse response stats
$ECHO
$ECHO "Impulse response stats..."
$ECHO
$SOX -t raw -r $RATE -fl -c1 $IMPFILE -e stat
$ECHO "Temporary file cleanup..."
$RM ${TMP}/mssweep.pcm
$RM ${TMP}/msrefer.pcm
$RM ${TMP}/msinverse.pcm
$ECHO "Impulse response measurement completed."