A Bash Audio Sweep Generator...

This is a small program as a tester for a basic sweep generator for bandwidth testing of AudioScope.sh.

This DEMO is only capable of 4KHz down to about 85Hz and back due to the low bit rate, but it is proof of concept for a much wider variant using a much higher bit rate.

The file generated is a .WAV file and is continuously sweeping until Ctrl-C is pressed.

Not tested on Linux but it should work perfectly well using the command aplay instead of OSX's afplay ...

Enjoy finding simple solutions to often very difficult problems...

Bazza...

#!/bin/bash
# sweeper.sh
# Designed around a Macbook Pro 13", OSX 10.7.5, default bash terminal.
# Issued as Public Domain, 2014, B.Walker, G0LCU.
clear
echo ""
echo "Generating the sweep.wav file, please wait a few seconds..."
echo ""
m=0
n=0
sweep_data=" ~"
sweep_text=""
# Initialise all files to zero.
> /tmp/sweeper.raw
> /tmp/sweep.raw
> /tmp/sweep.wav
# Generate the high start sound at 4KHz.
for m in $( seq 0 1 5 )
do
	printf "$sweep_data" >> /tmp/sweeper.raw
done
# Now build up the sweep_data by adding the correct byte values at the beginning first then the end last.
for n in $( seq 0 46 )
do
	# Add the correct byte at the beginning, append the file, looping a few times...
	sweep_data=' '$sweep_data
	for m in $( seq 0 1 3 )
	do
		printf "$sweep_data" >> /tmp/sweeper.raw
	done
	# Now add the correct byte at the end, append the file, looping a few times...
	sweep_data=$sweep_data'~'
	for m in $( seq 0 1 2 )
	do
		printf "$sweep_data" >> /tmp/sweeper.raw
	done
done
# Now to reverse the file sweeper.raw byte by byte using builtins and append to sweeper.raw.
# This is a little slow but it works perfectly, therefore good enough for me.
sweep_text=`cat < /tmp/sweeper.raw`
n=$[ ( ${#sweep_text} - 1 ) ]
while [ $n -ge 0 ]
do
	printf "${sweep_text:$n:1}" >> /tmp/sweeper.raw
	n=$[ ( $n - 1 ) ]
done
# Create a few seconds of sweeper from 4KHz to about 85Hz and back again...
cp /tmp/sweeper.raw /tmp/sweep.raw
cat /tmp/sweeper.raw >> /tmp/sweep.raw
# This is the required .WAV header...
printf "\x52\x49\x46\x46\x6c\xfe\x00\x00\x57\x41\x56\x45\x66\x6d\x74\x20\x10\x00\x00\x00\x01\x00\x01\x00\x40\x1f\x00\x00\x40\x1f\x00\x00\x01\x00\x08\x00\x64\x61\x74\x61\x48\xfe\x00\x00" >> /tmp/sweep.wav
cat /tmp/sweep.raw >> /tmp/sweep.wav
echo "All done, now sweeping from 4KHz to about 85 Hz and back..."
echo "Press Ctrl-C to stop..."
while true
do
	# For Linux use aplay in place of afplay.
	afplay /tmp/sweep.wav
done
# The line below will never be reached but added for fullness...
exit 0
1 Like

I tried this on cygwin and I had to replace

afplay /tmp/sweep.wav

with

cat /tmp/sweep.wav > /dev/dsp

and guess what??? it worked
I heard the sound
Can you please share more about creating .wav files and with different frequencies...also suggest a good book on this
Thanks

He has raw header values to make a WAV file of 8KHz 8-bit audio, which happens to be the format /dev/dsp uses if not told otherwise. If you used any other format than 8-bit 8khz, you'd either hear it too fast, scrambled, or pure noise.

You probably hear a tiny scratch of noise as-is when it starts, that would be the WAV header.

I believe he makes the sweep by making a small-as-possible pulse and appending it to the wav file... A bit more dead space is added to the pulse before appending it again. This moves the pulses gradually further and further apart.

Hi Corona688...

Absolutely correct, even to the start click, in this particular case using "/dev/dsp", but, it is just as easy to create a header for stereo, signed, unsigned, various bit depths and sampling speeds manually this way too. Hence the proof of concept.

However, I used only the limits of " " and "~" which are 32 and 126 decimal respectively.

The idea was to make RAW waveform generation independent of any binary at all and it works a treat.

A sinewave VFO RAW sweeper using ASCII characters only is in the pipeline. It will take some time to work out all the values but I need this facility along with a constant amplitude amplifier to do flat bandwidth tests on the AudioScope.sh...

SriniShoo...

This is a starter:-
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

EDIT:
I forgot to add that it is not a pulse but an increasing pseudo-square wave. Due to the interpolation at the default "/dev/dsp" characteristics the square wave can have a lot of sinusoidal ringing on it. It entirely depends on the system. This is from measuring and looking at the earphone output(s) with professional test gear...

Hi all...

This building block generates a RAW sinewave and will be the basis of a sinewave sweep generator.

This is also proof of concept and is issued as Public Domain. The final draft will have pseudo-variable bit rates for varying frequency ranges. This is the default mode, 8 bit depth, mono, 8000Hz sampling rate.

Enjoy finding simple solutions to often very difficult questions...

Bazza.

#!/bin/bash
# calcsine.sh
clear
> /tmp/sinefloat
> /tmp/sine.raw
> /tmp/ascii
angle=0
step=45
text=""
line=""
# Create an 8 plot floating point sinewave table, I couldn't get "scale=0" to work correctly.
while [ $angle -le 359 ]
do
	bc -l <<< "{sin=((s($angle*6.2832/360)*47)+79); print sin,\"\\n\"}" >> /tmp/sinefloat
	#angle=$[ ( $angle + $step ) ]
	angle=$((angle+step))
done
cat < /tmp/sinefloat
echo ""
# Import each flaoting point line, create an integer value, convert to ASCII and save.
while read line
do
	printf "${line/.*}\n"
	#printf \\`printf '%03o' ${line/.*}` >> /tmp/ascii
	printf \\$(printf '%03o' ${line/.*}) >> /tmp/ascii
done < /tmp/sinefloat
# Now generate a 65536 byte RAW sinewave file using ASCII only.
read text < /tmp/ascii
echo ""
echo "Sinewave text string: $text"
for n in {1..13}
do
	text=$text$text
done
printf "$text" > /tmp/sine.raw
# For /dev/dsp users.
# cat < /tmp/sine.raw > /dev/dsp
# For SOX users, note this my SOX path you will have to edit your own...
/Users/barrywalker/Downloads/sox-14.4.0/play -v 1 -r 8000 -b 8 -c 1 -e unsigned-integer /tmp/sine.raw

Results of this demo, note the "clear" command has been edited out:-

Last login: Fri Aug  8 21:28:59 on ttys000
AMIGA:barrywalker~> ./calcsine.sh
79.00000000000000000000
112.23407975339525893445
125.99999999968292776011
112.23383560221254681395
78.99965471872028531385
45.76567609721566368521
32.00000000285365015760
45.76640855076378687120

79
112
125
112
78
45
32
45

Sinewave text string: Op}pN- -

/tmp/sine.raw:

 File Size: 65.5k     Bit Rate: 64.0k
  Encoding: Unsigned PCM  
  Channels: 1 @ 8-bit    
Samplerate: 8000Hz       
Replaygain: off         
  Duration: 00:00:08.19  

In:100%  00:00:08.19 [00:00:00.00] Out:361k  [======|======] Hd:2.4 Clip:0    
Done.
AMIGA:barrywalker~> _