diff mbox series

[FFmpeg-devel,1/3] avfilter/af_apsyclip: fix FFT bin indexing

Message ID 20220129010827.307903-1-jcj83429@gmail.com
State Accepted
Commit b4ad13420f57ff7b2a411f2f70217635d1516a80
Headers show
Series [FFmpeg-devel,1/3] avfilter/af_apsyclip: fix FFT bin indexing | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished
andriy/make_aarch64_jetson success Make finished
andriy/make_fate_aarch64_jetson success Make fate finished

Commit Message

Jason Jang Jan. 29, 2022, 1:08 a.m. UTC
With a complex FFT instead of real FFT, the negative frequencies
are not dropped from the spectrum output, so they need to be scaled
when the positive frequencies are scaled. The location of the top
bin is also different.

Signed-off-by: Jason Jang <jcj83429@gmail.com>
---
 libavfilter/af_apsyclip.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)
diff mbox series

Patch

diff --git a/libavfilter/af_apsyclip.c b/libavfilter/af_apsyclip.c
index dc3a8e9..0bc469c 100644
--- a/libavfilter/af_apsyclip.c
+++ b/libavfilter/af_apsyclip.c
@@ -292,10 +292,9 @@  static void calculate_mask_curve(AudioPsyClipContext *s,
         if (i == 0) {
             magnitude = FFABS(spectrum[0]);
         } else if (i == s->fft_size / 2) {
-            magnitude = FFABS(spectrum[1]);
+            magnitude = FFABS(spectrum[s->fft_size]);
         } else {
-            // although the negative frequencies are omitted because they are redundant,
-            // the magnitude of the positive frequencies are not doubled.
+            // Because the input signal is real, the + and - frequencies are redundant.
             // Multiply the magnitude by 2 to simulate adding up the + and - frequencies.
             magnitude = hypotf(spectrum[2 * i], spectrum[2 * i + 1]) * 2;
         }
@@ -315,10 +314,9 @@  static void calculate_mask_curve(AudioPsyClipContext *s,
     for (int i = s->num_psy_bins; i < s->fft_size / 2 + 1; i++) {
         float magnitude;
         if (i == s->fft_size / 2) {
-            magnitude = FFABS(spectrum[1]);
+            magnitude = FFABS(spectrum[s->fft_size]);
         } else {
-            // although the negative frequencies are omitted because they are redundant,
-            // the magnitude of the positive frequencies are not doubled.
+            // Because the input signal is real, the + and - frequencies are redundant.
             // Multiply the magnitude by 2 to simulate adding up the + and - frequencies.
             magnitude = hypotf(spectrum[2 * i], spectrum[2 * i + 1]) * 2;
         }
@@ -360,19 +358,20 @@  static void limit_clip_spectrum(AudioPsyClipContext *s,
     for (int i = 1; i < s->fft_size / 2; i++) {
         float real = clip_spectrum[i * 2];
         float imag = clip_spectrum[i * 2 + 1];
-        // although the negative frequencies are omitted because they are redundant,
-        // the magnitude of the positive frequencies are not doubled.
+        // Because the input signal is real, the + and - frequencies are redundant.
         // Multiply the magnitude by 2 to simulate adding up the + and - frequencies.
         relative_distortion_level = hypotf(real, imag) * 2 / mask_curve[i];
         if (relative_distortion_level > 1.0) {
             clip_spectrum[i * 2] /= relative_distortion_level;
             clip_spectrum[i * 2 + 1] /= relative_distortion_level;
+            clip_spectrum[s->fft_size * 2 - i * 2] /= relative_distortion_level;
+            clip_spectrum[s->fft_size * 2 - i * 2 + 1] /= relative_distortion_level;
         }
     }
     // bin N/2
-    relative_distortion_level = FFABS(clip_spectrum[1]) / mask_curve[s->fft_size / 2];
+    relative_distortion_level = FFABS(clip_spectrum[s->fft_size]) / mask_curve[s->fft_size / 2];
     if (relative_distortion_level > 1.f)
-        clip_spectrum[1] /= relative_distortion_level;
+        clip_spectrum[s->fft_size] /= relative_distortion_level;
 }
 
 static void r2c(float *buffer, int size)