#include "gettext.h"
#include "common.h"
+#include "bat-signal.h"
-static void check_amplitude(struct bat *bat, double *buf)
+static void check_amplitude(struct bat *bat, float *buf)
{
- double sum, average, amplitude;
+ float sum, average, amplitude;
int i, percent;
/* calculate average value */
/* calculate peak-to-average amplitude */
for (i = 0, sum = 0.0; i < bat->frames; i++)
- sum += abs(buf[i] - average);
+ sum += fabsf(buf[i] - average);
amplitude = sum / bat->frames * M_PI / 2.0;
/* calculate amplitude percentage against full range */
float tolerance = (delta_rate > delta_HZ) ? delta_rate : delta_HZ;
fprintf(bat->log, _("Detected peak at %2.2f Hz of %2.2f dB\n"), hz_peak,
- 10.0 * log10(a->mag[peak] / mean));
+ 10.0 * log10f(a->mag[peak] / mean));
fprintf(bat->log, _(" Total %3.1f dB from %2.2f to %2.2f Hz\n"),
- 10.0 * log10(p / mean), start * hz, end * hz);
+ 10.0 * log10f(p / mean), start * hz, end * hz);
if (hz_peak < DC_THRESHOLD) {
fprintf(bat->err, _(" WARNING: Found low peak %2.2f Hz,"),
static void calc_magnitude(struct bat *bat, struct analyze *a, int N)
{
- double r2, i2;
+ float r2, i2;
int i;
for (i = 1; i < N / 2; i++) {
static int find_and_check_harmonics(struct bat *bat, struct analyze *a,
int channel)
{
- fftw_plan p;
+ fftwf_plan p;
int err = -ENOMEM, N = bat->frames;
/* Allocate FFT buffers */
- a->in = (double *) fftw_malloc(sizeof(double) * bat->frames);
+ a->in = (float *) fftwf_malloc(sizeof(float) * bat->frames);
if (a->in == NULL)
goto out1;
- a->out = (double *) fftw_malloc(sizeof(double) * bat->frames);
+ a->out = (float *) fftwf_malloc(sizeof(float) * bat->frames);
if (a->out == NULL)
goto out2;
- a->mag = (double *) fftw_malloc(sizeof(double) * bat->frames);
+ a->mag = (float *) fftwf_malloc(sizeof(float) * bat->frames);
if (a->mag == NULL)
goto out3;
/* create FFT plan */
- p = fftw_plan_r2r_1d(N, a->in, a->out, FFTW_R2HC,
+ p = fftwf_plan_r2r_1d(N, a->in, a->out, FFTW_R2HC,
FFTW_MEASURE | FFTW_PRESERVE_INPUT);
if (p == NULL)
goto out4;
- /* convert source PCM to doubles */
- bat->convert_sample_to_double(a->buf, a->in, bat->frames);
+ /* convert source PCM to floats */
+ bat->convert_sample_to_float(a->buf, a->in, bat->frames);
/* check amplitude */
check_amplitude(bat, a->in);
/* run FFT */
- fftw_execute(p);
+ fftwf_execute(p);
/* FFT out is real and imaginary numbers - calc magnitude for each */
calc_magnitude(bat, a, N);
/* check data */
err = check(bat, a, channel);
- fftw_destroy_plan(p);
+ fftwf_destroy_plan(p);
out4:
- fftw_free(a->mag);
+ fftwf_free(a->mag);
out3:
- fftw_free(a->out);
+ fftwf_free(a->out);
out2:
- fftw_free(a->in);
+ fftwf_free(a->in);
out1:
return err;
}
#include "alsa.h"
#endif
#include "convert.h"
-#ifdef HAVE_LIBFFTW3
+#ifdef HAVE_LIBFFTW3F
#include "analyze.h"
#endif
#include "latencytest.h"
if (bat->frames <= 0 || bat->frames > MAX_FRAMES) {
fprintf(bat->err, _("Invalid duration. Range: (0, %d(%fs))\n"),
- MAX_FRAMES, (double)MAX_FRAMES / bat->rate);
+ MAX_FRAMES, (float)MAX_FRAMES / bat->rate);
return -EINVAL;
}
bat->sample_size = 2;
bat->format = BAT_PCM_FORMAT_S16_LE;
bat->convert_float_to_sample = convert_float_to_int16;
- bat->convert_sample_to_double = convert_int16_to_double;
+ bat->convert_sample_to_float = convert_int16_to_float;
bat->frames = bat->rate * 2;
bat->target_freq[0] = 997.0;
bat->target_freq[1] = 997.0;
switch (bat->sample_size) {
case 1:
bat->convert_float_to_sample = convert_float_to_uint8;
- bat->convert_sample_to_double = convert_uint8_to_double;
+ bat->convert_sample_to_float = convert_uint8_to_float;
break;
case 2:
bat->convert_float_to_sample = convert_float_to_int16;
- bat->convert_sample_to_double = convert_int16_to_double;
+ bat->convert_sample_to_float = convert_int16_to_float;
break;
case 3:
bat->convert_float_to_sample = convert_float_to_int24;
- bat->convert_sample_to_double = convert_int24_to_double;
+ bat->convert_sample_to_float = convert_int24_to_float;
break;
case 4:
bat->convert_float_to_sample = convert_float_to_int32;
- bat->convert_sample_to_double = convert_int32_to_double;
+ bat->convert_sample_to_float = convert_int32_to_float;
break;
default:
fprintf(bat->err, _("Invalid PCM format: size=%d\n"),
test_loopback(&bat);
analyze:
-#ifdef HAVE_LIBFFTW3
+#ifdef HAVE_LIBFFTW3F
if (!bat.standalone)
err = analyze_capture(&bat);
#else
FILE *log;
FILE *err;
- void (*convert_sample_to_double)(void *, double *, int);
+ void (*convert_sample_to_float)(void *, float *, int);
void (*convert_float_to_sample)(float *, void *, int, int);
void *buf; /* PCM Buffer */
struct analyze {
void *buf;
- double *in;
- double *out;
- double *mag;
+ float *in;
+ float *out;
+ float *mag;
};
void prepare_wav_info(struct wav_container *, struct bat *);
#include <stdlib.h>
#include <stdint.h>
-void convert_uint8_to_double(void *buf, double *val, int samples)
+void convert_uint8_to_float(void *buf, float *val, int samples)
{
int i;
val[i] = ((uint8_t *) buf)[i];
}
-void convert_int16_to_double(void *buf, double *val, int samples)
+void convert_int16_to_float(void *buf, float *val, int samples)
{
int i;
val[i] = ((int16_t *) buf)[i];
}
-void convert_int24_to_double(void *buf, double *val, int samples)
+void convert_int24_to_float(void *buf, float *val, int samples)
{
int i;
int32_t tmp;
}
}
-void convert_int32_to_double(void *buf, double *val, int samples)
+void convert_int32_to_float(void *buf, float *val, int samples)
{
int i;
*
*/
-void convert_uint8_to_double(void *, double *, int);
-void convert_int16_to_double(void *, double *, int);
-void convert_int24_to_double(void *, double *, int);
-void convert_int32_to_double(void *, double *, int);
+void convert_uint8_to_float(void *, float *, int);
+void convert_int16_to_float(void *, float *, int);
+void convert_int24_to_float(void *, float *, int);
+void convert_int32_to_float(void *, float *, int);
void convert_float_to_uint8(float *, void *, int, int);
void convert_float_to_int16(float *, void *, int, int);
void convert_float_to_int24(float *, void *, int, int);
sg->state_real = sr * pr - si * pi;
sg->state_imag = sr * pi + pr * si;
/* return the input value so sine wave starts at exactly 0.0 */
- return sr;
+ return (float)sr;
}
/* fills a vector with a sine wave */
FFTW_CFLAGS=""
dnl Check for libfftw3
have_libfftw3="yes"
- AC_CHECK_LIB([fftw3], [fftw_malloc], , [have_libfftw3="no"])
+ AC_CHECK_LIB([fftw3f], [fftwf_malloc], , [have_libfftw3="no"])
dnl Check for libtinyalsa
have_libtinyalsa=
if test x$alsabat_backend_tiny = xtrue; then