@ -19,8 +19,6 @@
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
# include <complex.h>
# include "libavutil/intreadwrite.h"
# include "libavutil/avstring.h"
# include "libavutil/opt.h"
@ -114,13 +112,17 @@ static void draw_curves(AVFilterContext *ctx, AVFilterLink *inlink, AVFrame *out
av_parse_color ( fg , color , - 1 , ctx ) ;
for ( f = 0 ; f < s - > w ; f + + ) {
double complex z ;
double complex H = 1 ;
double zr , zi , zr2 , zi2 ;
double Hr , Hi ;
double Hmag = 1 ;
double w ;
int v , y , x ;
w = M_PI * ( s - > fscale ? pow ( s - > w - 1 , f / s - > w ) : f ) / ( s - > w - 1 ) ;
z = 1. / cexp ( I * w ) ;
zr = cos ( w ) ;
zr2 = zr * zr ;
zi = - sin ( w ) ;
zi2 = zi * zi ;
for ( n = 0 ; n < s - > nb_filters ; n + + ) {
if ( s - > filters [ n ] . channel ! = ch | |
@ -130,12 +132,19 @@ static void draw_curves(AVFilterContext *ctx, AVFilterLink *inlink, AVFrame *out
for ( i = 0 ; i < FILTER_ORDER / 2 ; i + + ) {
FoSection * S = & s - > filters [ n ] . section [ i ] ;
H * = ( ( ( ( ( S - > b4 * z + S - > b3 ) * z + S - > b2 ) * z + S - > b1 ) * z + S - > b0 ) /
( ( ( ( S - > a4 * z + S - > a3 ) * z + S - > a2 ) * z + S - > a1 ) * z + S - > a0 ) ) ;
/* H *= (((((S->b4 * z + S->b3) * z + S->b2) * z + S->b1) * z + S->b0) /
( ( ( ( S - > a4 * z + S - > a3 ) * z + S - > a2 ) * z + S - > a1 ) * z + S - > a0 ) ) ; */
Hr = S - > b4 * ( 1 - 8 * zr2 * zi2 ) + S - > b2 * ( zr2 - zi2 ) + zr * ( S - > b1 + S - > b3 * ( zr2 - 3 * zi2 ) ) + S - > b0 ;
Hi = zi * ( S - > b3 * ( 3 * zr2 - zi2 ) + S - > b1 + 2 * zr * ( 2 * S - > b4 * ( zr2 - zi2 ) + S - > b2 ) ) ;
Hmag * = hypot ( Hr , Hi ) ;
Hr = S - > a4 * ( 1 - 8 * zr2 * zi2 ) + S - > a2 * ( zr2 - zi2 ) + zr * ( S - > a1 + S - > a3 * ( zr2 - 3 * zi2 ) ) + S - > a0 ;
Hi = zi * ( S - > a3 * ( 3 * zr2 - zi2 ) + S - > a1 + 2 * zr * ( 2 * S - > a4 * ( zr2 - zi2 ) + S - > a2 ) ) ;
Hmag / = hypot ( Hr , Hi ) ;
}
}
v = av_clip ( ( 1. + - 20 * log10 ( cabs ( H ) ) / s - > mag ) * s - > h / 2 , 0 , s - > h - 1 ) ;
v = av_clip ( ( 1. + - 20 * log10 ( Hmag ) / s - > mag ) * s - > h / 2 , 0 , s - > h - 1 ) ;
x = lrint ( f ) ;
if ( prev_v = = - 1 )
prev_v = v ;