Audio chirp sonar...


Recommended Posts

I'm working on an audio chirp sonar (, and so far my laptop tests seem to look pretty hopeful (see image below).




The graph is the correlation of the middle 512 words a 1024 sample chirp (about 23ms), when the sample was played on a laptop while recording at the same time.


Here's the 'C' code to generate the chirp file (as out.pcm - play with "aplay -r 44100 -c1 -f S16 out.pcm" on Linux) and also process a 44100 stereo 16-bit stereo audio file (WAV format works), in case you want to have a play.

#include <math.h>#include <stdio.h> short chirp[1024];short data[1024*1024*10]; long long match(short *s, short *c, int l){  int i;  long long total = 0;  for(i = 0; i < l; i++) {    total += s[i]*c[i];  }  if(total < 0) return -total;  return total;} int main(int argc, char *argv[]){  int i, samples;  double f0 = 100.0;  double k  = 400.0;  FILE *f;  for(i =0; i < 1024; i++) {    double angle;    double t = i/1024.0;    angle = f0*t + k * 0.5 * t * t;    chirp[i] = (short)(sin(angle)*32767);  }   if(argc == 1) {    printf("Crating out.pcm\r\n");    f = fopen("out.pcm","wb");    fwrite(chirp,sizeof(short),1024,f);    fclose(f);    return 0;  }   f = fopen(argv[1],"rb");  if(f == NULL) {    printf("Unable to open file \r\n");    return 0;  }  for(i = 0;i < 10*1024*1024; i++) {    short samples[2];    if(fread(samples,sizeof(samples),1,f) != 1)      break;    data[i] = samples[0]/2 + samples[1]/2;  }  fclose(f);  printf("%i samples read\r\n",i);  samples = i;   for(i = 0; i < samples-512;i++)     printf("%4i  %lli\r\n",i,match(data+i,chirp+256,512));   return 0;}

It is a pretty good fit for FPGA - each sample requires 512 MACs, so to process a 44100 S/s stream needs about 22.5 MegaMACs (nice and easy for a single DSP block, but too much for an Arduino).

Link to comment
Share on other sites


This is definitely a job where an FPGA can provide "hardware acceleration".

Note that audio speakers are designed for a "pink" spectrum, not white. A linear chirp has equal low- and high frequency content, so it is possible to damage speakers (done that myself via some OFDM-via-audio experiment that wasn't particularly ear-friendly).

Carrier frequency offset can be a problem. Consumer devices aren't too strict about the audio rate. Not an issue if transmitter and receiver are on the same board / reference clock, though.

Link to comment
Share on other sites


This topic is now archived and is closed to further replies.