Commit 61926b6c authored by Muhammad Faiz's avatar Muhammad Faiz

swresample/resample: use uniform normalization

this gives better frequency response

update swresample fate and other fates
that depend on resampling
Signed-off-by: 's avatarMuhammad Faiz <mfcc64@gmail.com>
parent dbc932e7
...@@ -149,6 +149,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -149,6 +149,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
double *tab = av_malloc_array(tap_count+1, sizeof(*tab)); double *tab = av_malloc_array(tap_count+1, sizeof(*tab));
double *sin_lut = av_malloc_array(ph_nb, sizeof(*sin_lut)); double *sin_lut = av_malloc_array(ph_nb, sizeof(*sin_lut));
const int center= (tap_count-1)/2; const int center= (tap_count-1)/2;
double norm = 0;
int ret = AVERROR(ENOMEM); int ret = AVERROR(ENOMEM);
if (!tab || !sin_lut) if (!tab || !sin_lut)
...@@ -160,10 +161,9 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -160,10 +161,9 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
if (factor == 1.0) { if (factor == 1.0) {
for (ph = 0; ph < ph_nb; ph++) for (ph = 0; ph < ph_nb; ph++)
sin_lut[ph] = sin(M_PI * ph / phase_count); sin_lut[ph] = sin(M_PI * ph / phase_count) * (center & 1 ? 1 : -1);
} }
for(ph = 0; ph < ph_nb; ph++) { for(ph = 0; ph < ph_nb; ph++) {
double norm = 0;
s = sin_lut[ph]; s = sin_lut[ph];
for(i=0;i<=tap_count;i++) { for(i=0;i<=tap_count;i++) {
x = M_PI * ((double)(i - center) - (double)ph / phase_count) * factor; x = M_PI * ((double)(i - center) - (double)ph / phase_count) * factor;
...@@ -194,7 +194,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -194,7 +194,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
tab[i] = y; tab[i] = y;
s = -s; s = -s;
if (i < tap_count) if (!ph && i < tap_count)
norm += y; norm += y;
} }
...@@ -211,7 +211,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -211,7 +211,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
else { else {
for (i = 1; i <= tap_count; i++) for (i = 1; i <= tap_count; i++)
((int16_t*)filter)[(phase_count-ph) * alloc + tap_count-i] = ((int16_t*)filter)[(phase_count-ph) * alloc + tap_count-i] =
av_clip_int16(lrintf(tab[i] * scale / (norm - tab[0] + tab[tap_count]))); av_clip_int16(lrintf(tab[i] * scale / norm));
} }
break; break;
case AV_SAMPLE_FMT_S32P: case AV_SAMPLE_FMT_S32P:
...@@ -225,7 +225,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -225,7 +225,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
else { else {
for (i = 1; i <= tap_count; i++) for (i = 1; i <= tap_count; i++)
((int32_t*)filter)[(phase_count-ph) * alloc + tap_count-i] = ((int32_t*)filter)[(phase_count-ph) * alloc + tap_count-i] =
av_clipl_int32(llrint(tab[i] * scale / (norm - tab[0] + tab[tap_count]))); av_clipl_int32(llrint(tab[i] * scale / norm));
} }
break; break;
case AV_SAMPLE_FMT_FLTP: case AV_SAMPLE_FMT_FLTP:
...@@ -238,7 +238,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -238,7 +238,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
} }
else { else {
for (i = 1; i <= tap_count; i++) for (i = 1; i <= tap_count; i++)
((float*)filter)[(phase_count-ph) * alloc + tap_count-i] = tab[i] * scale / (norm - tab[0] + tab[tap_count]); ((float*)filter)[(phase_count-ph) * alloc + tap_count-i] = tab[i] * scale / norm;
} }
break; break;
case AV_SAMPLE_FMT_DBLP: case AV_SAMPLE_FMT_DBLP:
...@@ -251,7 +251,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap ...@@ -251,7 +251,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
} }
else { else {
for (i = 1; i <= tap_count; i++) for (i = 1; i <= tap_count; i++)
((double*)filter)[(phase_count-ph) * alloc + tap_count-i] = tab[i] * scale / (norm - tab[0] + tab[tap_count]); ((double*)filter)[(phase_count-ph) * alloc + tap_count-i] = tab[i] * scale / norm;
} }
break; break;
} }
......
This diff is collapsed.
75859976d7098588aeaebbc5551484a9 *tests/data/fate/acodec-roqaudio.roq 75859976d7098588aeaebbc5551484a9 *tests/data/fate/acodec-roqaudio.roq
265992 tests/data/fate/acodec-roqaudio.roq 265992 tests/data/fate/acodec-roqaudio.roq
73d5aaaab9488e63f1cf6fc324c7a9a2 *tests/data/fate/acodec-roqaudio.out.wav 2057ed235e9d4e727e13bf57f3891093 *tests/data/fate/acodec-roqaudio.out.wav
stddev: 4481.70 PSNR: 23.30 MAXDIFF:46250 bytes: 1058400/ 1058400 stddev: 4481.70 PSNR: 23.30 MAXDIFF:46250 bytes: 1058400/ 1058400
f6908214498489799b50e332ac42ebf3 *tests/data/fate/acodec-s302m.mpegts a69563c4c5db97d1b313c2fd7a193dd4 *tests/data/fate/acodec-s302m.mpegts
1589164 tests/data/fate/acodec-s302m.mpegts 1589164 tests/data/fate/acodec-s302m.mpegts
f9b6528eee1aea04640ee83400c78689 *tests/data/fate/acodec-s302m.out.wav 2c033ed1d9029ed03e08c1d01dcefd99 *tests/data/fate/acodec-s302m.out.wav
stddev: 986.97 PSNR: 36.44 MAXDIFF:18642 bytes: 1058400/ 1056708 stddev: 986.98 PSNR: 36.44 MAXDIFF:18642 bytes: 1058400/ 1056708
11be3e5caa2892236b3475c3f7807b76 *./tests/data/lavf/lavf.dv 3bcb02ee889b8b2da19cae79d0f1c27d *./tests/data/lavf/lavf.dv
3600000 ./tests/data/lavf/lavf.dv 3600000 ./tests/data/lavf/lavf.dv
./tests/data/lavf/lavf.dv CRC=0x0b2cd3ec ./tests/data/lavf/lavf.dv CRC=0x5a36cc70
e9949bc767924e1e7d28856029fee024 *./tests/data/lavf/lavf.dv f827583ae54e590d753c37709738fd54 *./tests/data/lavf/lavf.dv
3480000 ./tests/data/lavf/lavf.dv 3480000 ./tests/data/lavf/lavf.dv
./tests/data/lavf/lavf.dv CRC=0xfab17c4a ./tests/data/lavf/lavf.dv CRC=0x8f8074be
87d3b20f656235671383a7eaa2f66330 *./tests/data/lavf/lavf.dv 87d3b20f656235671383a7eaa2f66330 *./tests/data/lavf/lavf.dv
3600000 ./tests/data/lavf/lavf.dv 3600000 ./tests/data/lavf/lavf.dv
./tests/data/lavf/lavf.dv CRC=0xf3e6873c ./tests/data/lavf/lavf.dv CRC=0xf3e6873c
7993da95d8bfe04832e27892c163e562 *./tests/data/lavf/lavf.gxf 1b384e20293a84b274739c147e2b290a *./tests/data/lavf/lavf.gxf
795876 ./tests/data/lavf/lavf.gxf 795876 ./tests/data/lavf/lavf.gxf
./tests/data/lavf/lavf.gxf CRC=0xda7cebbc ./tests/data/lavf/lavf.gxf CRC=0x55b3ec1d
9e873074b5c3ef1d80d233a38e7de156 *./tests/data/lavf/lavf.gxf 411f109b5867e5cb81bc876d3cc5702b *./tests/data/lavf/lavf.gxf
794656 ./tests/data/lavf/lavf.gxf 794656 ./tests/data/lavf/lavf.gxf
./tests/data/lavf/lavf.gxf CRC=0x7f0c9089 ./tests/data/lavf/lavf.gxf CRC=0x0d7e90ea
0638c4d073ac224608baaba16732b68f *./tests/data/lavf/lavf.gxf 0638c4d073ac224608baaba16732b68f *./tests/data/lavf/lavf.gxf
795876 ./tests/data/lavf/lavf.gxf 795876 ./tests/data/lavf/lavf.gxf
./tests/data/lavf/lavf.gxf CRC=0x5ade0285 ./tests/data/lavf/lavf.gxf CRC=0x5ade0285
c61e677b4facc407ca82b1d7c6298484 *./tests/data/lavf/lavf.mxf 2fd59c174dfb213d35e86dea63c0fb13 *./tests/data/lavf/lavf.mxf
525369 ./tests/data/lavf/lavf.mxf 525369 ./tests/data/lavf/lavf.mxf
./tests/data/lavf/lavf.mxf CRC=0xdbfff6f1 ./tests/data/lavf/lavf.mxf CRC=0x9fd3f752
1ae017b5879992431614b1c7ab3b48c5 *./tests/data/lavf/lavf.mxf edb3b610c301362d7b4c12f06f8d2782 *./tests/data/lavf/lavf.mxf
560697 ./tests/data/lavf/lavf.mxf 560697 ./tests/data/lavf/lavf.mxf
./tests/data/lavf/lavf.mxf CRC=0x11a6178e ./tests/data/lavf/lavf.mxf CRC=0xc51717ef
27fac91dce279630a04b94b93518a9d8 *./tests/data/lavf/lavf.mxf a6ba421f38ee5ec46e181225c632fee4 *./tests/data/lavf/lavf.mxf
525369 ./tests/data/lavf/lavf.mxf 525369 ./tests/data/lavf/lavf.mxf
./tests/data/lavf/lavf.mxf CRC=0xdbfff6f1 ./tests/data/lavf/lavf.mxf CRC=0x9fd3f752
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment