Makes spectral filtering less crude.
Unified · Split
| @@ -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; |