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

📄 c_fir2.c

📁 dsp6713开发板的许多例程.对入门特别有用
💻 C
字号:
/****************************************************************************/
/*         Copyright (C) 1996-2000 Texas Instruments Incorporated           */
/*                      All Rights Reserved                                 */
/*                                                                          */
/* C_FIR2.C - Example code from Programmer's Guide on optimizing C code.    */
/*                                                                          */
/****************************************************************************/
#include <stdio.h>
#include <time.h>

void fir2  (short * restrict, short * restrict, short * restrict, int, int);
void fir2_u(short * restrict, short * restrict, short * restrict, int);

short optr1[] = {
0xE2A2,	 0x72E7,  0xA053,  0x7902,  0x1017,  0x6091,  0x311C,  0xB6BA,
0x3AF1,	 0x48DC,  0xAE9C,  0x4F4C,  0x237B,  0x5ACA,  0xD3DB,  0xF9C5,
0xDF5A,	 0x2F53,  0x67FD,  0x95EE,  0x4B10,  0x4EEF,  0xBEC1,  0xAECC,
0x8F7B,	 0xA912,  0x3603,  0xFD21,  0xA155,  0x1FA9,  0xBC3C,  0xE7E7,
0xC3B4,	 0xFAA0,  0x47FF,  0xFBDA,  0x0189,  0x715D,  0x5A7D,  0x76ED };

short optr2[] = {
0xE2A2,	 0x72E7,  0xA053,  0x7902,  0x1017,  0x6091,  0x311C,  0xB6BA,
0x3AF1,	 0x48DC,  0xAE9C,  0x4F4C,  0x237B,  0x5ACA,  0xD3DB,  0xF9C5,
0xDF5A,	 0x2F53,  0x67FD,  0x95EE,  0x4B10,  0x4EEF,  0xBEC1,  0xAECC,
0x8F7B,	 0xA912,  0x3603,  0xFD21,  0xA155,  0x1FA9,  0xBC3C,  0xE7E7,
0xC3B4,	 0xFAA0,  0x47FF,  0xFBDA,  0x0189,  0x715D,  0x5A7D,  0x76ED };

short iptr[] = {
0xB623,	 0x2544,  0x8400,  0xC1D1,  0x06AC,  0xA633,  0xE171,  0xF074,
0x64A8,	 0xED06,  0x98D4,  0x437E,  0x0C7B,  0xE012,  0x5DC8,  0xA6D4,
0x87E2,	 0xD4AB,  0xEF0A,  0x3316,  0x2C77,  0x05A1,  0x99F1,  0xAD23,
0x9B2F,	 0x1DBC,  0xB3F2,  0x0492,  0x43DE,  0xB546,  0x201B,  0xD638,
0xDBAF,	 0xCD80,  0xCF9A,  0xEAA7,  0xEAAE,  0x5429,  0x3C35,  0xB5AB,
0x4141,	 0xA5FC,  0xEED1,  0xD7CD,  0x7EA8,  0x0631,  0xF9ED,  0x9DD3,
0x8983,	 0x29F9,  0x7C26,  0x7F3C,  0x184B,  0xAD04,  0x22B4,  0xA1C6 };

short cptr[] = {
0x2DD5,	 0x9BFD,  0xA3E9,  0x54E9,  0x95D4,  0xEC0A,  0x42B7,  0x945B,
0x6955,	 0x004F,  0x4F29,  0x8A8C,  0x8E43,  0x266A,  0xA4E6,  0x092A };

/****************************************************************************/
/* TOP LEVEL DRIVER FOR THE TEST.                                           */
/****************************************************************************/
int main()
{
    clock_t t_overhead, t_start, t_stop;
 
    /************************************************************************/
    /* COMPUTE THE OVERHEAD OF CALLING CLOCK TWICE TO GET TIMING INFO.      */
    /************************************************************************/
    t_start    = clock();
    t_stop     = clock();
    t_overhead = t_stop - t_start;

    /************************************************************************/
    /* TIME FIR2.                                                            */
    /************************************************************************/
    t_start = clock();
    fir2(iptr, cptr, optr1, 40, 16);
    t_stop = clock();
    printf("FIR_FXD1: %d cycles\n", t_stop - t_start - t_overhead);
 
    /************************************************************************/
    /* TIME FIR2_U.                                                         */
    /************************************************************************/
    t_start = clock();
    fir2_u(iptr, cptr, optr2, 40);
    t_stop = clock();
    printf("FIR_FXD2: %d cycles\n", t_stop - t_start - t_overhead);
    if (memcmp(optr1, optr2, sizeof(optr1)) != 0) printf ("Result failure\n");
    else                                          printf ("Correct result\n");
}

/****************************************************************************/
/* FIR2 - BASIC FORM                                                        */
/****************************************************************************/
void fir2(short input[restrict], short coefs[restrict], short out[restrict],
          int N, int M)
{
    int i, j;
 
    for (i = 0; i < N; i++)
    {
	int sum = 0;

        for (j = 0; j < M; j++)
            sum += coefs[j] * input[i + 15 - j];
 
        out[i] = (sum >> 15);
    }
}
 
/****************************************************************************/
/* FIR2_U - OPTIMIZED FORM                                                  */
/****************************************************************************/
void fir2_u(short input[restrict], short coefs[restrict], short out[restrict],
            int N)
{
    int i;
    int sum;
 
    for (i = 0; i < N; i++)
    {
        sum  = coefs[0]  * input[i + 15];
        sum += coefs[1]  * input[i + 14];
        sum += coefs[2]  * input[i + 13];
        sum += coefs[3]  * input[i + 12];
        sum += coefs[4]  * input[i + 11];
        sum += coefs[5]  * input[i + 10];
        sum += coefs[6]  * input[i + 9];
        sum += coefs[7]  * input[i + 8];
        sum += coefs[8]  * input[i + 7];
        sum += coefs[9]  * input[i + 6];
        sum += coefs[10] * input[i + 5];
        sum += coefs[11] * input[i + 4];
        sum += coefs[12] * input[i + 3];
        sum += coefs[13] * input[i + 2];
        sum += coefs[14] * input[i + 1];
        sum += coefs[15] * input[i + 0];
 
        out[i] = (sum >> 15);
    }
}

⌨️ 快捷键说明

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