1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

signal: add new option for DC bias offset and fixed random walk

This commit is contained in:
Steffen Vogel 2017-08-30 22:41:15 +02:00
parent d758ac386a
commit d31c48607b
3 changed files with 31 additions and 12 deletions

View file

@ -59,6 +59,9 @@ struct signal {
double frequency; /**< Frequency of the generated signals. */
double amplitude; /**< Amplitude of the generated signals. */
double stddev; /**< Standard deviation of random signals (normal distributed). */
double offset; /**< A constant bias. */
double *last; /**< The values from the previous period which are required for random walk. */
int values; /**< The number of values which will be emitted by this node. */
int limit; /**< The number of values which should be generated by this node. <0 for infinitve. */

View file

@ -63,8 +63,9 @@ int signal_parse(struct node *n, json_t *cfg)
s->frequency = 1;
s->amplitude = 1;
s->stddev = 0.2;
s->offset = 0;
ret = json_unpack_ex(cfg, &err, 0, "{ s?: s, s?: b, s?: i, s?: i, s?: f, s?: f, s?: f, s?: f }",
ret = json_unpack_ex(cfg, &err, 0, "{ s?: s, s?: b, s?: i, s?: i, s?: f, s?: f, s?: f, s?: f, s?: f }",
"signal", &type,
"realtime", &s->rt,
"limit", &s->limit,
@ -72,7 +73,8 @@ int signal_parse(struct node *n, json_t *cfg)
"rate", &s->rate,
"frequency", &s->frequency,
"amplitude", &s->amplitude,
"stddev", &s->stddev
"stddev", &s->stddev,
"offset", &s->offset
);
if (ret)
jerror(&err, "Failed to parse configuration of node %s", node_name(n));
@ -107,10 +109,11 @@ int signal_parse_cli(struct node *n, int argc, char *argv[])
s->rt = 1;
s->values = 1;
s->limit = -1;
s->offset = 0;
/* Parse optional command line arguments */
char c, *endptr;
while ((c = getopt(argc, argv, "v:r:f:l:a:D:n")) != -1) {
while ((c = getopt(argc, argv, "v:r:f:l:a:D:n:o")) != -1) {
switch (c) {
case 'n':
s->rt = 0;
@ -124,6 +127,9 @@ int signal_parse_cli(struct node *n, int argc, char *argv[])
case 'r':
s->rate = strtof(optarg, &endptr);
goto check;
case 'o':
s->offset = strtof(optarg, &endptr);
goto check;
case 'f':
s->frequency = strtof(optarg, &endptr);
goto check;
@ -164,6 +170,10 @@ int signal_open(struct node *n)
s->counter = 0;
s->started = time_now();
s->last = alloc(sizeof(double) * s->values);
for (int i = 0; i < s->values; i++)
s->last[i] = s->offset;
/* Setup task */
if (s->rt) {
@ -186,6 +196,8 @@ int signal_close(struct node *n)
return ret;
}
free(s->last);
return 0;
}
@ -224,14 +236,17 @@ int signal_read(struct node *n, struct sample *smps[], unsigned cnt)
t->length = s->values;
for (int i = 0; i < MIN(s->values, t->capacity); i++) {
int rtype = (s->type != SIGNAL_TYPE_MIXED) ? s->type : i % 4;
int rtype = (s->type != SIGNAL_TYPE_MIXED) ? s->type : i % 5;
switch (rtype) {
case SIGNAL_TYPE_CONSTANT: t->data[i].f = s->amplitude; break;
case SIGNAL_TYPE_RANDOM: t->data[i].f += box_muller(0, s->stddev); break;
case SIGNAL_TYPE_SINE: t->data[i].f = s->amplitude * sin(running * s->frequency * 2 * M_PI); break;
case SIGNAL_TYPE_TRIANGLE: t->data[i].f = s->amplitude * (fabs(fmod(running * s->frequency, 1) - .5) - 0.25) * 4; break;
case SIGNAL_TYPE_SQUARE: t->data[i].f = s->amplitude * ( (fmod(running * s->frequency, 1) < .5) ? -1 : 1); break;
case SIGNAL_TYPE_RAMP: t->data[i].f = fmod(s->counter, s->rate / s->frequency); /** @todo send as integer? */ break;
case SIGNAL_TYPE_CONSTANT: t->data[i].f = s->offset + s->amplitude; break;
case SIGNAL_TYPE_SINE: t->data[i].f = s->offset + s->amplitude * sin(running * s->frequency * 2 * M_PI); break;
case SIGNAL_TYPE_TRIANGLE: t->data[i].f = s->offset + s->amplitude * (fabs(fmod(running * s->frequency, 1) - .5) - 0.25) * 4; break;
case SIGNAL_TYPE_SQUARE: t->data[i].f = s->offset + s->amplitude * ( (fmod(running * s->frequency, 1) < .5) ? -1 : 1); break;
case SIGNAL_TYPE_RAMP: t->data[i].f = s->offset + fmod(s->counter, s->rate / s->frequency); /** @todo send as integer? */ break;
case SIGNAL_TYPE_RANDOM:
s->last[i] += box_muller(0, s->stddev);
t->data[i].f = s->last[i];
break;
}
}
@ -262,8 +277,8 @@ char * signal_print(struct node *n)
default: return NULL;
}
strcatf(&buf, "signal=%s, rate=%.2f, values=%d, frequency=%.2f, amplitude=%.2f, stddev=%.2f",
type, s->rate, s->values, s->frequency, s->amplitude, s->stddev);
strcatf(&buf, "signal=%s, rt=%s, rate=%.2f, values=%d, frequency=%.2f, amplitude=%.2f, stddev=%.2f, offset=%.2f",
type, s->rt ? "yes" : "no", s->rate, s->values, s->frequency, s->amplitude, s->stddev, s->offset);
if (s->limit > 0)
strcatf(&buf, ", limit=%d", s->limit);

View file

@ -63,6 +63,7 @@ void usage()
printf(" -F HZ the frequency of the signal\n");
printf(" -a FLT the amplitude\n");
printf(" -D FLT the standard deviation for 'random' signals\n");
printf(" -o OFF the DC bias\n");
printf(" -l NUM only send LIMIT messages and stop\n\n");
print_copyright();