avfilter: add anlmf filter

This commit is contained in:
Paul B Mahol
2021-12-18 16:04:40 +01:00
parent 2497a45562
commit 209488ccb0
6 changed files with 27 additions and 4 deletions

View File

@@ -43,6 +43,7 @@ version <next>:
- adynamicequalizer audio filter - adynamicequalizer audio filter
- yadif_videotoolbox filter - yadif_videotoolbox filter
- VideoToolbox ProRes encoder - VideoToolbox ProRes encoder
- anlmf audio filter
version 4.4: version 4.4:

View File

@@ -2301,8 +2301,8 @@ Set smooth factor. Default value is @var{11}. Allowed range is from @var{1} to @
This filter supports the all above options as @ref{commands}. This filter supports the all above options as @ref{commands}.
@section anlms @section anlmf, anlms
Apply Normalized Least-Mean-Squares algorithm to the first audio stream using the second audio stream. Apply Normalized Least-Mean-(Squares|Fourth) algorithm to the first audio stream using the second audio stream.
This adaptive filter is used to mimic a desired filter by finding the filter coefficients that This adaptive filter is used to mimic a desired filter by finding the filter coefficients that
relate to producing the least mean square of the error signal (difference between the desired, relate to producing the least mean square of the error signal (difference between the desired,

View File

@@ -71,6 +71,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
OBJS-$(CONFIG_AMULTIPLY_FILTER) += af_amultiply.o OBJS-$(CONFIG_AMULTIPLY_FILTER) += af_amultiply.o
OBJS-$(CONFIG_ANEQUALIZER_FILTER) += af_anequalizer.o OBJS-$(CONFIG_ANEQUALIZER_FILTER) += af_anequalizer.o
OBJS-$(CONFIG_ANLMDN_FILTER) += af_anlmdn.o OBJS-$(CONFIG_ANLMDN_FILTER) += af_anlmdn.o
OBJS-$(CONFIG_ANLMF_FILTER) += af_anlms.o
OBJS-$(CONFIG_ANLMS_FILTER) += af_anlms.o OBJS-$(CONFIG_ANLMS_FILTER) += af_anlms.o
OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o OBJS-$(CONFIG_ANULL_FILTER) += af_anull.o
OBJS-$(CONFIG_APAD_FILTER) += af_apad.o OBJS-$(CONFIG_APAD_FILTER) += af_apad.o

View File

@@ -54,6 +54,8 @@ typedef struct AudioNLMSContext {
AVFrame *frame[2]; AVFrame *frame[2];
int anlmf;
AVFloatDSPContext *fdsp; AVFloatDSPContext *fdsp;
} AudioNLMSContext; } AudioNLMSContext;
@@ -74,7 +76,7 @@ static const AVOption anlms_options[] = {
{ NULL } { NULL }
}; };
AVFILTER_DEFINE_CLASS(anlms); AVFILTER_DEFINE_CLASS_EXT(anlms, "anlm(f|s)", anlms_options);
static int query_formats(AVFilterContext *ctx) static int query_formats(AVFilterContext *ctx)
{ {
@@ -130,6 +132,8 @@ static float process_sample(AudioNLMSContext *s, float input, float desired,
norm = s->eps + sum; norm = s->eps + sum;
b = mu * e / norm; b = mu * e / norm;
if (s->anlmf)
b *= 4.f * e * e;
memcpy(tmp, delay + offset, order * sizeof(float)); memcpy(tmp, delay + offset, order * sizeof(float));
@@ -241,6 +245,7 @@ static int config_output(AVFilterLink *outlink)
AVFilterContext *ctx = outlink->src; AVFilterContext *ctx = outlink->src;
AudioNLMSContext *s = ctx->priv; AudioNLMSContext *s = ctx->priv;
s->anlmf = !strcmp(ctx->filter->name, "anlmf");
s->kernel_size = FFALIGN(s->order, 16); s->kernel_size = FFALIGN(s->order, 16);
if (!s->offset) if (!s->offset)
@@ -312,3 +317,18 @@ const AVFilter ff_af_anlms = {
.flags = AVFILTER_FLAG_SLICE_THREADS, .flags = AVFILTER_FLAG_SLICE_THREADS,
.process_command = ff_filter_process_command, .process_command = ff_filter_process_command,
}; };
const AVFilter ff_af_anlmf = {
.name = "anlmf",
.description = NULL_IF_CONFIG_SMALL("Apply Normalized Least-Mean-Fourth algorithm to first audio stream."),
.priv_size = sizeof(AudioNLMSContext),
.priv_class = &anlms_class,
.init = init,
.uninit = uninit,
.activate = activate,
FILTER_INPUTS(inputs),
FILTER_OUTPUTS(outputs),
FILTER_QUERY_FUNC(query_formats),
.flags = AVFILTER_FLAG_SLICE_THREADS,
.process_command = ff_filter_process_command,
};

View File

@@ -64,6 +64,7 @@ extern const AVFilter ff_af_amix;
extern const AVFilter ff_af_amultiply; extern const AVFilter ff_af_amultiply;
extern const AVFilter ff_af_anequalizer; extern const AVFilter ff_af_anequalizer;
extern const AVFilter ff_af_anlmdn; extern const AVFilter ff_af_anlmdn;
extern const AVFilter ff_af_anlmf;
extern const AVFilter ff_af_anlms; extern const AVFilter ff_af_anlms;
extern const AVFilter ff_af_anull; extern const AVFilter ff_af_anull;
extern const AVFilter ff_af_apad; extern const AVFilter ff_af_apad;

View File

@@ -30,7 +30,7 @@
#include "libavutil/version.h" #include "libavutil/version.h"
#define LIBAVFILTER_VERSION_MAJOR 8 #define LIBAVFILTER_VERSION_MAJOR 8
#define LIBAVFILTER_VERSION_MINOR 20 #define LIBAVFILTER_VERSION_MINOR 21
#define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_MICRO 100