Browse code

avfilter/avf_showcqt: change fft left-right separation

This simplifies the code

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>

Muhammad Faiz authored on 2015/09/14 18:23:58
Showing 1 changed files
... ...
@@ -68,8 +68,7 @@ typedef struct {
68 68
     AVFrame *outpicref;
69 69
     FFTContext *fft_context;
70 70
     FFTComplex *fft_data;
71
-    FFTComplex *fft_result_left;
72
-    FFTComplex *fft_result_right;
71
+    FFTComplex *fft_result;
73 72
     uint8_t *spectogram;
74 73
     SparseCoeff *coeff_sort;
75 74
     SparseCoeff *coeffs[VIDEO_WIDTH];
... ...
@@ -125,8 +124,7 @@ static av_cold void uninit(AVFilterContext *ctx)
125 125
     for (k = 0; k < VIDEO_WIDTH; k++)
126 126
         av_freep(&s->coeffs[k]);
127 127
     av_freep(&s->fft_data);
128
-    av_freep(&s->fft_result_left);
129
-    av_freep(&s->fft_result_right);
128
+    av_freep(&s->fft_result);
130 129
     av_freep(&s->coeff_sort);
131 130
     av_freep(&s->spectogram);
132 131
     av_freep(&s->font_alpha);
... ...
@@ -345,11 +343,10 @@ static int config_output(AVFilterLink *outlink)
345 345
 
346 346
     s->fft_data         = av_malloc_array(fft_len, sizeof(*s->fft_data));
347 347
     s->coeff_sort       = av_malloc_array(fft_len, sizeof(*s->coeff_sort));
348
-    s->fft_result_left  = av_malloc_array(fft_len, sizeof(*s->fft_result_left));
349
-    s->fft_result_right = av_malloc_array(fft_len, sizeof(*s->fft_result_right));
348
+    s->fft_result       = av_malloc_array(fft_len + 1, sizeof(*s->fft_result));
350 349
     s->fft_context      = av_fft_init(s->fft_bits, 0);
351 350
 
352
-    if (!s->fft_data || !s->coeff_sort || !s->fft_result_left || !s->fft_result_right || !s->fft_context)
351
+    if (!s->fft_data || !s->coeff_sort || !s->fft_result || !s->fft_context)
353 352
         return AVERROR(ENOMEM);
354 353
 
355 354
 #if CONFIG_LIBFREETYPE
... ...
@@ -541,43 +538,32 @@ static int plot_cqt(AVFilterLink *inlink)
541 541
     int font_height = (FONT_HEIGHT/2) * video_scale;
542 542
 
543 543
     /* real part contains left samples, imaginary part contains right samples */
544
-    memcpy(s->fft_result_left, s->fft_data, fft_len * sizeof(*s->fft_data));
545
-    av_fft_permute(s->fft_context, s->fft_result_left);
546
-    av_fft_calc(s->fft_context, s->fft_result_left);
547
-
548
-    /* separate left and right, (and multiply by 2.0) */
549
-    s->fft_result_right[0].re = 2.0f * s->fft_result_left[0].im;
550
-    s->fft_result_right[0].im = 0;
551
-    s->fft_result_left[0].re = 2.0f * s->fft_result_left[0].re;
552
-    s->fft_result_left[0].im = 0;
553
-    for (x = 1; x <= fft_len >> 1; x++) {
554
-        FFTSample tmpy = s->fft_result_left[fft_len-x].im - s->fft_result_left[x].im;
555
-
556
-        s->fft_result_right[x].re = s->fft_result_left[x].im + s->fft_result_left[fft_len-x].im;
557
-        s->fft_result_right[x].im = s->fft_result_left[x].re - s->fft_result_left[fft_len-x].re;
558
-        s->fft_result_right[fft_len-x].re = s->fft_result_right[x].re;
559
-        s->fft_result_right[fft_len-x].im = -s->fft_result_right[x].im;
560
-
561
-        s->fft_result_left[x].re = s->fft_result_left[x].re + s->fft_result_left[fft_len-x].re;
562
-        s->fft_result_left[x].im = tmpy;
563
-        s->fft_result_left[fft_len-x].re = s->fft_result_left[x].re;
564
-        s->fft_result_left[fft_len-x].im = -s->fft_result_left[x].im;
565
-    }
544
+    memcpy(s->fft_result, s->fft_data, fft_len * sizeof(*s->fft_data));
545
+    av_fft_permute(s->fft_context, s->fft_result);
546
+    av_fft_calc(s->fft_context, s->fft_result);
547
+    s->fft_result[fft_len] = s->fft_result[0];
566 548
 
567 549
     /* calculating cqt */
568 550
     for (x = 0; x < VIDEO_WIDTH; x++) {
569 551
         int u;
570
-        FFTComplex l = {0,0};
571
-        FFTComplex r = {0,0};
552
+        FFTComplex v = {0,0};
553
+        FFTComplex w = {0,0};
554
+        FFTComplex l, r;
572 555
 
573 556
         for (u = 0; u < s->coeffs_len[x]; u++) {
574 557
             FFTSample value = s->coeffs[x][u].value;
575 558
             int index = s->coeffs[x][u].index;
576
-            l.re += value * s->fft_result_left[index].re;
577
-            l.im += value * s->fft_result_left[index].im;
578
-            r.re += value * s->fft_result_right[index].re;
579
-            r.im += value * s->fft_result_right[index].im;
559
+            v.re += value * s->fft_result[index].re;
560
+            v.im += value * s->fft_result[index].im;
561
+            w.re += value * s->fft_result[fft_len - index].re;
562
+            w.im += value * s->fft_result[fft_len - index].im;
580 563
         }
564
+
565
+        /* separate left and right, (and multiply by 2.0) */
566
+        l.re = v.re + w.re;
567
+        l.im = v.im - w.im;
568
+        r.re = w.im + v.im;
569
+        r.im = w.re - v.re;
581 570
         /* result is power, not amplitude */
582 571
         result[x][0] = l.re * l.re + l.im * l.im;
583 572
         result[x][2] = r.re * r.re + r.im * r.im;