Subversion Repositories svnkaklik

Compare Revisions

Ignore whitespace Rev 562 → Rev 563

/programy/C/ix86/echo/SW/sonar/src/sonar.c
16,6 → 16,7
#include <alsa/asoundlib.h>
#include <sys/time.h>
#include <math.h>
#include <fftw3.h>
 
#define SOUND_SPEED 340.0 // sound speed in air in metrs per second
#define MAX_RANGE 10.0 // maximal working radius in meters
143,7 → 144,7
printf("Unable to determine current swparams for playback: %s\n", snd_strerror(err));
return err;
}
// start the transfer when the buffer is almost full: never fou our case
// start the transfer when the buffer is almost full: never fou our case
err = snd_pcm_sw_params_set_start_threshold(handle, swparams, 2 * buffer_size);
if (err < 0)
{
203,10 → 204,17
long int *correlationl, *correlationr;
int *L_signal, *R_signal;
short *chirp, *signal;
float *chirp_spect, *echo_spect;
unsigned int i,j,m,n;
unsigned int delay[10]; //store delay of signifed correlation
unsigned int delayl[10],delayr[10]; //store delay of signifed correlation
long int l,r; // store correlation at strict time
double df; //frequency resolution
unsigned int frequency_bins; // number of output frequency bins
 
double *inchirp;
fftw_complex *outchirp;
fftw_plan fft_plan_chirp;
 
FILE *out;
 
snd_pcm_hw_params_alloca(&hwparams);
250,12 → 258,12
exit(EXIT_FAILURE);
}
 
/* err = snd_pcm_link( capture_handle, playback_handle); //link capture and playback together
if (err < 0)
{
printf("Device linking error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}*/
/* err = snd_pcm_link( capture_handle, playback_handle); //link capture and playback together
if (err < 0)
{
printf("Device linking error: %s\n", snd_strerror(err));
exit(EXIT_FAILURE);
}*/
 
correlationl = malloc(period_size * sizeof(long int)); //array to store correlation curve
correlationr = malloc(period_size * sizeof(long int)); //array to store correlation curve
267,6 → 275,22
// generate ping pattern
chirp_size = linear_windowed_chirp(chirp);
 
frequency_bins = chirp_size / 2 + 1;
df = (double) rate / (double) chirp_size;
chirp_spect = malloc(frequency_bins * sizeof(float));
echo_spect = malloc(frequency_bins * sizeof(float));
 
inchirp = fftw_malloc(sizeof(double) * chirp_size); // allocate input array for FFT
outchirp = fftw_malloc(sizeof(fftw_complex) * frequency_bins);
 
fft_plan_chirp = fftw_plan_dft_r2c_1d(chirp_size, inchirp, outchirp, FFTW_ESTIMATE);
 
printf("compute chirp spectrum\n");
for(i=0; i < chirp_size; i++) inchirp[i] = chirp[i];
fftw_execute(fft_plan_chirp);
for(i=0; i < frequency_bins; i++) chirp_spect[i] = sqrt( outchirp[i][0] * outchirp[i][0] + outchirp[i][1] * outchirp[i][1] );
 
// write chirp data to souncard buffer
err = snd_pcm_writei(playback_handle, chirp, period_size);
if (err < 0)
{
290,7 → 314,6
}
else printf("Waiting for transmitt all samples\n");
//--------------
 
while ( snd_pcm_avail_update(capture_handle) < period_size)
{
usleep(1000);
325,13 → 348,13
{
l=0;
r=0;
for (m=0;m < chirp_size;m++)
for ( m = 0; m < chirp_size;m++)
{
l += chirp[m]*L_signal[m+n]; // correlate with left channel
r += chirp[m]*R_signal[m+n]; // correlate with right channel
}
correlationl[n]=l;
correlationr[n]=r;
correlationl[n]=abs(l);
correlationr[n]=abs(r);
}
 
printf("Searching echos\n");
341,30 → 364,48
{
if (l < correlationl[n])
{
delay[1] = n;
delayl[1] = n;
l = correlationl[n];
}
if (r < correlationr[n])
{
delay[2] = n;
delayr[1] = n;
r = correlationr[n];
}
}
 
 
printf("Writing output file\n");
out=fopen("/tmp/sonar.txt","w");
j=0;
for (i=0; i <= (period_size -1); i++)
for (i=0; i <= (period_size - 1); i++)
{
fprintf(out,"%6d %6d %6d %6d %9ld %9ld\n",i,chirp[i],L_signal[i],R_signal[i],correlationl[i], correlationr[i]);
fprintf(out,"%6d %6d %6d %9ld %9ld\n",i,L_signal[i],R_signal[i],correlationl[i], correlationr[i]);
j+=2;
}
fclose(out);
 
printf("Echo zacina na: %d vzorku.\n", delay[1]);
printf("Casove na: %f s\n", ((float)delay[1]/rate));
printf("vzdalenost: %f m\n", (SOUND_SPEED*(float)delay[1]/rate));
out=fopen("/tmp/chirp.txt","w");
j=0;
for (i=0; i <= (chirp_size - 1); i++)
{
fprintf(out,"%6d %6d %f\n", i, chirp[i], chirp_spect[i]);
j+=2;
}
fclose(out);
 
printf("Echo zacina na: %d vzorku.\n", delayl[1]);
printf("Casove na: %f s\n", ((float)delayl[1]/rate));
printf("vzdalenost: %f m\n", (SOUND_SPEED*(float)delayl[1]/rate));
 
free(correlationl);
free(correlationr);
free(L_signal);
free(R_signal);
free(chirp);
free(signal);
 
snd_pcm_close(playback_handle);
snd_pcm_close(capture_handle);
return 0;