PipeWire 1.7.0
Loading...
Searching...
No Matches
burg-pred.h
Go to the documentation of this file.
1/* Simple Plugin API */
2/* SPDX-FileCopyrightText: Copyright © 2026 Wim Taymans */
3/* SPDX-License-Identifier: MIT */
4
5#ifndef SPA_BURG_PRED_H
6#define SPA_BURG_PRED_H
7
8#ifdef __cplusplus
9extern "C" {
10#endif
11
16
21
22struct spa_burg_pred;
23
24#include <spa/utils/defs.h>
25
26#ifndef SPA_API_BURG_PRED
27 #ifdef SPA_API_IMPL
28 #define SPA_API_BURG_PRED SPA_API_IMPL
29 #else
30 #define SPA_API_BURG_PRED static inline
31 #endif
32#endif
33
34struct spa_burg_pred {
35 float *coef;
36 uint32_t n_coef;
37 float *state;
38 uint32_t pos;
39};
40
41SPA_API_BURG_PRED void spa_burg_pred_fit(struct spa_burg_pred *p, float *samples, uint32_t len,
42 double threshold, float *state, float *coef, uint32_t max_coef)
44 double f[len], b[len];
45 double a[max_coef+1], Dk0;
46 double thr = (1.0 - threshold) * (1.0 - threshold);
47 uint32_t i, m;
48 uint32_t order = len > 0 ? SPA_MIN(len - 1, max_coef) : 0;
50 memset(a, 0, sizeof(a));
51 a[0] = 1.0;
52
53 double Dk = 0.0;
54 for (i = 0; i < len; i++) {
55 f[i] = b[i] = samples[i];
56 Dk += 2.0 * f[i] * f[i];
57 }
58 if (len > 0)
59 Dk -= f[0] * f[0] + b[len-1] * b[len-1];
60 Dk0 = Dk;
61
62 for (m = 0; m < order; m++) {
63 if (Dk <= 0.0 || (Dk < thr * Dk0))
64 break;
65
66 double mu = 0.0;
67 for (i = 0; i < len-1 - m; i++ )
68 mu += f[i+m+1] * b[i];
69 mu *= -2.0 / Dk;
70
71 for (i = 0; i <= (m + 1) / 2; i++ ) {
72 double t1 = a[m+1-i] + mu * a[i];
73 a[i] = a[i] + mu * a[m+1-i];
74 a[m+1-i] = t1;
75 }
76 for (i = 0; i < len-1 - m; i++ ) {
77 double t1 = f[i+m+1] + mu * b[i];
78 b[i] = b[i] + mu * f[i+m+1];
79 f[i+m+1] = t1;
80 }
81 Dk0 = Dk;
82 Dk = (1.0 - mu*mu) * Dk - f[m+1] * f[m+1] - b[len-m-2] * b[len-m-2];
83 }
84 if (m == 0 && max_coef > 0 && len > 0) {
85 m = 1;
86 coef[0] = 1.0f;
87 state[0] = samples[len-1];
88 } else {
89 for (i = 0; i < m; i++) {
90 coef[i] = (float)-a[m-i];
91 state[i] = samples[len-m+i];
92 }
93 }
94 p->coef = coef;
95 p->state = state;
96 p->n_coef = m;
97 p->pos = 0;
98}
99
101{
102 uint32_t i;
103 float v;
104
105 if (p->n_coef < 1)
106 return 0.0f;
107
108 v = p->state[0] * p->coef[0];
109
110 for (i = 1; i < p->n_coef; i++)
111 v += p->coef[i] * (p->state[i-1] = p->state[i]);
112 p->state[i-1] = v;
113
114 return v;
115}
116
117
121
122#ifdef __cplusplus
123} /* extern "C" */
124#endif
125
126#endif /* SPA_BURG_PRED_H */
spa/utils/defs.h
#define SPA_API_BURG_PRED
Definition burg-pred.h:38
SPA_API_BURG_PRED float spa_burg_pred_next(struct spa_burg_pred *p)
Definition burg-pred.h:108
SPA_API_BURG_PRED void spa_burg_pred_fit(struct spa_burg_pred *p, float *samples, uint32_t len, double threshold, float *state, float *coef, uint32_t max_coef)
Definition burg-pred.h:49
#define SPA_MIN(a, b)
Definition defs.h:166
Definition burg-pred.h:42
uint32_t n_coef
Definition burg-pred.h:44
float * state
Definition burg-pred.h:45
float * coef
Definition burg-pred.h:43
uint32_t pos
Definition burg-pred.h:46