This simplifies the code
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
... | ... |
@@ -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; |