Commit b342d212 authored by thomas dettbarn's avatar thomas dettbarn
Browse files

getting closer. singualrvalues is sometimes wrong.

parent bd5fe007
Loading
Loading
Loading
Loading
+63 −159
Original line number Diff line number Diff line
@@ -855,16 +855,23 @@ static void HouseholderReduction_fx(
    Word16 nCh;
	push_wmops("HouseholderReduction_fx");
#ifdef	MYCHANGES
    Word32 singularValues_fx2[MAX_OUTPUT_CHANNELS];          /* exp(singularValues_fx_e) */
    Word16 singularValues_fx2_e[MAX_OUTPUT_CHANNELS];
    Word32 secDiag_fx2[MAX_OUTPUT_CHANNELS];                 /* exp(secDiag_fx_e) */
    Word16 secDiag_fx2_e[MAX_OUTPUT_CHANNELS];

	Word64 singularVectors_Left_64[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS];
    Word32 g_fx = 0;
    Word16 g_e = 0;
    move32();
    move16();

    Word32 sig_x_fx = 0;
    Word16 sig_x_fx_e = 0;
    move32();
    move16();
    Word32 eps_x_fx2=*eps_x_fx;        /* exp(eps_x_fx_e) */
    Word16 eps_x_fx2_e=*eps_x_fx_e;

#else

    // float g = 0.0f, sig_x = 0.0f;// to be removed
@@ -893,32 +900,15 @@ static void HouseholderReduction_fx(
	    bitwindow=1;
	    biDiagonalReductionLeft_64(
			    singularVectors_Left_64,bitwindow,
			singularValues_fx,singularValues_fx_e,
			    singularValues_fx2,singularValues_fx2_e,
			    nChannelsL,
			    nChannelsC,
			    nCh
			    );
		{
			int i,j;
			printf("\ncompare%d, (%d)\x1b[1;32mstart\x1b[0m\n",nCh,singularVectors_Left_e);
			for (i=0;i<nChannelsL;i++)
			{
				printf("compare%d,%d: \x1b[1;32m",nCh,i);
				for (j=0;j<nChannelsC;j++)
				{
					Word16 n;
					n=W_norm(singularVectors_Left_64[i][j]);
					printf("%08X ",W_extract_h(W_shl(singularVectors_Left_64[i][j],n)));
				}
				printf("\x1b[0m\n");
			}
			printf("compare%d \x1b[1;32mend\x1b[0m\n",nCh);
		}

                secDiag_fx[nCh]=g_fx;
                secDiag_fx_e[nCh]=g_e;
	    singularValues_fx2_e[nCh]=add(singularVectors_Left_e,singularValues_fx2_e[nCh]);
	    secDiag_fx2[nCh]=g_fx;
	    move32();
                move16();
	    secDiag_fx2_e[nCh]=add(singularVectors_Left_e,g_e);
	    bitwindow=2;
	    biDiagonalReductionRight_64(
			    singularVectors_Left_64,bitwindow,
@@ -929,40 +919,22 @@ static void HouseholderReduction_fx(
			    &g_e	
			    );
		{
			int i,j;
			printf("\nCOMPARE%d, (%d)\x1b[1;32mstart\x1b[0m\n",nCh,singularVectors_Left_e);
			for (i=0;i<nChannelsL;i++)
			{
				printf("COMPARE%d,%d: \x1b[1;32m",nCh,i);
				for (j=0;j<nChannelsC;j++)
        		Word16 L_temp_e;
		        Word32 L_temp;
			printf("\nSINGLUAR \x1b[1;36m %08X<%2d  %08X<%2d --> ",singularValues_fx2[nCh],singularValues_fx2_e[nCh], secDiag_fx2[nCh], secDiag_fx2_e[nCh]);
			fflush(stdout);
			L_temp = BASOP_Util_Add_Mant32Exp( L_abs( singularValues_fx2[nCh] ), singularValues_fx2_e[nCh], L_abs( secDiag_fx2[nCh] ), secDiag_fx2_e[nCh], &L_temp_e ); /* exp(L_temp_e) */
			printf("%08X<%2d\x1b[0m\n",L_temp, L_temp_e);
			IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_temp, L_temp_e, eps_x_fx2, eps_x_fx2_e ), 1 ) )
			{
					Word16 n;
					n=W_norm(singularVectors_Left_64[i][j]);
					printf("%08X<%3d ",W_extract_h(W_shl(singularVectors_Left_64[i][j],n)),n);
				}
				printf("\x1b[0m\n");
				eps_x_fx2 = L_temp; /* exp(L_temp_e) */
				move32();
				eps_x_fx2_e = L_temp_e;
				move32();
			}
			printf("COMPARE%d \x1b[1;32mend\x1b[0m\n",nCh);
		}
    }	
	pop_wmops();
	{
		int i;
		printf("SECDIAG: \x1b[1;37m");
		for (i=0;i<nChannelsC;i++)
		{
			secDiag_fx_e[i]+=singularVectors_Left_e;
			printf("%08X<%2d ",secDiag_fx[i],secDiag_fx_e[i]);
		}
		printf("\x1b[0m\n");
		printf("SINGULARVALUES: \x1b[1;37m");
		for (i=0;i<nChannelsC;i++)
		{
			singularValues_fx_e[i]+=singularVectors_Left_e;
			printf("%08X<%2d ",singularValues_fx[i],singularValues_fx_e[i]);
		}
		printf("\x1b[0m\n");
	}
#endif
	push_wmops("HouseholderReduction_fx 32");
    FOR( jCh = 0; jCh < nChannelsL; jCh++ )
