⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdct_8x8.h

📁 DSP GEPE 压缩算法
💻 H
📖 第 1 页 / 共 2 页
字号:
/* ======================================================================== */
/*                                                                          */
/*  TEXAS INSTRUMENTS, INC.                                                 */
/*                                                                          */
/*  NAME                                                                    */
/*      fdct_8x8 -- 8x8 Block FDCT With Rounding, Endian Neutral            */
/*                                                                          */
/*  USAGE                                                                   */
/*      This routine is C callable, and has the following C prototype:      */
/*                                                                          */
/*          void fdct_8x8(short fdct_data[], unsigned num_fdcts)            */
/*                                                                          */
/*      The fdct routine accepts a list of 8x8 pixel blocks and performs    */
/*      FDCTs on each.  The array should be laid out identically to         */
/*      "fdct_data[num_fdcts][8][8]".  All operations in this array are     */
/*      performed entirely in-place.                                        */
/*                                                                          */
/*      Input values are stored in shorts, and may be in the range          */
/*      [-512,511].  Larger input values may result in overflow.            */
/*                                                                          */
/*      This code requires '48 + 160 * num_fdcts' cycles to process         */
/*      'num_fdcts' blocks, including function call overhead.  When         */
/*      'num_fdcts' is zero, an early exit is taken and the function        */
/*      runs for only 13 cycles (again, including call overhead).           */
/*                                                                          */
/*  DESCRIPTION                                                             */
/*      The fdct_8x8 function implements a Chen FDCT.  Output values are    */
/*      rounded, providing improved accuracy.  Input terms are expected     */
/*      to be signed 11Q0 values, producing signed 15Q0 results.  (A        */
/*      smaller dynamic range may be used on the input, producing a         */
/*      correspondingly smaller output range.  Typical applications         */
/*      include processing signed 9Q0 and unsigned 8Q0 pixel data,          */
/*      producing signed 13Q0 or 12Q0 outputs, respectively.)  No           */
/*      saturation is performed.                                            */
/*                                                                          */
/*      void fdct_8x8(short *dct_data, unsigned num_fdcts)                  */
/*      {                                                                   */
/*        // -------------------------------------------------------- //    */
/*        //  Set up the cosine coefficients c0..c7.                  //    */
/*        // -------------------------------------------------------- //    */
/*        const unsigned short c1 = 0x2C62, c3 = 0x25A0;                    */
/*        const unsigned short c5 = 0x1924, c7 = 0x08D4;                    */
/*        const unsigned short c0 = 0xB505, c2 = 0x29CF;                    */
/*        const unsigned short c6 = 0x1151;                                 */
/*                                                                          */
/*        // -------------------------------------------------------- //    */
/*        //  Intermediate calculations.                              //    */
/*        // -------------------------------------------------------- //    */
/*        short f0, f1, f2, f3,                                             */
/*              f4, f5, f6, f7;       // Spatial domain samples.      //    */
/*        int   g0, g1, h0, h1,                                             */
/*              p0, p1;               // Even-half intermediate.      //    */
/*        short r0, r1;               // Even-half intermediate.      //    */
/*        int   P0, P1, R0, R1;       // Even-half intermediate.      //    */
/*        short g2, g3, h2, h3;       // Odd-half intermediate.       //    */
/*        short q0a,s0a,q0, q1,                                             */
/*              s0, s1;               // Odd-half intermediate.       //    */
/*        short Q0, Q1, S0, S1;       // Odd-half intermediate.       //    */
/*        int   F0, F1, F2, F3,                                             */
/*              F4, F5, F6, F7;       // Freq. domain results.        //    */
/*        int   F0r,F1r,F2r,F3r,                                            */
/*              F4r,F5r,F6r,F7r;      // Rounded, truncated results.  //    */
/*                                                                          */
/*        // -------------------------------------------------------- //    */
/*        //  Input and output pointers, loop control.                //    */
/*        // -------------------------------------------------------- //    */
/*        unsigned i, j;                                                    */
/*        short    *dct_io_ptr;                                             */
/*                                                                          */
/*        // -------------------------------------------------------- //    */
/*        //  Outer vertical loop -- Process each 8x8 block.          //    */
/*        // -------------------------------------------------------- //    */
/*        dct_io_ptr = dct_data;                                            */
/*        for (i = 0; i < num_fdcts; i++)                                   */
/*        {                                                                 */
/*            // ---------------------------------------------------- //    */
/*            //  Perform Vert 1-D FDCT on columns within each block. //    */
/*            // ---------------------------------------------------- //    */
/*            for (j = 0; j < 8; j++)                                       */
/*            {                                                             */
/*                // ------------------------------------------------ //    */
/*                //  Load the spatial-domain samples.                //    */
/*                // ------------------------------------------------ //    */
/*                f0 = dct_io_ptr[ 0];                                      */
/*                f1 = dct_io_ptr[ 8];                                      */
/*                f2 = dct_io_ptr[16];                                      */
/*                f3 = dct_io_ptr[24];                                      */
/*                f4 = dct_io_ptr[32];                                      */
/*                f5 = dct_io_ptr[40];                                      */
/*                f6 = dct_io_ptr[48];                                      */
/*                f7 = dct_io_ptr[56];                                      */
/*                                                                          */
/*                // ------------------------------------------------ //    */
/*                //  Stage 1:  Separate into even and odd halves.    //    */
/*                // ------------------------------------------------ //    */
/*                g0 = f0 + f7;               h2 = f0 - f7;                 */
/*                g1 = f1 + f6;               h3 = f1 - f6;                 */
/*                h1 = f2 + f5;               g3 = f2 - f5;                 */
/*                h0 = f3 + f4;               g2 = f3 - f4;                 */
/*                                                                          */
/*                // ------------------------------------------------ //    */
/*                //  Stage 2                                         //    */
/*                // ------------------------------------------------ //    */
/*                p0 = g0 + h0;               r0 = g0 - h0;                 */
/*                p1 = g1 + h1;               r1 = g1 - h1;                 */
/*                q1 = g2;                    s1 = h2;                      */
/*                                                                          */
/*                s0a= h3 + g3;               q0a= h3 - g3;                 */
/*                s0 = (s0a * c0 + 0x7FFF) >> 16;                           */
/*                q0 = (q0a * c0 + 0x7FFF) >> 16;                           */
/*                                                                          */
/*                // ------------------------------------------------ //    */
/*                //  Stage 3                                         //    */
/*                // ------------------------------------------------ //    */
/*                P0 = p0 + p1;               P1 = p0 - p1;                 */
/*                R1 = c6 * r1 + c2 * r0;     R0 = c6 * r0 - c2 * r1;       */
/*                                                                          */
/*                Q1 = q1 + q0;               Q0 = q1 - q0;                 */
/*                S1 = s1 + s0;               S0 = s1 - s0;                 */
/*                                                                          */
/*                // ------------------------------------------------ //    */
/*                //  Stage 4                                         //    */
/*                // ------------------------------------------------ //    */
/*                F0 = P0;                    F4 = P1;                      */
/*                F2 = R1;                    F6 = R0;                      */
/*                                                                          */
/*                F1 = c7 * Q1 + c1 * S1;     F7 = c7 * S1 - c1 * Q1;       */
/*                F5 = c3 * Q0 + c5 * S0;     F3 = c3 * S0 - c5 * Q0;       */
/*                                                                          */
/*                // ------------------------------------------------ //    */
/*                //  Store the frequency domain results.             //    */
/*                // ------------------------------------------------ //    */
/*                dct_io_ptr[ 0] = F0;                                      */
/*                dct_io_ptr[ 8] = F1 >> 13;                                */
/*                dct_io_ptr[16] = F2 >> 13;                                */
/*                dct_io_ptr[24] = F3 >> 13;                                */
/*                dct_io_ptr[32] = F4;                                      */
/*                dct_io_ptr[40] = F5 >> 13;                                */
/*                dct_io_ptr[48] = F6 >> 13;                                */
/*                dct_io_ptr[56] = F7 >> 13;                                */
/*                                                                          */
/*                dct_io_ptr++;                                             */
/*            }                                                             */
/*            // ---------------------------------------------------- //    */
/*            //  Update pointer to next 8x8 FDCT block.              //    */
/*            // ---------------------------------------------------- //    */
/*            dct_io_ptr += 56;                                             */
/*        }                                                                 */
/*                                                                          */
/*        // -------------------------------------------------------- //    */
/*        //  Perform Horizontal 1-D FDCT on each 8x8 block.          //    */
/*        // -------------------------------------------------------- //    */
/*        dct_io_ptr = dct_data;                                            */
/*        for (i = 0; i < 8 * num_fdcts; i++)                               */
/*        {                                                                 */
/*            // ---------------------------------------------------- //    */
/*            //  Load the spatial-domain samples.                    //    */
/*            // ---------------------------------------------------- //    */
/*            f0 = dct_io_ptr[0];                                           */
/*            f1 = dct_io_ptr[1];                                           */
/*            f2 = dct_io_ptr[2];                                           */
/*            f3 = dct_io_ptr[3];                                           */
/*            f4 = dct_io_ptr[4];                                           */
/*            f5 = dct_io_ptr[5];                                           */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -