History

avfilter/af_afftdn: use RDFT instead

Makes spectral filtering less crude.

Paul B Mahol committed 4 years ago

Commit df8163a1 parent b8af5741 file · +16 −24Browse files

Showing the changes to libavfilter (1 of 1 file). Show all

Unified · Split

libavfilter/af_afftdn.c+16−24
@@ -66,7 +66,7 @@ typedef struct DeNoiseChannel { · 65 unmodified lines
6666 double *abs_var;
6767 double *rel_var;
6868 double *min_abs_var;
69− AVComplexFloat *fft_in;
69+ float *fft_in;
7070 AVComplexFloat *fft_out;
7171 AVTXContext *fft, *ifft;
7272 av_tx_fn tx_fn, itx_fn;
@@ -606,7 +606,7 @@ static int config_input(AVFilterLink *inlink) · 533 unmodified lines
606606 s->sample_advance = s->sample_rate / 80;
607607 s->window_length = 3 * s->sample_advance;
608608 s->fft_length2 = 1 << (32 - ff_clz(s->window_length));
609− s->fft_length = s->fft_length2 * 2;
609+ s->fft_length = s->fft_length2;
610610 s->buffer_length = s->fft_length * 2;
611611 s->bin_count = s->fft_length2 + 1;
612612
@@ -662,7 +662,7 @@ static int config_input(AVFilterLink *inlink) · 49 unmodified lines
662662
663663 for (int ch = 0; ch < inlink->channels; ch++) {
664664 DeNoiseChannel *dnch = &s->dnch[ch];
665− float scale = 0.f;
665+ float scale = 1.f;
666666
667667 switch (s->noise_type) {
668668 case WHITE_NOISE:
@@ -711,12 +711,12 @@ static int config_input(AVFilterLink *inlink) · 42 unmodified lines
711711 dnch->abs_var = av_calloc(s->bin_count, sizeof(*dnch->abs_var));
712712 dnch->rel_var = av_calloc(s->bin_count, sizeof(*dnch->rel_var));
713713 dnch->min_abs_var = av_calloc(s->bin_count, sizeof(*dnch->min_abs_var));
714− dnch->fft_in = av_calloc(s->fft_length2 + 1, sizeof(*dnch->fft_in));
714+ dnch->fft_in = av_calloc(s->fft_length2, sizeof(*dnch->fft_in));
715715 dnch->fft_out = av_calloc(s->fft_length2 + 1, sizeof(*dnch->fft_out));
716− ret = av_tx_init(&dnch->fft, &dnch->tx_fn, AV_TX_FLOAT_FFT, 0, s->fft_length2, &scale, 0);
716+ ret = av_tx_init(&dnch->fft, &dnch->tx_fn, AV_TX_FLOAT_RDFT, 0, s->fft_length2, &scale, 0);
717717 if (ret < 0)
718718 return ret;
719− ret = av_tx_init(&dnch->ifft, &dnch->itx_fn, AV_TX_FLOAT_FFT, 1, s->fft_length2, &scale, 0);
719+ ret = av_tx_init(&dnch->ifft, &dnch->itx_fn, AV_TX_FLOAT_RDFT, 1, s->fft_length2, &scale, 0);
720720 if (ret < 0)
721721 return ret;
722722 dnch->spread_function = av_calloc(s->number_of_bands * s->number_of_bands,
@@ -816,7 +816,7 @@ static int config_input(AVFilterLink *inlink) · 93 unmodified lines
816816 if (!s->winframe)
817817 return AVERROR(ENOMEM);
818818
819− wscale = sqrt(16.0 / (9.0 * s->fft_length));
819+ wscale = sqrt(8.0 / (9.0 * s->fft_length));
820820 sum = 0.0;
821821 for (int i = 0; i < s->window_length; i++) {
822822 double d10 = sin(i * M_PI / s->window_length);
@@ -863,15 +863,11 @@ static void sample_noise_block(AudioFFTDeNoiseContext *s, · 40 unmodified lines
863863 double mag2, var = 0.0, avr = 0.0, avi = 0.0;
864864 int edge, j, k, n, edgemax;
865865
866− for (int i = 0; i < s->window_length; i++) {
867− dnch->fft_in[i].re = s->window[i] * src[i] * (1LL << 23);
868− dnch->fft_in[i].im = 0.0;
869− }
866+ for (int i = 0; i < s->window_length; i++)
867+ dnch->fft_in[i] = s->window[i] * src[i] * (1LL << 23);
870868
871− for (int i = s->window_length; i < s->fft_length2; i++) {
872− dnch->fft_in[i].re = 0.0;
873− dnch->fft_in[i].im = 0.0;
874− }
869+ for (int i = s->window_length; i < s->fft_length2; i++)
870+ dnch->fft_in[i] = 0.0;
875871
876872 dnch->tx_fn(dnch->fft, dnch->fft_out, dnch->fft_in, sizeof(float));
877873
@@ -1013,15 +1009,11 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job · 135 unmodified lines
10131009 dnch->sfm_threshold += dnch->sfm_alpha * (0.5 + (1.0 / 640) * dnch->sfm_fail_total);
10141010 }
10151011
1016− for (int m = 0; m < s->window_length; m++) {
1017− dnch->fft_in[m].re = s->window[m] * src[m] * (1LL << 23);
1018− dnch->fft_in[m].im = 0;
1019− }
1012+ for (int m = 0; m < s->window_length; m++)
1013+ dnch->fft_in[m] = s->window[m] * src[m] * (1LL << 23);
10201014
1021− for (int m = s->window_length; m < s->fft_length2; m++) {
1022− dnch->fft_in[m].re = 0;
1023− dnch->fft_in[m].im = 0;
1024− }
1015+ for (int m = s->window_length; m < s->fft_length2; m++)
1016+ dnch->fft_in[m] = 0;
10251017
10261018 dnch->tx_fn(dnch->fft, dnch->fft_out, dnch->fft_in, sizeof(float));
10271019
@@ -1033,7 +1025,7 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job · 5 unmodified lines
10331025 dnch->itx_fn(dnch->ifft, dnch->fft_in, dnch->fft_out, sizeof(float));
10341026
10351027 for (int m = 0; m < s->window_length; m++)
1036− dst[m] += s->window[m] * dnch->fft_in[m].re / (1LL << 23);
1028+ dst[m] += s->window[m] * dnch->fft_in[m] / (1LL << 23);
10371029 }
10381030
10391031 return 0;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t