[经验] 【聊聊DSP】DSP你是我的眼

刹那光辉   2012-8-24 23:34 楼主
曾经一直很懵懂,听过DSP这个名词,但是一直不知道这是个什么东西,也上过数字信号处理,但是连DSP长什么样子也不知道它能干什么。
       慢慢的知道了DSP原来就是这个东西。
       DSP接触是一件很奇妙的事,从小就喜欢厉害的东西,看小说喜欢乔峰,看动画片喜欢佐罗,反正都是喜欢厉害的,后来听老师说DSP很高级什么的,渐渐的在我心头烙下了印记,DSP反正就是很厉害,慢慢的就恋上了DSP
       毕业课题,主要是确定在开关磁阻电机范畴,听别人说电机很多都是由DSP控制,我的心顿时笑开了花,嘿嘿嘿,终于可以接触DSP了。
11.jpg
那时候虽然老师还没跟我说用什么,不过我心里自己做主肯定是用DSP了,所以当时,我立刻淘宝查找DSP开发板,可是令人失望的,DSP开发板仿真器太贵了,要500左右还是便宜的。于是那几个月我省吃简用终于买了自己的DSP开发板,那个兴奋激动啊。吼吼。
2.jpg
于是,我就开始研究板子上自带的一些资料,了解芯片的寄存器啊内部结构,理解开发板的硬件结构及原理,把板子的每一个模块(模块太多了),里面的DEMO程序也很多,自己都是一个一个看一个一个重新编程,直至完全明白。变着法子修改程序在板子上跑,直至自己完全熟练。
实验很多:定时实验、采样实验、GPIO实验、PWMSPIEEPROM、看门狗实验等等,我都耳熟能详。
那时候的我是疯狂的,是有干劲的,我很喜欢那种感觉,我拼命的驰骋在DSP的海洋里,疯狂的攫取着书上网络上的知识,经过了半年多的努力(我没有单片机的基础,一点也没有,只会一点点C语言),我真的自以为自己是通今贯古了,我当时有点骄傲,自以为都掌握了。
3.jpg
后来在网上无意间看到linkerbootloader,什么算法,我顿时懵了,原来自己只是菜鸟而已。
       真的失去了信心,原来自己花了那么长时间的学习的都没有学到皮毛, 渐渐发觉,学习真的不能一个人独自学习,“独学学不如众学学”
只有和别人接触了,才知道自己的不足。
于是我又花时间看看算法。
后来发现官网是个好东西,我去官网找例程
void FFT( COMPLEX *Y, int N) /* input sample array, number of points    */
  {
  COMPLEX temp1,temp2;      /*temporary storage variables          */
  int i,j,k;                /*loop counter variables               */
  int upper_leg, lower_leg; /*index of upper/lower butterfly leg   */
  int leg_diff;             /*difference between upper/lower leg   */
  int num_stages=0;         /*number of FFT stages, or iterations  */
  int index, step;          /*index and step between twiddle factor*/

/* log(base 2) of # of points = # of stages  */
  i=1;
  do
  {
  num_stages+=1;
  i = i *2 ;         
  } while (i!=N);

/* starting difference between upper and lower butterfly legs*/
  leg_diff = N/2;

  /* step between values in twiddle factor array twiddle.h     */
  step = 512 / N;

  /* For N-point FFT                                           */

  for ( i = 0 ; i < num_stages ; i++ )
  {
     index = 0;

   for ( j = 0; j < leg_diff ; j++ )
  {

  for ( upper_leg = j; upper_leg < N ; upper_leg += (2*leg_diff) )
    {
    lower_leg = upper_leg + leg_diff;
    temp1.real=(Y[upper_leg]).real + (Y[lower_leg]).real;
    temp1.imag=(Y[upper_leg]).imag + (Y[lower_leg]).imag;
    temp2.real=(Y[upper_leg]).real - (Y[lower_leg]).real;
    temp2.imag=(Y[upper_leg]).imag - (Y[lower_leg]).imag;

    (Y[lower_leg]).real =  ((long)temp2.real * (w[index]).real)/8192;
    (Y[lower_leg]).real -= ((long)temp2.imag * (w[index]).imag)/8192;

    (Y[lower_leg]).imag = ((long)temp2.real * (w[index]).imag)/8192;
    (Y[lower_leg]).imag += ((long)temp2.imag * (w[index]).real)/8192;

    (Y[upper_leg]).real = temp1.real;

    (Y[upper_leg]).imag = temp1.imag;
    }
  index+=step;
  }
  leg_diff = leg_diff / 2;
  step *= 2;  
  }

  /* bit reversal for resequencing data */
  j=0;
  for ( i=1 ; i < (N-1) ; i++ )
  {
    k = N / 2;

    while ( k <= j)
   {
         j = j - k;
   k >>= 1;
  }

    j = j + k;

    if ( i < j )
  {
         temp1.real =  (Y[j]).real;
         temp1.imag =  (Y[j]).imag;
         (Y[j]).real = (Y).real;
         (Y[j]).imag = (Y).imag;
         (Y).real = temp1.real;
         (Y).imag = temp1.imag;
  }
  }
  return;
  }
TI官方的在5416上实现的程序
       DSP你是我的眼,你让我看到了学习真的不能一个人独自学习,“独学学不如众学学”,只有乐于分享,乐于接触的工程师才能有更高的进步。
       DSP你是我的眼,你让我看到了有些东西不一定必然存在好与坏,不要随意评判一个算法的优劣,在程序中和代码优化的是否完善往往影响了控制效果好坏




[ 本帖最后由 刹那光辉 于 2012-8-24 23:36 编辑 ]

回复评论 (2)

楼主可以上传一些资料
点赞  2012-8-25 19:08

回复 沙发 常见泽1 的帖子

这方面的资料很多,上网上一搜就可以了。还是比较好找的
点赞  2012-8-25 20:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复