[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: analogy Commit: bee38acc8bed264547102a3013c76408235485e7 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=bee38acc8bed264547102a3013c76408235485e7 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +
[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: analogy Commit: 71eba7a6507f564e22da7b8b65c3764bf1ea663d URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=71eba7a6507f564e22da7b8b65c3764bf1ea663d Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +
[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: experimental Commit: 69c47ba516a3ca80095942ee9b81f039b5421eb3 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=69c47ba516a3ca80095942ee9b81f039b5421eb3 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +
[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: experimental Commit: 0f0dcd0c21fdddc0d539e48488aa248313bdc270 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=0f0dcd0c21fdddc0d539e48488aa248313bdc270 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +
[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: experimental Commit: 801760ab1a7d9e438c1dc3b2560ee442f9e058fd URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=801760ab1a7d9e438c1dc3b2560ee442f9e058fd Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +
[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: analogy Commit: 1c8f7dfbae13d89c6b7474ddd6b94a1711e2f919 URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=1c8f7dfbae13d89c6b7474ddd6b94a1711e2f919 Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +
[Xenomai-git] Alexis Berlemont : analogy: add first version of waveform generation
Module: xenomai-abe Branch: analogy Commit: debcfb2b698c75a1a0f2d99556595c0a296f9baa URL: http://git.xenomai.org/?p=xenomai-abe.git;a=commit;h=debcfb2b698c75a1a0f2d99556595c0a296f9baa Author: Alexis Berlemont alexis.berlem...@gmail.com Date: Sat Oct 16 14:59:54 2010 +0200 analogy: add first version of waveform generation This work is based on Daniele Nicolodi's work. Unfortunately, I could not include the proprosal as is because it was limited for 16bits acquisition devices. So far, this work is not complete. --- src/utils/analogy/Makefile.am |6 ++ src/utils/analogy/signal_generation.c | 157 + src/utils/analogy/signal_generation.h | 38 3 files changed, 201 insertions(+), 0 deletions(-) diff --git a/src/utils/analogy/Makefile.am b/src/utils/analogy/Makefile.am index f82942e..3d8cb5e 100644 --- a/src/utils/analogy/Makefile.am +++ b/src/utils/analogy/Makefile.am @@ -9,6 +9,12 @@ CPPFLAGS = \ LDFLAGS = \ @XENO_USER_LDFLAGS@ +lib_LIBRARIES = libwaveform.a + +libwaveform_a_SOURCES = signal_generation.c + +noinst_HEADERS = signal_generation.h + analogy_config_SOURCES = analogy_config.c analogy_config_LDADD = \ ../../drvlib/analogy/libanalogy.la \ diff --git a/src/utils/analogy/signal_generation.c b/src/utils/analogy/signal_generation.c new file mode 100644 index 000..2f443c5 --- /dev/null +++ b/src/utils/analogy/signal_generation.c @@ -0,0 +1,157 @@ +#include stdio.h +#include stdlib.h +#include assert.h +#include errno.h +#include math.h + +#include analogy/analogy.h + +#include signal_generation.h + +#ifndef PI +#define PI 3.14159265358979323846 +#endif + +void a4l_sg_init_sine(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 0.5 * config-wf_amplitude * cos(i * 2 * PI * ratio); + } +} + +void a4l_sg_init_sawtooth(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + period_idx * config-wf_amplitude + + i * ratio * config-wf_amplitude; + } +} + +void a4l_sg_init_triangular(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + + int period_idx = (int)floor(i * ratio); + int half_period_idx = (int)floor(i * 2 * ratio); + int rise = ((half_period_idx % 2) == 0) ? 1 : 0; + + if (rise) { + values[i] = config-wf_offset - + config-wf_amplitude / 2 - + 2 * period_idx * config-wf_amplitude + + 2 * i * ratio * config-wf_amplitude; + } else { + values[i] = config-wf_offset - + config-wf_amplitude / 2 + + 2 * (period_idx + 1) * config-wf_amplitude - + 2 * i * ratio * config-wf_amplitude; + } + } +} + +void a4l_sg_init_steps(struct waveform_config *config, double *values) +{ + int i; + + double ratio = config-wf_frequency / config-spl_frequency; + + for (i = 0; i config-spl_count; i++) { + int half_period_idx = (int)floor(i * 2 * ratio); + int even = (half_period_idx % 2 == 0); + + values[i] = config-wf_offset - + config-wf_amplitude / 2 + even * config-wf_amplitude; + } +} + +void a4l_sg_set_sample_count(struct waveform_config *config) +{ + int sample_count = MIN_SAMPLE_COUNT; + int best_count = MIN_SAMPLE_COUNT; + double lowest_diff = INFINITY; + + while (sample_count MAX_SAMPLE_COUNT) { + + double ratio = (double)sample_count * + (config-wf_frequency / config-spl_frequency); + int ceiling = ceil(ratio); + double diff = (double)ceiling - ratio; + + assert(diff = 0); + + if (diff lowest_diff) { + lowest_diff = diff; + best_count = sample_count; + } + + if (diff == 0) + break; + + sample_count++; + } + + if (lowest_diff != 0) { + printf(Warning: unable to create a contiguous signal\n); +