@@ -978,38 +950,15 @@ static void HouseholderReduction_fx(
    FOR( nCh = 0; nCh < nChannelsC; nCh++ ) /* nChannelsC */
    {
        biDiagonalReductionLeft_fx( singularVectors_Left_fx, singularValues_fx, secDiag_fx, singularVectors_Left_fx_e, singularValues_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx );
   		{
			int i,j;
			printf("compare%d, start\n",nCh);
			for (i=0;i<nChannelsL;i++)
			{
				printf("compare%d,%d: ",nCh,i);
				for (j=0;j<nChannelsC;j++)
				{
					printf("%08X ",singularVectors_Left_fx[i][j]);
				}
				printf("\n");
			}
			printf("compare%d, end\n",nCh);
		}
        biDiagonalReductionRight_fx( singularVectors_Left_fx, secDiag_fx, singularVectors_Left_fx_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx );
		{
			int i,j;
			printf("COMPARE%d, start\n",nCh);
			for (i=0;i<nChannelsL;i++)
			{
				printf("COMPARE%d,%d: ",nCh,i);
				for (j=0;j<nChannelsC;j++)
				{
					printf("%08X<%3d ",singularVectors_Left_fx[i][j],singularVectors_Left_fx_e[i][j]);
				}
				printf("\n");
			}
			printf("COMPARE%d, end\n",nCh);
		}

        Word16 L_temp_e;
        Word32 L_temp = BASOP_Util_Add_Mant32Exp( L_abs( singularValues_fx[nCh] ), singularValues_fx_e[nCh], L_abs( secDiag_fx[nCh] ), secDiag_fx_e[nCh], &L_temp_e ); /* exp(L_temp_e) */
       		{
			printf("\nSINGLUAR  %08X<%2d  %08X<%2d --> ",singularValues_fx[nCh],singularValues_fx_e[nCh], secDiag_fx[nCh], secDiag_fx_e[nCh]);
			fflush(stdout);
			printf("%08X<%2d\n",L_temp, L_temp_e);
		}
	IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_temp, L_temp_e, *eps_x_fx, *eps_x_fx_e ), 1 ) )
        {
            *eps_x_fx = L_temp; /* exp(L_temp_e) */
@@ -1019,71 +968,28 @@ static void HouseholderReduction_fx(
        }
    }

	{
		int i;
		printf("SECDIAG: ");
		for (i=0;i<nChannelsC;i++)
		{
			printf("%08X<%2d ",secDiag_fx[i],secDiag_fx_e[i]);
		}
		printf("\n");
		printf("SINGULARVALUES: ");
		for (i=0;i<nChannelsC;i++)
		{
			printf("%08X<%2d ",singularValues_fx[i],singularValues_fx_e[i]);
		}
		printf("\n");
	}




    pop_wmops();
    {
	    int i,j;
	    static int replacecnt=0;
	    static int bettercnt=0;
	    static int totalcnt=0;
	    for (j=0;j<nChannelsC;j++)
	    {
		    secDiag_fx[j]=secDiag_fx2[j];
		    secDiag_fx_e[j]=secDiag_fx2_e[j];
//		    singularValues_fx[j]=singularValues_fx2[j];
//		    singularValues_fx_e[j]=singularValues_fx2_e[j];

		    for (i=0;i<nChannelsL;i++)
	    {
			printf("EXPONENT%02d: IN%3d ",i,singularVectors_Left_e);
		    for (j=0;j<nChannelsC;j++)
		    {
			    Word16 n;
			    Word32 tmp;
			    Word32 minemant;
			    unsigned int x,y;
				int mine,theirs;
			    n=norm_l(singularVectors_Left_fx[i][j]);
			    minemant=singularVectors_Left_fx[i][j]<<n;
                            x=(unsigned int)minemant;
				printf("[(%2d)",singularVectors_Left_fx_e[i][j]-n);
				theirs=singularVectors_Left_fx_e[i][j]-n;

			    n=W_norm(singularVectors_Left_64[i][j]);
			    tmp=W_extract_h(W_shl(singularVectors_Left_64[i][j],n));
			    y=(unsigned int)tmp;

				n=32+singularVectors_Left_e-n;
				mine=n;
				printf("MINE:%2d]",n);
				if (!((x^y)&0xff000000)) bettercnt++;
			//	if (mine==theirs || minemant==singularVectors_Left_fx[i][j])
				if (1)
				{
					singularVectors_Left_fx[i][j]=x;
					singularVectors_Left_fx_e[i][j]=mine;
					replacecnt++;
					printf("\x1b[0;32m");
				}
				printf("%08X/%08X ",x,y);
				printf("\x1b[0m");
			    totalcnt++;
			    n=W_norm(singularVectors_Left_64[j][i]);
			    singularVectors_Left_fx[j][i]=W_extract_h(W_shl(singularVectors_Left_64[j][i],n));
			    singularVectors_Left_fx_e[j][i]=sub(add(32,singularVectors_Left_e),n);
		    }
			printf("\n");
	    }
	    printf("\nbetter %d replace:%d  /%d\n",bettercnt,replacecnt,totalcnt);

	    *eps_x_fx = eps_x_fx2;
	    *eps_x_fx_e = eps_x_fx2_e;
    }

    /* SingularVecotr Accumulation */
@@ -1256,10 +1162,8 @@ static void biDiagonalReductionRight_64(
            Word32 r;
            Word16 r_e;
            Word32 f;
            Word16 f_e;
            Word32 invVal;
            Word16 invVal_e;
            Word16 r_e2;

            tmp_g_e = norm_x_e;
            move16();