Mailing Lists: Apple Mailing Lists

Image of Mac OS face in stamp
 
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Interleave / Deinterleave Arrays



On Wed, 02 Nov 2005 14:59:35 +0100, Olivier Tristan
<email@hidden> wrote:
> Here is an example
>
> float src[] = { 13.f, 22.f, 45.f, 3.f, 6.f, 8.f, 7.f, 1.f, 2.f)
> Let's say this is an audio data array with 3 channels
> so I would like to deinterleave this array into 3 other C arrays.
>
> Results:
> float *dst1 which contains 13.f, 3.f and 7.f
> float *dst2 which contains 22.f, 6.f and 1.f
> float *dst3 which contains 45.f, 8.f and 2.f
>
> For interleaving, it takes dst1, dst2 and dst3 and generate an array
> equivalent to src given a number of "channels".

// Note: Assumes all arrays are 16-byte aligned and inNumElements is
multiple of 48 (3 * 16)
//         If this is not the case then extra code has to be written to
align data and prevent
//         running off the end of the arrays.

static void Uninterleave3f( int inNumElements, const float* inArray, float*
outArray1, float* outArray2, float* outArray3)
{
    vector unsigned char vPerm1a = (vector unsigned char)
        ( 0, 3, 6, 9,12,15,18,21,24,27,30,-1,-1,-1,-1,-1);
    vector unsigned char vPerm1b = (vector unsigned char)
        ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,17,20,23,26,29);
    
    vector unsigned char vPerm2a = (vector unsigned char)
        ( 1, 4, 7,10,13,16,19,22,25,28,31,-1,-1,-1,-1,-1);
    vector unsigned char vPerm2b = (vector unsigned char)
        ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,18,21,24,27,30);
    
    vector unsigned char vPerm3a = (vector unsigned char)
        ( 2, 5, 8,11,14,17,20,23,26,29,-1,-1,-1,-1,-1,-1);
    vector unsigned char vPerm3b = (vector unsigned char)
        ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,16,19,22,25,28,31);
    
    int idxIn, idxOut;
    for ( idxIn = idxOut = 0;
           idxIn < inNumElements;
           idxIn += 3 * sizeof(vector float), idxOut += 16 ) {

        vector float vData1 = vec_ld( idxIn, inArray );
        vector float vData2 = vec_ld( idxIn + 16, inArray );
        vector float vData3 = vec_ld( idxIn + 32, inArray );

        vector float vData1p = vec_perm( vData1, vData2, vPerm1a );
        vector float vData2p = vec_perm( vData1, vData2, vPerm2a );
        vector float vData3p = vec_perm( vData1, vData2, vPerm3a );

        vData1p = vec_perm( vData1p, vData3, vPerm1b );
        vData2p = vec_perm( vData2p, vData3, vPerm2b );
        vData3p = vec_perm( vData3p, vData3, vPerm3b );
        
        vec_st( vData1p, idxOut, outArray1 );
        vec_st( vData2p, idxOut, outArray2 );
        vec_st( vData3p, idxOut, outArray3 );
    }
}

static void Interleave3f( int inNumElements, const float* inArray1, const
float* inArray2, const float* inArray3, float* outArray)
{
    vector unsigned char vPerm1a = ( vector unsigned char )
        ( 0,16,-1, 1,17,-1, 2,18,-1, 3,19,-1, 4,20,-1, 5);
    vector unsigned char vPerm1b = ( vector unsigned char )
        ( 0, 1,16, 3, 4,17, 6, 7,18, 9,10,19,12,13,20,15);
    
    vector unsigned char vPerm2a = ( vector unsigned char )
        (21,-1, 6,22,-1, 7,23,-1, 8,24,-1, 9,25,-1,10,26);
    vector unsigned char vPerm2b = ( vector unsigned char )
        ( 0,21, 2, 3,22, 5, 6,23, 8, 9,24,11,12,25,14,15);
    
    vector unsigned char vPerm3a = ( vector unsigned char )
        (-1,11,27,-1,12,28,-1,13,29,-1,14,30,-1,15,31,-1);
    vector unsigned char vPerm3b = ( vector unsigned char )
        (26, 1, 2,27, 4, 5,28, 7, 8,29,10,11,30,13,14,31);
    
    int idxIn, idxOut;
    for ( idxIn = idxOut = 0;
           idxOut < inNumElements;
           idxIn += 16, idxOut += 3 * sizeof(vector float) ) {
        vector float vData1 = vec_ld( idxIn, inArray1 );
        vector float vData2 = vec_ld( idxIn, inArray2 );
        vector float vData3 = vec_ld( idxIn, inArray3 );

        vector float vData1i = vec_perm( vData1, vData2, vPerm1a );
        vector float vData2i = vec_perm( vData1, vData2, vPerm2a );
        vector float vData3i = vec_perm( vData1, vData2, vPerm3a );

        vData1i = vec_perm( vData1i, vData3, vPerm1b );
        vData2i = vec_perm( vData2i, vData3, vPerm2b );
        vData3i = vec_perm( vData3i, vData3, vPerm3b );

        vec_st( vData1i, idxOut, outArray );
        vec_st( vData2i, idxOut + 16, outArray );
        vec_st( vData3i, idxOut + 32, outArray );
    }
}

-- 
Enjoy,
George Warner,
Schizophrenic Optimization Scientist
Apple Developer Technical Support (DTS)


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
PerfOptimization-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/perfoptimization-dev/email@hidden

This email sent to email@hidden



Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Contact Apple | Terms of Use | Privacy Policy

Copyright © 2007 Apple Inc. All rights reserved.