[DemoCode下载] M4的DSP内核数学计算

[复制链接]
1086|4
 楼主| xinpian101 发表于 2018-3-8 11:03 | 显示全部楼层 |阅读模式
展示使用DSP 基本数**算,其中包含
1. 向量绝对值
2. 向量加法
3. 向量减法
4. 向量乘法
5. 向量内积
6. 向量反向
7. 向量缩放
8. 向量偏移
用户可以直接使用这些函式,来实现自己的数学方程式运算。程序内也比较了有无使用DSP计算时间的差异,使用者把#define USE_DSP给取消即可不使用DSP来运算这些方程式。

 楼主| xinpian101 发表于 2018-3-8 11:03 | 显示全部楼层
  1. /****************************************************************************
  2. * [url=home.php?mod=space&uid=288409]@file[/url]     main.c
  3. * [url=home.php?mod=space&uid=895143]@version[/url]  V1.0
  4. * $Date: 15/09/02 10:04a $
  5. * @brief
  6. *           Display how to use DSP Basic math functions.
  7. *                      and compare with calcultion without DSP
  8. * @note
  9. * Copyright (C) 2016 Nuvoton Technology Corp. All rights reserved.
  10. *
  11. ******************************************************************************/
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include "M451Series.h"
  15. #include "arm_math.h"
  16. #define blockSize 32
  17. #define USE_DSP

  18. float32_t srcA_buf_f32[blockSize] =   
  19. {   
  20. -0.4325648115282207,        -1.6655843782380970,        0.1253323064748307,         
  21. 0.2876764203585489,    -1.1464713506814637,        1.1909154656429988,         
  22. 1.1891642016521031,    -0.0376332765933176,        0.3272923614086541,         
  23. 0.1746391428209245,    -0.1867085776814394,        0.7257905482933027,         
  24. -0.5883165430141887,         2.1831858181971011,   -0.1363958830865957,         
  25. 0.1139313135208096,         1.0667682113591888,        0.0592814605236053,         
  26. -0.0956484054836690,        -0.8323494636500225,        0.2944108163926404,         
  27. -1.3361818579378040,         0.7143245518189522,        1.6235620644462707,         
  28. -0.6917757017022868,         0.8579966728282626,        1.2540014216025324,         
  29. -1.5937295764474768,        -1.4409644319010200,        0.5711476236581780,         
  30. -0.3998855777153632,         0.6899973754643451
  31. };   
  32.   
  33. /* ----------------------------------------------------------------------  
  34. ** Test input data of srcB for blockSize 32   
  35. ** ------------------------------------------------------------------- */   
  36. float32_t srcB_buf_f32[blockSize] =   
  37. {   
  38. 1.7491401329284098,        0.1325982188803279,         0.3252281811989881,         
  39. -0.7938091410349637,        0.3149236145048914,        -0.5272704888029532,         
  40. 0.9322666565031119,        1.1646643544607362,        -2.0456694357357357,         
  41. -0.6443728590041911,        1.7410657940825480,         0.4867684246821860,         
  42. 1.0488288293660140,        1.4885752747099299,         1.2705014969484090,         
  43. -1.8561241921210170,        2.1343209047321410,  1.4358467535865909,         
  44. -0.9173023332875400,   -1.1060770780029008,         0.8105708062681296,         
  45. 0.6985430696369063,   -0.4015827425012831,         1.2687512030669628,         
  46. -0.7836083053674872,        0.2132664971465569,         0.7878984786088954,         
  47. 0.8966819356782295,   -0.1869172943544062,         1.0131816724341454,         
  48. 0.2484350696132857,        0.0596083377937976
  49. };
  50. float32_t dotoutput_f32,suboutput[blockSize],multoutput[blockSize],absoutput[blockSize];
  51. float32_t scaleoutput[blockSize],offsetoutput[blockSize],addoutput[blockSize],negoutput[blockSize];
  52. int CalTime,i;
  53. float sum,subout[blockSize],multout[blockSize],absout[blockSize];
  54. float scaleout[blockSize],offsetout[blockSize],addout[blockSize],negout[blockSize];
  55. void DOT(int size)
  56. {
  57.         sum=0;
  58.         for(i=0;i<size;i++)
  59.         {
  60.                 sum=sum+(srcA_buf_f32[i]*srcB_buf_f32[i]);
  61.         }
  62. }
  63. void SYS_Init(void)
  64. {
  65.    /*---------------------------------------------------------------------------------------------------------*/
  66.     /* Init System Clock                                                                                       */
  67.     /*---------------------------------------------------------------------------------------------------------*/
  68.     /* Enable HIRC clock */
  69.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

  70.     /* Waiting for HIRC clock ready */
  71.     CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

  72.     /* Switch HCLK clock source to HIRC */
  73.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

  74.     /* Enable HXT */
  75.     CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

  76.     /* Waiting for clock ready */
  77.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

  78.     /* Set core clock as PLL_CLOCK from PLL and SysTick source to HCLK/2*/
  79.     CLK_SetCoreClock(72000000);
  80.     CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_HCLK_DIV2);

  81.     /* Enable peripheral clock */
  82.     CLK_EnableModuleClock(UART0_MODULE);
  83.     CLK_EnableModuleClock(TMR0_MODULE);

  84.     /* Peripheral clock source */
  85.     CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, CLK_CLKDIV0_UART(1));
  86.     CLK_SetModuleClock(TMR0_MODULE, CLK_CLKSEL1_TMR0SEL_HXT, 0);

  87. }

  88. void UART_Init(void)
  89. {
  90.     /* Set PD multi-function pins for UART0 RXD and TXD */
  91.     SYS->GPD_MFPL = SYS_GPD_MFPL_PD0MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD;
  92.        
  93.     /* Reset UART module */
  94.     SYS_ResetModule(UART0_RST);

  95.     /* Configure UART0 and set UART0 Baudrate */
  96.     UART_Open(UART0, 115200);
  97. }
  98. /*---------------------------------------------------------------------------------------------------------*/
  99. /*  Main Function                                                                                          */
  100. /*---------------------------------------------------------------------------------------------------------*/
  101. int32_t main(void)
  102. {
  103.                 /* Unlock protected registers */
  104.     SYS_UnlockReg();
  105.     /* Init System, peripheral clock and multi-function I/O */
  106.     SYS_Init();
  107.     /* Lock protected registers */
  108.     SYS_LockReg();
  109.     /* Init UART for printf */
  110.     UART_Init();

  111.           TIMER_Open(TIMER0, TIMER_CONTINUOUS_MODE, 1);
  112.                 TIMER_Start(TIMER0);

  113. #ifdef USE_DSP       
  114.                 /*Calculate dot product (32 sample) with DSP*/
  115.                 arm_dot_prod_f32(srcA_buf_f32, srcB_buf_f32, blockSize, &dotoutput_f32);
  116.                
  117.                 /*Calculate Absolute value (32 sample) with DSP*/
  118.                 arm_abs_f32(srcA_buf_f32, absoutput, blockSize );
  119.                
  120.                 /*Calculate Addition (32 sample) with DSP*/
  121.                 arm_add_f32(srcA_buf_f32, srcB_buf_f32, addoutput, blockSize);
  122.                
  123.                 /*Calculate Subtraction (32 sample) with DSP*/
  124.                 arm_sub_f32 (srcA_buf_f32, srcB_buf_f32, suboutput, blockSize);
  125.                
  126.                 /*Calculate Multiplication (32 sample) with DSP*/
  127.                 arm_mult_f32 (srcA_buf_f32, srcB_buf_f32, multoutput, blockSize);
  128.                
  129.                 /*Calculate Scale (32 sample) with DSP*/
  130.                 arm_scale_f32 (srcA_buf_f32, 10, scaleoutput, blockSize);       
  131.                
  132.                 /*Calculate Offest (32 sample) with DSP*/
  133.                 arm_offset_f32 (srcA_buf_f32, 10, offsetoutput, blockSize);
  134.                
  135.                 /*Calculate Negate (32 sample) with DSP*/
  136.                 arm_negate_f32 (srcA_buf_f32, negoutput, blockSize);

  137. #else
  138.                 /*Calculate Dot Product (32 sample) without DSP*/               
  139.                 DOT(blockSize);

  140.                 /*Calculate Absolute value (32 sample) without DSP*/
  141.                 for(i=0;i<blockSize;i++){
  142.                 absout[i]=fabs(srcA_buf_f32[i]);
  143.                 }               
  144.                 /*Calculate Addition (32 sample) without DSP*/               
  145.                 for(i=0;i<blockSize;i++){
  146.                 addout[i]=srcA_buf_f32[i]+srcB_buf_f32[i];
  147.                 }
  148.                 /*Calculate Subtraction (32 sample) without DSP*/       
  149.                 for(i=0;i<blockSize;i++){
  150.                 subout[i]=srcA_buf_f32[i]-srcB_buf_f32[i];
  151.                 }
  152.                 /*Calculate Multiplication (32 sample) without DSP*/       
  153.                 for(i=0;i<blockSize;i++){
  154.                 multout[i]=srcA_buf_f32[i]*srcB_buf_f32[i];
  155.                 }
  156.                 /*Calculate Scale (32 sample) without DSP*/
  157.                 for(i=0;i<blockSize;i++){
  158.                 scaleout[i]=10*srcA_buf_f32[i];
  159.                 }               
  160.                 /*Calculate Offest (32 sample) without DSP*/
  161.                 for(i=0;i<blockSize;i++){
  162.                 offsetout[i]=10+srcA_buf_f32[i];
  163.                 }
  164.                 /*Calculate Negate (32 sample) without DSP*/
  165.                 for(i=0;i<blockSize;i++){
  166.                 negout[i]=-srcA_buf_f32[i];
  167.                 }
  168.                
  169. #endif               
  170.                 TIMER_Close(TIMER0);
  171.                 CalTime=TIMER_GetCounter(TIMER0);
  172.                 /* Display function calculation time */
  173.           printf("time is %d \n",CalTime);               
  174.     while(1);   

  175. }
dongnanxibei 发表于 2018-3-8 15:22 | 显示全部楼层
噢,用了两组对比,非常赞。
doit888 发表于 2018-3-9 13:25 | 显示全部楼层
请问一下 这个历程 是在那里 找到的?
734774645 发表于 2018-3-10 11:21 | 显示全部楼层
doit888 发表于 2018-3-9 13:25
请问一下 这个历程 是在那里 找到的?

肯定是这个M451的BSP里面。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

129

主题

1650

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部