24#define SAMPLE_FORMAT float
29#define SAMPLE_FORMAT double
35#define fn3(a,b) a##_##b
36#define fn2(a,b) fn3(a,b)
37#define fn(a) fn2(a, SAMPLE_FORMAT)
42 const int order =
s->order;
49 output =
s->fdsp->scalarproduct_float(delay,
tmp,
s->kernel_size);
51 output =
s->fdsp->scalarproduct_double(delay,
tmp,
s->kernel_size);
62 for (
int i = 0;
i <=
N;
i++)
65 for (
int i = 0;
i <
N;
i++) {
69 for (
int k =
i; k <
N; k++) {
86 for (
int j =
i + 1; j <
N; j++) {
89 for (
int k =
i + 1; k <
N; k++)
90 MA[j][k] -= MA[j][
i] * MA[
i][k];
99 for (
int j = 0; j <
N; j++) {
100 for (
int i = 0;
i <
N;
i++) {
103 for (
int k = 0; k <
i; k++)
104 IA[
i][j] -= MA[
i][k] *
IA[k][j];
107 for (
int i =
N - 1;
i >= 0;
i--) {
108 for (
int k =
i + 1; k <
N; k++)
109 IA[
i][j] -= MA[
i][k] *
IA[k][j];
111 IA[
i][j] /= MA[
i][
i];
118 ftype *dcoeffs = (
ftype *)
s->dcoeffs->extended_data[ch];
119 ftype *coeffs = (
ftype *)
s->coeffs->extended_data[ch];
120 ftype *delay = (
ftype *)
s->delay->extended_data[ch];
121 ftype **itmpmp = (
ftype **)&
s->itmpmp[
s->projection * ch];
122 ftype **tmpmp = (
ftype **)&
s->tmpmp[
s->projection * ch];
128 int *p = (
int *)
s->p->extended_data[ch];
129 int *
offset = (
int *)
s->offset->extended_data[ch];
130 const int projection =
s->projection;
132 const int order =
s->order;
133 const int length = projection + order;
135 const ftype tol = 0.00001f;
139 delay[
offset[0] + order] = input;
142 e[
offset[1]] = e[
offset[1] + projection] = desired - output;
144 for (
int i = 0;
i < projection;
i++) {
145 const int iprojection =
i * projection;
147 for (
int j =
i; j < projection; j++) {
149 for (
int k = 0; k < order; k++)
151 tmpm[iprojection + j] = sum;
153 tmpm[j * projection +
i] = sum;
156 tmpm[iprojection +
i] +=
delta;
162 for (
int i = 0;
i < projection;
i++) {
164 for (
int j = 0; j < projection; j++)
165 sum += itmpmp[
i][j] * e[j +
offset[1]];
169 for (
int i = 0;
i < order;
i++) {
171 for (
int j = 0; j < projection; j++)
176 for (
int i = 0;
i < order;
i++)
177 coeffs[
i] = coeffs[
i + order] = coeffs[
i] + mu * dcoeffs[
i];
180 offset[1] = projection - 1;
185 switch (
s->output_mode) {
186 case IN_MODE: output = input;
break;
188 case OUT_MODE: output = desired - output;
break;
189 case NOISE_MODE: output = input - output;
break;
199 const int start =
ff_slice_pos(
out->ch_layout.nb_channels, jobnr, nb_jobs);
200 const int end =
ff_slice_pos(
out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
202 for (
int c = start;
c < end;
c++) {
203 const ftype *input = (
const ftype *)
s->frame[0]->extended_data[
c];
204 const ftype *desired = (
const ftype *)
s->frame[1]->extended_data[
c];
207 for (
int n = 0; n <
out->nb_samples; n++) {
209 if (
ctx->is_disabled)
210 output[n] = input[n];
static ftype fn fir_sample(AudioAPContext *s, ftype sample, ftype *delay, ftype *coeffs, ftype *tmp, int *offset)
static void fn lup_invert(ftype *const *MA, const int *P, const int N, ftype **IA)
static ftype fn process_sample(AudioAPContext *s, ftype input, ftype desired, int ch)
static int fn filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int fn lup_decompose(ftype **MA, const int N, const ftype tol, int *P)
static AVFormatContext * ctx
#define i(width, name, range_min, range_max)
static __device__ float fabs(float a)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define FFSWAP(type, a, b)
This structure describes decoded (raw) audio or video data.
static int imax(const int a, const int b)