| 12345678910111213141516171819202122232425262728293031323334353637383940 |
- #include "adrc.h"
- void ladrc_init(ladrc_t* adrc, float ts, float wo, float wc, float b0) {
- adrc->z1 = adrc->z2 = adrc->out = 0;
- adrc->ts = ts;
- adrc->b0 = b0;
- adrc->wcv = wc;
- adrc->p1 = 2 * wo;
- adrc->p2 = wo * wo;
- }
- float ladrc_run(ladrc_t *adrc, float in, float feedback) {
- float y = feedback;
- float u = adrc->out;
- //do eso
- float error = y - adrc->z1;
-
- adrc->z2 = adrc->z2 + adrc->ts * (error * adrc->p2);
- adrc->z1 = adrc->z1 + adrc->ts * (error * adrc->p1 + adrc->z2 + u * adrc->b0);
- //do error compestion
- float ref = in;
- float out = ((ref - adrc->z1) * adrc->wcv - adrc->z2) / adrc->b0;
- adrc->out = fclamp(out, adrc->out_min, adrc->out_max);
- return adrc->out;
- }
- void ladrc_reset(ladrc_t* adrc, float feedback, float out_init) {
- adrc->z1 = feedback;
- adrc->z2 = -out_init * adrc->b0;
- adrc->out = out_init;
- }
- void ladrc_copy(ladrc_t *dst, ladrc_t *src) {
- dst->z1 = src->z1;
- dst->z2 = src->z2;
- dst->out = src->out;
- }
|