From e64d44d734a80adba210eb84f1161ee8dc6a6291 Mon Sep 17 00:00:00 2001 From: Oleg Borodin Date: Sat, 10 Sep 2022 15:58:47 +0200 Subject: [PATCH] added tests with lpf --- tests/gensin1.c | 86 +++++++++++++++++++++ tests/gensin3.c | 185 +++++++++++++++++++++++++++++++++++++++++++++ tests/gensin3a.png | Bin 0 -> 12453 bytes tests/gensin3b.png | Bin 0 -> 8134 bytes 4 files changed, 271 insertions(+) create mode 100644 tests/gensin1.c create mode 100644 tests/gensin3.c create mode 100644 tests/gensin3a.png create mode 100644 tests/gensin3b.png diff --git a/tests/gensin1.c b/tests/gensin1.c new file mode 100644 index 0000000..81ca038 --- /dev/null +++ b/tests/gensin1.c @@ -0,0 +1,86 @@ +/* + * + * Copyright 2022 Oleg Borodin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + */ + + +#include +#include +#include +#include + + + +typedef struct { + double x0; + double x1; + double rc; +} lpf_t; + +void lpf_init(lpf_t *lpf, double freq) { + lpf->x0 = 0.0; + lpf->x1 = 0.0; + + double order = 1.5; + double n = 1 / sqrt(pow(2, 1.0 / order) - 1); + lpf->rc = 1 / (2 * n * M_PI * freq); +} + + +double lpf_next(lpf_t *lpf, double x, double dt) { + + double k = dt / (lpf->rc + dt); + + lpf->x1 = lpf->x1 + k * (x - lpf->x1); + lpf->x0 = lpf->x0 + k * (lpf->x1 - lpf->x0); + return lpf->x0; +} + +int main(int argc, char **argv) { + + double t = 0; + double s = 0; + double freq1 = 10; + double freq2 = 50; + double freq3 = 200; + double dt = 0.0001; + double l = 0.5; + + int fd = open("freq.dat", O_WRONLY | O_TRUNC | O_CREAT, 0666); + printf("start\n"); + + if (fd < 0) { return 1; }; + + lpf_t lpf; + lpf_init(&lpf, 30.0); + + + for (int i = 0; i < (l / dt); i++) { + t = i * dt; + double s1 = sin(2 * M_PI * freq1 * t); + double s2 = cos(2 * M_PI * freq2 * t); + double s3 = sin(2 * M_PI * freq3 * t); + s = (s1 + s2 + s3) / 3.0; + s = lpf_next(&lpf, s, dt); + dprintf(fd, "%e\t%e\n", t, s); + } + fsync(fd); + close(fd); + return 0; +} diff --git a/tests/gensin3.c b/tests/gensin3.c new file mode 100644 index 0000000..03c4a93 --- /dev/null +++ b/tests/gensin3.c @@ -0,0 +1,185 @@ +/* + * Copyright 2022 Oleg Borodin + */ + + +#include +#include +#include +#include +#include +#include + +typedef struct { + double x0; + double x1; + double rc; +} lpf_t; + +void lpf_init(lpf_t * lpf, double freq) { + lpf->x0 = 0.0; + lpf->x1 = 0.0; + + double order = 1.5; + double n = 1 / sqrt(pow(2, 1.0 / order) - 1); + + lpf->rc = 1 / (2 * n * M_PI * freq); +} + +double lpf_next(lpf_t * lpf, double x, double dt) { + + double k = dt / (lpf->rc + dt); + + lpf->x1 = lpf->x1 + k * (x - lpf->x1); + lpf->x0 = lpf->x0 + k * (lpf->x1 - lpf->x0); + return lpf->x0; +} + +void dft(double* x1, double* y1, int m, int dir) { + long i, k; + double arg; + double cosarg, sinarg; + + double x2[m]; + double y2[m]; + + for (i = 0; i < m; i++) { + x2[i] = 0; + y2[i] = 0; + arg = -dir * 2.0 * M_PI * (double)i / (double)m; + for (k = 0; k < m; k++) { + cosarg = cos(k * arg); + sinarg = sin(k * arg); + x2[i] += (x1[k] * cosarg - y1[k] * sinarg); + y2[i] += (x1[k] * sinarg + y1[k] * cosarg); + } + } + if (dir == 1) { + for (i = 0; i < m; i++) { + x1[i] = x2[i] / (double)m; + y1[i] = y2[i] / (double)m; + } + } else { + for (i = 0; i < m; i++) { + x1[i] = x2[i]; + y1[i] = y2[i]; + } + } +} + + +int main(int argc, char** argv) { + + double t = 0; + double s = 0; + double freq1 = 20; + double freq2 = 70; + double freq3 = 150; + double dt = 0.001; + + lpf_t lpf; + + lpf_init(&lpf, 20.0); + + int c = 1024 * 4; + double xa[c]; + double xb[c]; + double y[c]; + + for (int i = 0; i < c; i++) { + t = i * dt; + double s1 = sin(2 * M_PI * freq1 * t); + double s2 = cos(2 * M_PI * freq2 * t); + double s3 = sin(2 * M_PI * freq3 * t); + + s = (s1 + s2 + s3) / 3.0; + xa[i] = s; + xb[i] = lpf_next(&lpf, s, dt);; + } + + for (int i = 0; i < c; i++) { + y[i] = 0; + } + + double rate = 1.0 / dt; + + + FILE * fd; + + fd = popen ("gnuplot -persistent", "w"); + + fprintf(fd, "set terminal png size 1600,1200\n"); + fprintf(fd, "set output \"gensin3a.png\"\n"); + fprintf(fd, "plot '-' with lines\n"); + + dft(xa, y, c, -1); + for (int i = 0; i < c; i++) { + double freq = rate * (double)i / (double)c; + double amp = sqrt(xa[i]*xa[i] + y[i]*y[i]) ; + if (freq < rate / 2) { + fprintf(fd, "%e %e\n", freq, amp); + } + } + fflush(fd); + fprintf(fd, "e"); + fclose(fd); + + for (int i = 0; i < c; i++) { + y[i] = 0; + } + + + fd = popen ("gnuplot -persistent", "w"); + + fprintf(fd, "set terminal png size 1600,1200\n"); + fprintf(fd, "set output \"gensin3b.png\"\n"); + fprintf(fd, "plot '-' with lines\n"); + + dft(xb, y, c, -1); + for (int i = 0; i < c; i++) { + double freq = rate * (double)i / (double)c; + double amp = sqrt(xb[i]*xb[i] + y[i]*y[i]) ; + if (freq < rate / 2) { + fprintf(fd, "%e %e\n", freq, amp); + } + } + fflush(fd); + fprintf(fd, "e"); + fclose(fd); + + + +#if 0 + FILE* fd = fopen("freq1.dat", "w"); + + dft(xa, y, c, -1); + for (int i = 0; i < c; i++) { + double freq = rate * (double)i / (double)c; + double amp = sqrt(xa[i]*xa[i] + y[i]*y[i]) ; + if (freq < rate / 2) { + fprintf(fd, "%e %e\n", freq, amp); + } + } + + fclose(fd); + + for (int i = 0; i < c; i++) { + y[i] = 0; + } + + fd = fopen("freq2.dat", "w"); + + dft(xb, y, c, -1); + for (int i = 0; i < c; i++) { + double freq = rate * (double)i / (double)c; + double amp = sqrt(xb[i]*xb[i] + y[i]*y[i]); + if (freq < rate / 2) { + fprintf(fd, "%e %e\n", freq, amp); + } + } + + fclose(fd); +#endif + + return 0; +} diff --git a/tests/gensin3a.png b/tests/gensin3a.png new file mode 100644 index 0000000000000000000000000000000000000000..6f41361ba23c2d1bb4f624d4159c2c873fff5d44 GIT binary patch literal 12453 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 XnKY1@vFR&+eeL?S-fQUJ1Rwb?`FAk> literal 0 HcmV?d00001