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

Unified · Split

libavfilter/af_afftdn.c+16−24
@@ -66,7 +66,7 @@ typedef struct DeNoiseChannel { · 65 unmodified lines
66 double *abs_var;66 double *abs_var;
67 double *rel_var;67 double *rel_var;
68 double *min_abs_var;68 double *min_abs_var;
69 AVComplexFloat *fft_in;69 float *fft_in;
70 AVComplexFloat *fft_out;70 AVComplexFloat *fft_out;
71 AVTXContext *fft, *ifft;71 AVTXContext *fft, *ifft;
72 av_tx_fn tx_fn, itx_fn;72 av_tx_fn tx_fn, itx_fn;
@@ -606,7 +606,7 @@ static int config_input(AVFilterLink *inlink) · 533 unmodified lines
606 s->sample_advance = s->sample_rate / 80;606 s->sample_advance = s->sample_rate / 80;
607 s->window_length = 3 * s->sample_advance;607 s->window_length = 3 * s->sample_advance;
608 s->fft_length2 = 1 << (32 - ff_clz(s->window_length));608 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;
610 s->buffer_length = s->fft_length * 2;610 s->buffer_length = s->fft_length * 2;
611 s->bin_count = s->fft_length2 + 1;611 s->bin_count = s->fft_length2 + 1;
612 612
@@ -662,7 +662,7 @@ static int config_input(AVFilterLink *inlink) · 49 unmodified lines
662 662
663 for (int ch = 0; ch < inlink->channels; ch++) {663 for (int ch = 0; ch < inlink->channels; ch++) {
664 DeNoiseChannel *dnch = &s->dnch[ch];664 DeNoiseChannel *dnch = &s->dnch[ch];
665 float scale = 0.f;665 float scale = 1.f;
666 666
667 switch (s->noise_type) {667 switch (s->noise_type) {
668 case WHITE_NOISE:668 case WHITE_NOISE:
@@ -711,12 +711,12 @@ static int config_input(AVFilterLink *inlink) · 42 unmodified lines
711 dnch->abs_var = av_calloc(s->bin_count, sizeof(*dnch->abs_var));711 dnch->abs_var = av_calloc(s->bin_count, sizeof(*dnch->abs_var));
712 dnch->rel_var = av_calloc(s->bin_count, sizeof(*dnch->rel_var));712 dnch->rel_var = av_calloc(s->bin_count, sizeof(*dnch->rel_var));
713 dnch->min_abs_var = av_calloc(s->bin_count, sizeof(*dnch->min_abs_var));713 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));
715 dnch->fft_out = av_calloc(s->fft_length2 + 1, sizeof(*dnch->fft_out));715 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);
717 if (ret < 0)717 if (ret < 0)
718 return ret;718 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);
720 if (ret < 0)720 if (ret < 0)
721 return ret;721 return ret;
722 dnch->spread_function = av_calloc(s->number_of_bands * s->number_of_bands,722 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
816 if (!s->winframe)816 if (!s->winframe)
817 return AVERROR(ENOMEM);817 return AVERROR(ENOMEM);
818 818
819 wscale = sqrt(16.0 / (9.0 * s->fft_length));819 wscale = sqrt(8.0 / (9.0 * s->fft_length));
820 sum = 0.0;820 sum = 0.0;
821 for (int i = 0; i < s->window_length; i++) {821 for (int i = 0; i < s->window_length; i++) {
822 double d10 = sin(i * M_PI / s->window_length);822 double d10 = sin(i * M_PI / s->window_length);
@@ -863,15 +863,11 @@ static void sample_noise_block(AudioFFTDeNoiseContext *s, · 40 unmodified lines
863 double mag2, var = 0.0, avr = 0.0, avi = 0.0;863 double mag2, var = 0.0, avr = 0.0, avi = 0.0;
864 int edge, j, k, n, edgemax;864 int edge, j, k, n, edgemax;
865 865
866 for (int i = 0; i < s->window_length; i++) {866 for (int i = 0; i < s->window_length; i++)
867 dnch->fft_in[i].re = s->window[i] * src[i] * (1LL << 23);867 dnch->fft_in[i] = s->window[i] * src[i] * (1LL << 23);
868 dnch->fft_in[i].im = 0.0;
869 }
870 868
871 for (int i = s->window_length; i < s->fft_length2; i++) {869 for (int i = s->window_length; i < s->fft_length2; i++)
872 dnch->fft_in[i].re = 0.0;870 dnch->fft_in[i] = 0.0;
873 dnch->fft_in[i].im = 0.0;
874 }
875 871
876 dnch->tx_fn(dnch->fft, dnch->fft_out, dnch->fft_in, sizeof(float));872 dnch->tx_fn(dnch->fft, dnch->fft_out, dnch->fft_in, sizeof(float));
877 873
@@ -1013,15 +1009,11 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job · 135 unmodified lines
1013 dnch->sfm_threshold += dnch->sfm_alpha * (0.5 + (1.0 / 640) * dnch->sfm_fail_total);1009 dnch->sfm_threshold += dnch->sfm_alpha * (0.5 + (1.0 / 640) * dnch->sfm_fail_total);
1014 }1010 }
1015 1011
1016 for (int m = 0; m < s->window_length; m++) {1012 for (int m = 0; m < s->window_length; m++)
1017 dnch->fft_in[m].re = s->window[m] * src[m] * (1LL << 23);1013 dnch->fft_in[m] = s->window[m] * src[m] * (1LL << 23);
1018 dnch->fft_in[m].im = 0;
1019 }
1020 1014
1021 for (int m = s->window_length; m < s->fft_length2; m++) {1015 for (int m = s->window_length; m < s->fft_length2; m++)
1022 dnch->fft_in[m].re = 0;1016 dnch->fft_in[m] = 0;
1023 dnch->fft_in[m].im = 0;
1024 }
1025 1017
1026 dnch->tx_fn(dnch->fft, dnch->fft_out, dnch->fft_in, sizeof(float));1018 dnch->tx_fn(dnch->fft, dnch->fft_out, dnch->fft_in, sizeof(float));
1027 1019
@@ -1033,7 +1025,7 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job · 5 unmodified lines
1033 dnch->itx_fn(dnch->ifft, dnch->fft_in, dnch->fft_out, sizeof(float));1025 dnch->itx_fn(dnch->ifft, dnch->fft_in, dnch->fft_out, sizeof(float));
1034 1026
1035 for (int m = 0; m < s->window_length; m++)1027 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);
1037 }1029 }
1038 1030
1039 return 0;1031 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