Select Git revision
main.c 6.68 KiB
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <plplot.h>
#define NSIZE 5000
double PI = 4.0 * atan(1.0);
typedef struct _rc_circuit
{
double r, c;
} rc_circuit;
rc_circuit rc_circuit_create(double r, double c)
{
rc_circuit tmp = {.r = r, .c = c};
return tmp;
}
double rc_circuit_charge(double v_in, rc_circuit rc, double t)
{
return v_in * (1.0 - exp(-t / (rc.c * rc.r)));
}
double rc_circuit_discharge(double v_in, rc_circuit rc, double t)
{
return v_in * exp(-t / (rc.c * rc.r));
}
double solve_vc(rc_circuit rc, double v0, double v_in, double dt)
{
return (v_in - v0) / (rc.c * rc.r) * dt + v0;
}
// TODO: try to do the high pass filter.
// double solve_vr(rc_circuit rc, double v0, double dv_in_dt, double dt)
// {
// return (dv_in_dt * (rc.c * rc.r) - v0) / (rc.c * rc.r) * dt + v0;
// }
double solve_vr(double v_in, double vc)
{
return v_in - vc;
}
PLFLT rc_min(int size, PLFLT x[size])
{
PLFLT val = x[0];
for (int i = 0; i < size; ++i)
{
val = x[i] < val ? x[i] : val;
}
return val;
}
PLFLT rc_max(int size, PLFLT x[size])
{
PLFLT val = x[0];
for (int i = 0; i < size; ++i)
{
val = x[i] > val ? x[i] : val;
}
return val;
}
void plot_data(int size, PLFLT x[size], PLFLT y[size], PLFLT z[size], PLFLT ref[size], char *xaxis, char *yaxis, char *title)
{
PLFLT xmin = rc_min(size, x);
PLFLT xmax = rc_max(size, x);