748{
749 int i;
750 int32_t *xr = xl + 576*(nch - 1);
752
753 static const int32_t g_win[] = {
754 -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
755 -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
756 -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
757 -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
758 -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
759 -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
760 -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
761 -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
762 -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
763 -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
764 -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
765 -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
766 -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
767 -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
768 -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
769 };
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796#if MP3D_HAVE_INT_SIMD
797 const int use_simd = MP3D_SIMD_AVAILABLE();
798#endif
799
800 zlin[4*15] = xl[18*16];
801 zlin[4*15 + 2] = xl[0];
802
803 zlin[4*31] = xl[1 + 18*16];
804 zlin[4*31 + 2] = xl[1];
805
806 if (nch == 2)
807 {
808 zlin[4*15 + 1] = xr[18*16];
809 zlin[4*15 + 3] = xr[0];
810 zlin[4*31 + 1] = xr[1 + 18*16];
811 zlin[4*31 + 3] = xr[1];
812
815 }
818
819 for (i = 14; i >= 0; i--)
820 {
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846#define LOAD(k) const int32_t w0 = w[2*(k)]; const int32_t w1 = w[2*(k) + 1]; const int32_t *vz = &zlin[4*i + g - (k)*64]; const int32_t *vy = &zlin[4*i + g - (15 - (k))*64];
847#define S0(k, st) { LOAD(k); \
848 b0 = (int64_t)vz[0]*w1 + (int64_t)vy[0]*w0; \
849 a0 = (int64_t)vz[0]*w0 - (int64_t)vy[0]*w1; \
850 if (st == 1) { \
851 b1 = (int64_t)vz[1]*w1 + (int64_t)vy[1]*w0; \
852 a1 = (int64_t)vz[1]*w0 - (int64_t)vy[1]*w1; } }
853#define S1(k, st) { LOAD(k); \
854 b0 += (int64_t)vz[0]*w1 + (int64_t)vy[0]*w0; \
855 a0 += (int64_t)vz[0]*w0 - (int64_t)vy[0]*w1; \
856 if (st == 1) { \
857 b1 += (int64_t)vz[1]*w1 + (int64_t)vy[1]*w0; \
858 a1 += (int64_t)vz[1]*w0 - (int64_t)vy[1]*w1; } }
859#define S2(k, st) { LOAD(k); \
860 b0 += (int64_t)vz[0]*w1 + (int64_t)vy[0]*w0; \
861 a0 += (int64_t)vy[0]*w1 - (int64_t)vz[0]*w0; \
862 if (st == 1) { \
863 b1 += (int64_t)vz[1]*w1 + (int64_t)vy[1]*w0; \
864 a1 += (int64_t)vy[1]*w1 - (int64_t)vz[1]*w0; } }
865
866
867
868
869
870
871
872
873
874#define MP3D_SYNTH_CHAIN(st) \
875 { \
876 int g; \
877 for (g = 0; g < 4; g += 2) \
878 { \
879 mp3d_sample_t *d = dstl + g*16*nch; \
880 int64_t a0, b0, a1 = 0, b1 = 0; \
881 S0(0, st) S2(1, st) S1(2, st) S2(3, st) \
882 S1(4, st) S2(5, st) S1(6, st) S2(7, st) \
883 if (st == 1) \
884 { \
885 d[(15 - i)*nch + 1] = mp3d_scale_pcm(a1); \
886 d[(17 + i)*nch + 1] = mp3d_scale_pcm(b1); \
887 } \
888 d[(15 - i)*nch] = mp3d_scale_pcm(a0); \
889 d[(17 + i)*nch] = mp3d_scale_pcm(b0); \
890 } \
891 }
892
893 zlin[4*i] = xl[18*(31 - i)];
894 zlin[4*i + 2] = xl[1 + 18*(31 - i)];
895 zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
896 zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
897 if (nch == 2)
898 {
899 zlin[4*i + 1] = xr[18*(31 - i)];
900 zlin[4*i + 3] = xr[1 + 18*(31 - i)];
901 zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
902 zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
903 }
904
905#if MP3D_HAVE_INT_SIMD
906 if (use_simd)
907 {
908
909
910 int64_t a[4], b[4];
911 mp3d_synth_taps(zlin, w, i, a, b);
912 if (nch == 2)
913 {
918 }
923 }
924 else
925#endif
926
927
928 if (nch == 1)
929 {
931 }
932 else
933 {
935 }
936 w += 16;
937 }
938}
#define MP3D_SYNTH_CHAIN(st)
static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const int32_t *z) FL_NO_EXCEPT
MP3D_LEAF mp3d_sample_t mp3d_scale_pcm(int64_t sample) FL_NO_EXCEPT