Mercurial > ~darius > hgwebdir.cgi > modulator
view test.c @ 4:b6416c4aadc8
Test implementation
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Tue, 04 Feb 2025 14:20:07 +1030 |
parents | |
children | 2db42eaba3c8 |
line wrap: on
line source
#include <sys/errno.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <q.h> #include "shaped-trap.h" int main(int argc, char **argv) { uint8_t data[50000], shapelen, codegap, slew1, slew2, dcofs; uint16_t plen, ncode; uint32_t shapesamples, nsamples, idx; q_t dcscale, stepsize; char *code, tmps[20]; if (argc != 7) { printf("Bad usage\n"); exit(1); } plen = atoi(argv[1]); code = argv[2]; ncode = strlen(code); shapelen = sizeof(shaped_trap); codegap = atoi(argv[3]); slew1 = atoi(argv[4]); slew2 = atoi(argv[5]); dcofs = atoi(argv[6]); dcscale = qdiv(qsub(qint(255), qint(dcofs)), qint(255)); qsprint(dcscale, tmps, sizeof(tmps)); printf("dcscale = %s\n", tmps); if (ncode == 1) { // Number of samples for half of the pulse // Can't use q library here because it is Q16.16 so not large enough shapesamples = (plen * shapelen) / 100; // Number of samples for everything nsamples = shapesamples * 2 + slew1 + slew2; } else { shapesamples = plen; nsamples = shapesamples * 2 * ncode + codegap * (ncode - 1) + slew1 + slew2; } if (nsamples > sizeof(data)) { printf("Pulse too long (%d > %lu)\n", nsamples, sizeof(data)); exit(1); } // Number of samples per step in the pulse shape stepsize = qdiv(qint(shapesamples), qint(shapelen)); qsprint(stepsize, tmps, sizeof(tmps)); printf("shapelen = %d shapesamples = %u nsamples = %u stepsize = %s\n", shapelen, shapesamples, nsamples, tmps); if (shapesamples < 2) { printf("Pulse too short (%u < %d)\n", shapesamples, 2); exit(1); } idx = 0; // Up slew for (uint16_t i = 0; i < slew1; i++) data[idx++] = qtoi(qdiv(qmul(qint(dcofs), qint(i)), qint(slew1))); for (uint16_t c = 0; c < ncode; c++) { // Pulse up for (uint16_t i = 0; i < shapesamples; i++) data[idx++] = dcofs + qtoi(qmul(qint(shaped_trap[qtoi(qdiv(qint(i), stepsize))]), dcscale)); // Pulse down for (uint16_t i = 0; i < shapesamples; i++) data[idx++] = dcofs + qtoi(qmul(qint(shaped_trap[qtoi(qdiv(qint(shapesamples - i - 1), stepsize))]), dcscale)); // Code gap if (c < ncode - 1) for (uint16_t i = 0; i < codegap; i++) data[idx++] = dcofs; } // Down slew for (uint16_t i = 0; i < slew2; i++) data[idx++] = qtoi(qdiv(qmul(qint(dcofs), qint(slew2 - i)), qint(slew2))); FILE *fh; if ((fh = fopen("/tmp/out.bin", "w")) == NULL) { printf("Unable to open file: %s\n", strerror(errno)); exit(1); } fwrite(data, idx, 1, fh); fclose(fh); exit(0); }