Re: Interleave / Deinterleave Arrays
- Subject: Re: Interleave / Deinterleave Arrays
- From: George Warner <email@hidden>
- Date: Wed, 02 Nov 2005 12:26:33 -0800
- Delivered-to: email@hidden
- Delivered-to: email@hidden
- Thread-index: AcXf67b49dD32EveEdqgggAKlZcReA==
- Thread-topic: Interleave / Deinterleave Arrays
- User-agent: Microsoft-Entourage/11.2.1.051004
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.