/programy/C/ix86/signals/alsa/sonar/sonar.c |
---|
189,7 → 189,7 |
for (n=0;n<=chirp_samples;n++) |
{ |
t = (double) n / (double)rate; |
pole[n] = (short) floor( (0.35875 - 0.48829*cos(2*M_PI*t*1/Tw) + 0.14128*cos(2*M_PI*2*t*1/Tw) - 0.01168*cos(2*M_PI*3*t*1/Tw))*maxval*sin(2*M_PI*(t)*(f0+(k/2)*(t))) ); // ping signal generation formula |
pole[n] = (short) floor( (0.35875 - 0.48829*cos(2*M_PI*t*1/Tw) + 0.14128*cos(2*M_PI*2*t*1/Tw) - 0.01168*cos(2*M_PI*3*t*1/Tw))*maxval*sin(2*M_PI*(t)*(f0+(k/2)*(t))) ); // signal generation formula |
} |
return (chirp_samples); // return count of samples in ping |
} |
196,15 → 196,15 |
int main(int argc, char *argv[]) |
{ |
snd_pcm_t *playback_handle, *capture_handle; //variables for driver handlers |
snd_pcm_t *playback_handle, *capture_handle; |
int err; |
snd_pcm_hw_params_t *hwparams; // hardware and software parameters arrays |
snd_pcm_hw_params_t *hwparams; |
snd_pcm_sw_params_t *swparams; |
long int *correlationl, *correlationr; // pointers to arrays where correlation will be stored |
long int *correlationl, *correlationr; |
float k; |
int *L_signal, *R_signal; // array of captured data from left and right channel |
short *chirp, *signal; // chirp and soundcard buffer output data |
int *L_signal, *R_signal; |
short *chirp, *signal; |
unsigned int i,j,m,n; |
unsigned int map_size; //number of points in echo map. |
long int l,r; // store correlation at strict time |
296,7 → 296,7 |
else printf("Transmitting all samples of chirp\n"); |
//-------------- |
while ( snd_pcm_avail_update(capture_handle) < period_size) // wait until one period of data is transmitted |
while ( snd_pcm_avail_update(capture_handle) < period_size) // wait for one period of data |
{ |
usleep(1000); |
printf("."); |
340,7 → 340,7 |
} |
printf("Writing output files\n"); |
out=fopen("/tmp/sonar.txt","w"); // save captured and computed correlation data for both channels |
out=fopen("/tmp/sonar.txt","w"); |
for (i=0; i <= (period_size - 1); i++) |
{ |
fprintf(out,"%2.3f %6d %6d %9ld %9ld\n",i*k, L_signal[i], R_signal[i], correlationl[i], correlationr[i]); |
347,7 → 347,7 |
} |
fclose(out); |
out=fopen("/tmp/chirp.txt","w"); // save chirp data to someone who want it |
out=fopen("/tmp/chirp.txt","w"); |
for (i=0; i <= (chirp_size - 1); i++) |
{ |
fprintf(out,"%6d %6d\n", i, chirp[i]); |
356,7 → 356,6 |
printf("Job done.\n"); |
//free all arrays |
free(correlationl); |
free(correlationr); |
free(L_signal); |
364,7 → 363,7 |
free(chirp); |
free(signal); |
snd_pcm_close(playback_handle); // free driver handlers |
snd_pcm_close(playback_handle); |
snd_pcm_close(capture_handle); |
return 0; |
} |
/programy/C/ix86/signals/alsa/sonar/sonar.html |
---|
39,23 → 39,16 |
<h1>Jednoduchý sonar ze zvukovky<br/>Jakub Kákona (kaklik@mlab.cz)</h1> |
<p> |
Program je demonstrací základních funkcí audio systému ALSA <a href="http://www.alsa-project.org/">http://www.alsa-project.org/</a>. Konkrétně je ukázkou přístupu k zařízení Playback a Capture. A zároveň jednoduchým prostředkem k prozkoumání akustických vlastností různých materiálů pouze pomocí svého počítače. :) |
Program je demonstrací základních funkcí zvukového systému ALSA <a href="http://www.alsa-project.org/">http://www.alsa-project.org/</a>. Konkrétně je ukázkou přístupu k zařízení Playback a Capture. |
</p> |
<img src="podlaha.png" alt="Obrázek aktivního sonaru"/> |
<h2>Závislosti</h2> |
<p> |
Program je napsán pro OS Linux a testován byl konkrétně na Ubuntu. |
</p> |
<ul><li>Alsalib</li></ul> |
<ul> |
<li>Linux</li> |
<li>libasound2</li> |
</ul> |
<p> |
K přeložení programu je tedy nutné mít nainstalované vývojové knihovny ALSA (libasound2-dev). Pokud máme splněné všechny závislosti, tak lze program přeložit pomocí gcc s následujícími parametry: |
K přeložení programu je tedy nutné mít nainstalované vývojové knihovny ALSA (alsalib-dev). Pokud máme splněné všechny závislosti, tak lze program přeložit pomocí gcc s následujícími parametry: |
</p> |
<pre><code> |
69,22 → 62,12 |
<h2>Výstup</h2> |
<p> |
Navzorkovaná a vypočtená data jsou ukládána do textových souborů v adresáři /tmp/ ze kterého je pak možné je vykreslovat pomocí <a href="plot.gp">skriptu</a> Gnuplotu. |
V horní části grafu je vysílaný signál. Uprostřed signál navzorkovaný mikrofony a dole výstup po korelaci nasnímaného signálu s odeslaným. |
Navzorkovaná a vypočtená data jsou ukládána do textových souborů v adresáři /tmp/ ze kterého je pak možné je vykreslovat pomocí <a href="plot.gp">skriptu</a> Gnuplotu |
</p> |
<pre><code> |
~#gnuplot |
> load "plot.gp" |
</code></pre> |
<p> |
Skrip si sám cyklicky spouští program "sonar" a překresluje graf. Lze tak experimentovat s odrazy od různých překážek a třeba i pokračovat ve vývoji kódu. |
</p> |
<h2>Zpracování dat</h2> |
<p> |
Zpracovaní používá pouze metodu <a href="http://en.wikipedia.org/wiki/Cross-correlation">křížové korelace</a> kterou se porovnají snímané signály vůči původnímu odeslanému pingu. Tím jsou ve výsledku velice zvýrazněna odražená echa. Celý algoritmus jsou následující dva cykly: |
Na závěr se s každým navzorkovaným polem dat z mikrofonů pomocí algoritmu <a href="http://en.wikipedia.org/wiki/Cross-correlation">křížové korelace</a> porovnají snímané signály vůči původnímu odeslanému pingu. Tím jsou v signálu velice zvýrazněna odražená echa. Celý algoritmus jsou následující dva cykly: |
</p> |
<pre><code> |