hamster Posted May 9, 2014 Report Share Posted May 9, 2014 I'm working on an audio chirp sonar (http://en.wikipedia.org/wiki/Chirp), 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 More sharing options...
offroad Posted May 9, 2014 Report Share Posted May 9, 2014 Interesting!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 More sharing options...
Jack Gassett Posted May 12, 2014 Report Share Posted May 12, 2014 Ohhh, that looks cool, can't wait to see what you come up with. Jack. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.