From patchwork Sun May 24 17:03:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 19834 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E432444AC39 for ; Sun, 24 May 2020 20:29:28 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BED7068980D; Sun, 24 May 2020 20:29:28 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AB822688069 for ; Sun, 24 May 2020 20:29:22 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id d24so13225019eds.11 for ; Sun, 24 May 2020 10:29:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=lDPbP3H8xHiqX8/OgRPZoXPOGXsHXqslxEUFb1G4RfE=; b=JBtz7frL+oNAQQAmxfwHfRPKYy04Zm2ID++gSLa/1aghGG7ZtjVibwjnrf6q0e1KXF dfMXxpKJ7RfHTgX8EhG34Q3c9wHj86tOYvzZ/gCtQn7fcX8VDZLKXYiejuJIB0nqD0Jk RxiRAgboLk1eK2888dEl9Tw5fS9gDkJ58PZTBc45mf6F/n8uHjIi7sYSZwIklc8BpNWv RZBmdbC4BpvaqZJ/8R2p2/1dlT2+NEcRa5X5FipB72HmRT8lj3cnOTYEQs1LP4bVauPf HFsUPuTxa5oVFUoeVGIvVauR7LMXdhjUallarwdGIq/P0tOdlKn1SYaNDgWnmgaFEgjd +Ksw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=lDPbP3H8xHiqX8/OgRPZoXPOGXsHXqslxEUFb1G4RfE=; b=YwGJoKExO0y1TQufi9dFfX+4ERpZE2ljRkQRnoGVrMvjWQbYCGup6g9zsy9EfbtKV6 OPZJN5WzrRvRIGEJX/7tWGqvoT1l7ls4ZIigPDr3AOXfn70EwY09O9HX8AGIgReQu8Hp K7u55xSxjqWDDEkqi6rfhdMvAKVUwIuQUJn5GwNDtxnQej7bIzp3uo0HOEPnKLcS6RmK dmNuiCfk35/3U25xStUJ1KH3ZjLzQ1kyfBu7rqJWZ/zUEy2xevhNTj2AHQ5h4VHqgjqW CmAV1xDBEbkB2F1pU9FbbaqI/iaWnlmePG4sYnwK71DtFh0vFFeeVUJbSyRsk7qGq+G7 KOVg== X-Gm-Message-State: AOAM531nixFsTuhudwksxvVHiORG5xg5eouAPwmhXt3ipH4jL1jL0PY3 GR+EpcVGFZANZaMB+WvFinrRT128p8Q= X-Google-Smtp-Source: ABdhPJwYQRCOM51tYISVmc4H0Ra8JNqBHt20EP9SAPGlskxAK1BCLfHtZh4tI4buuwI4uqOJYGyGGw== X-Received: by 2002:a17:906:3095:: with SMTP id 21mr16047598ejv.32.1590339798028; Sun, 24 May 2020 10:03:18 -0700 (PDT) Received: from localhost.localdomain ([109.227.32.69]) by smtp.gmail.com with ESMTPSA id u10sm13431059edb.65.2020.05.24.10.03.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 24 May 2020 10:03:17 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Sun, 24 May 2020 19:03:05 +0200 Message-Id: <20200524170308.9994-1-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH 1/4] avfilter/af_biquads: implement 1st order allpass X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- doc/filters.texi | 3 +++ libavfilter/af_biquads.c | 28 ++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 85a511b205..5af4797b7e 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1568,6 +1568,9 @@ Specify which channels to filter, by default all available are filtered. @item normalize, n Normalize biquad coefficients, by default is disabled. Enabling it will normalize magnitude response at DC to 0dB. + +@item order, o +Set the filter order, can be 1 or 2. Default is 2. @end table @subsection Commands diff --git a/libavfilter/af_biquads.c b/libavfilter/af_biquads.c index a2f7e3f061..81cdb0c10e 100644 --- a/libavfilter/af_biquads.c +++ b/libavfilter/af_biquads.c @@ -113,6 +113,7 @@ typedef struct BiquadsContext { double mix; uint64_t channels; int normalize; + int order; double a0, a1, a2; double b0, b1, b2; @@ -264,6 +265,7 @@ static int config_filter(AVFilterLink *outlink, int reset) AVFilterLink *inlink = ctx->inputs[0]; double A = ff_exp10(s->gain / 40); double w0 = 2 * M_PI * s->frequency / inlink->sample_rate; + double K = tan(w0 / 2.); double alpha, beta; if (w0 > M_PI) { @@ -389,12 +391,24 @@ static int config_filter(AVFilterLink *outlink, int reset) } break; case allpass: - s->a0 = 1 + alpha; - s->a1 = -2 * cos(w0); - s->a2 = 1 - alpha; - s->b0 = 1 - alpha; - s->b1 = -2 * cos(w0); - s->b2 = 1 + alpha; + switch (s->order) { + case 1: + s->a0 = 1.; + s->a1 = -(1. - K) / (1. + K); + s->a2 = 0.; + s->b0 = s->a1; + s->b1 = s->a0; + s->b2 = 0.; + break; + case 2: + s->a0 = 1 + alpha; + s->a1 = -2 * cos(w0); + s->a2 = 1 - alpha; + s->b0 = 1 - alpha; + s->b1 = -2 * cos(w0); + s->b2 = 1 + alpha; + break; + } break; default: av_assert0(0); @@ -773,6 +787,8 @@ static const AVOption allpass_options[] = { {"c", "set channels to filter", OFFSET(channels), AV_OPT_TYPE_CHANNEL_LAYOUT, {.i64=-1}, INT64_MIN, INT64_MAX, FLAGS}, {"normalize", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, {"n", "normalize coefficients", OFFSET(normalize), AV_OPT_TYPE_BOOL, {.i64=0}, 0, 1, FLAGS}, + {"order", "set filter order", OFFSET(order), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS}, + {"o", "set filter order", OFFSET(order), AV_OPT_TYPE_INT, {.i64=2}, 1, 2, FLAGS}, {NULL} };