找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 9203|回復(fù): 2
收起左側(cè)

DSP信號(hào)采集處理與控制系統(tǒng)設(shè)計(jì)總結(jié)實(shí)驗(yàn)報(bào)告(卷積 FFT FIR 濾波算法源碼)

  [復(fù)制鏈接]
ID:275213 發(fā)表于 2018-1-12 15:05 | 顯示全部樓層 |閱讀模式

dsp高速數(shù)字處理系統(tǒng)設(shè)計(jì)總結(jié)與實(shí)驗(yàn)報(bào)告

(2017-2018 學(xué)年第 1 學(xué)期)

題     目 :_高速數(shù)字處理系統(tǒng)設(shè)計(jì)__

專(zhuān)業(yè)班級(jí) :___電子15-2班_______

學(xué)生姓名 :________ 王 宇_________

學(xué)  號(hào) :__    1505020223_______

指導(dǎo)教師 :____宋華軍、周衛(wèi)東_____

設(shè)計(jì)成績(jī) :_________________________


設(shè)計(jì)目的

通過(guò)對(duì)基于TMS320VC5416的信號(hào)采集處理與控制系統(tǒng)的設(shè)計(jì)掌握PCB設(shè)計(jì)軟件AD(Altium Designer) 的使用方法,以及卷積、FFT、FIR 濾波器等數(shù)字信號(hào)處理算法并熟悉 TI 的 DSP 集成開(kāi)發(fā)環(huán)境 CCS軟件的使用,掌握基于 DSP的系統(tǒng)設(shè)計(jì)流程。


系統(tǒng)分析2.1 設(shè)計(jì)要求

①設(shè)計(jì)一個(gè)功能完備,能夠獨(dú)立運(yùn)行的精簡(jiǎn) DSP 硬件系統(tǒng)。繪制出系統(tǒng)的功能框圖、使用AD(Altium Designer)繪制出系統(tǒng)的原理圖和PCB 版圖。

②利用實(shí)驗(yàn)箱的模擬信號(hào)產(chǎn)生單元產(chǎn)生不同頻率的信號(hào),或者產(chǎn)生兩個(gè)頻率的信號(hào)的疊加。在 DSP 中采集信號(hào),并且對(duì)信號(hào)進(jìn)行頻譜分析,濾波等。通過(guò)鍵盤(pán)或者串口命令選擇算法的功能,將計(jì)算的信號(hào)頻率或者濾波后信號(hào)的頻率在LCD 上顯示。

主要功能如下:

一、  對(duì)外部輸入的模擬信號(hào)采集到DSP 內(nèi)存,會(huì)用CCS 軟件顯示采集的數(shù)據(jù)波形。

二、  對(duì)采集的數(shù)據(jù)進(jìn)行如下算法分析:

(1) 頻譜分析:使用fft 算法計(jì)算信號(hào)的頻率。

(2) 對(duì)信號(hào)進(jìn)行IIR 濾波或FIR 濾波,并且計(jì)算濾波前后信號(hào)的頻率。

三、  外部鍵盤(pán)或者從計(jì)算機(jī)來(lái)的串口命令選擇算法功能,并且將結(jié)果在LCD 上顯示。

2.2 主要任務(wù)

①繪制出DSP系統(tǒng)的功能框圖、使用AD(Altium Designer)繪制出系統(tǒng)的原理圖和PCB 版圖。

②在 DSP 中采集信號(hào),用CCS 軟件顯示采集的數(shù)據(jù)波形,以及對(duì)采集的數(shù)據(jù)進(jìn)行算法分析。

三 硬件設(shè)計(jì)3.1 硬件總體結(jié)構(gòu)



3.2 DSP 模塊設(shè)計(jì)


3.3 電源模塊設(shè)計(jì)

將5V電源電壓轉(zhuǎn)換為3.3V和1.6V電源


3.4 時(shí)鐘模塊設(shè)計(jì)

此處由外部晶振提供時(shí)鐘信號(hào)

3.5 存儲(chǔ)器模塊設(shè)計(jì)

3.6 JTAG模塊設(shè)計(jì)


3.7 TMS320VC5416 最小系統(tǒng) PCB 版圖

板上包括了支持TMS320VC5416獨(dú)立運(yùn)行的時(shí)鐘電路、復(fù)位電路、Flash模塊、JTAG仿真接口電路以及電源模塊等。

軟件設(shè)計(jì)

4.1 軟件總體流程


4.3 程序運(yùn)行效果

:采集的數(shù)據(jù)及其FFT計(jì)算結(jié)果:


:51階濾波器波形:

③:濾波前后信號(hào)頻譜圖:

④:采集數(shù)據(jù)波形和濾后波形比較:



LCD顯示結(jié)果:

課程設(shè)計(jì)總結(jié)

為期兩周的課程設(shè)計(jì)結(jié)束了。此次課程設(shè)計(jì)包含硬件設(shè)計(jì)以及軟件設(shè)計(jì)兩個(gè)方面,從PCB板的繪制,到CCS軟件的使用,利用軟件實(shí)現(xiàn)卷積,F(xiàn)FT算法,濾波器等實(shí)驗(yàn)。 首先,感謝兩位老師:宋老師,周老師的辛勤付出。

在此次課程設(shè)計(jì)中,在硬件設(shè)計(jì)部分,首先從硬件整體模塊的設(shè)計(jì),到PCB板原理圖的繪制,再到最后PCB板的繪制,收獲頗豐。真正的理解了實(shí)際中做一件東西的具體流程,也學(xué)會(huì)了些許步驟。在拿到一項(xiàng)設(shè)計(jì)任務(wù)時(shí),首先應(yīng)當(dāng)了解實(shí)際目的,設(shè)計(jì)要求,從最終的要求出發(fā),一步一步的去完成,同時(shí)也要查閱各種資料,找到對(duì)應(yīng)的參照項(xiàng)目,這樣會(huì)省去很多的時(shí)間。而一個(gè)典型的硬件設(shè)計(jì)應(yīng)當(dāng)包括復(fù)位電路,時(shí)鐘電路,存儲(chǔ)器接口,模數(shù)接口,通訊接口。在硬件設(shè)計(jì)的第一步整體模塊的設(shè)計(jì)中,我們應(yīng)當(dāng)確定整體的芯片需求以及外圍電路的設(shè)計(jì),選擇合適的芯片,設(shè)計(jì)恰當(dāng)?shù)耐鈬娐芬堰_(dá)到設(shè)計(jì)的最終要求。而在畫(huà)PCB板原理圖時(shí),應(yīng)當(dāng)詳細(xì)的畫(huà)出各個(gè)模塊,細(xì)節(jié)部分不能忽視,包括一個(gè)電阻,電容,學(xué)會(huì)新建元器件庫(kù),會(huì)畫(huà)部分器件的封裝,打到最后的編譯無(wú)錯(cuò)誤。在最后的繪制PCB板的過(guò)程中,首先確定元器件的封裝無(wú)錯(cuò)誤,然后進(jìn)行元器件的擺放以及鏈接。而在此過(guò)程中,要注意規(guī)則的設(shè)置,以及層數(shù)的設(shè)計(jì),到達(dá)利用最少的層數(shù)去完成所需的硬件。

在軟件部分的設(shè)計(jì)中,從剛開(kāi)始的熟悉CCS編譯環(huán)境,到AD采樣,再到對(duì)采樣的數(shù)據(jù)進(jìn)行快速傅里葉運(yùn)算,進(jìn)行頻譜分析,以及后來(lái)的對(duì)采樣的信號(hào)進(jìn)行濾波,設(shè)計(jì)IIR和FIR濾波器對(duì)AD采樣的信號(hào)進(jìn)行處理,觀察處理后的信號(hào)的頻譜,掌握利用軟件進(jìn)行卷積運(yùn)算,F(xiàn)FT運(yùn)算,F(xiàn)IR濾波器的設(shè)計(jì)等。在這一部分的設(shè)計(jì)過(guò)程中,發(fā)現(xiàn)由于自己的C語(yǔ)言知識(shí)不夠牢固,對(duì)軟件部分的實(shí)現(xiàn)產(chǎn)生了很大的阻礙,一定的編程能力本來(lái)對(duì)于電子的學(xué)生來(lái)說(shuō)是很重要的,但是在長(zhǎng)期的學(xué)習(xí)中很多人只側(cè)重于理論知識(shí)的學(xué)習(xí),而忽略的實(shí)際的動(dòng)手能力,我們都是這一群人中的一個(gè),導(dǎo)致了最后的動(dòng)手能力,編程能力急劇下降。

在這次的課程設(shè)計(jì)中,由于自己比較喜歡干貨,不太喜歡理論知識(shí)的學(xué)習(xí),所以在動(dòng)手這一方面,自己是較為感興趣的,也真正的全身心的投入進(jìn)去,同時(shí)又學(xué)到了很多東西,接觸之前未曾接觸過(guò)的知識(shí),不斷地提升自己,在實(shí)踐中成長(zhǎng)。同時(shí)在此次設(shè)計(jì)中,發(fā)現(xiàn)了自己的許多不足,雖然自己對(duì)于動(dòng)手方面比較感興趣,但是自己的理論知識(shí)的儲(chǔ)備不夠完善,編程能力較為低下等,這都是對(duì)于自身發(fā)展的很大的阻礙,希望在今后的學(xué)習(xí)生活中能夠不斷地完善自己,充實(shí)自己,學(xué)習(xí)更多的知識(shí),更大程度的增強(qiáng)自己的動(dòng)手能力。最后,再次感謝兩位老師的辛勤付出。

六參考文獻(xiàn)

【1】 吳鎮(zhèn)揚(yáng).數(shù)字信號(hào)處理[J] 2009,(第1期).

【2】 鄒理和.數(shù)字信號(hào)處理.上冊(cè).北京:國(guó)防工業(yè)出版社,1985.

【3】 張雄偉,曹鐵勇.DSP芯片的原理與開(kāi)發(fā)應(yīng)用.第二版.北京:電子工業(yè)出版社 2000.

4.2 核心模塊及實(shí)現(xiàn)代碼

FFT算法程序:

  1. void kfft(double pr[LEN],double pi[LEN],int n,int k,double fr[LEN],double fi[LEN],int l,int il)
  2. {
  3.                 int it,m,is,i,j,nv,l0;
  4.     double p,q,s,vr,vi,poddr,poddi;
  5.     for (it=0; it<=n-1; it++)
  6.       { m=it; is=0;
  7.         for (i=0; i<=k-1; i++)
  8.           { j=m/2; is=2*is+(m-2*j); m=j;}
  9.         fr[it]=pr[is]; fi[it]=pi[is];
  10.       }
  11.     pr[0]=1.0; pi[0]=0.0;
  12.     p=6.283185306/(1.0*n);
  13.     pr[1]=cos(p); pi[1]=-sin(p);
  14.     if (l!=0) pi[1]=-pi[1];
  15.     for (i=2; i<=n-1; i++)
  16.       { p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1];
  17.         s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]);
  18.         pr[i]=p-q; pi[i]=s-p-q;
  19.       }
  20.     for (it=0; it<=n-2; it=it+2)
  21.       { vr=fr[it]; vi=fi[it];
  22.         fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1];
  23.         fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1];
  24.       }
  25.     m=n/2; nv=2;
  26.     for (l0=k-2; l0>=0; l0--)
  27.       { m=m/2; nv=2*nv;
  28.         for (it=0; it<=(m-1)*nv; it=it+nv)
  29.           for (j=0; j<=(nv/2)-1; j++)
  30.             { p=pr[m*j]*fr[it+j+nv/2];
  31.               q=pi[m*j]*fi[it+j+nv/2];
  32.               s=pr[m*j]+pi[m*j];
  33.               s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]);
  34.               poddr=p-q; poddi=s-p-q;
  35.               fr[it+j+nv/2]=fr[it+j]-poddr;
  36.               fi[it+j+nv/2]=fi[it+j]-poddi;
  37.               fr[it+j]=fr[it+j]+poddr;
  38.               fi[it+j]=fi[it+j]+poddi;
  39.             }
  40.       }
  41.     if (l!=0)
  42.       for (i=0; i<=n-1; i++)
  43.         { fr[i]=fr[i]/(1.0*n);
  44.           fi[i]=fi[i]/(1.0*n);
  45.         }
  46.     if (il!=0)
  47.       for (i=0; i<=n-1; i++)
  48.         { pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]);
  49.           if (fabs(fr[i])<0.000001*fabs(fi[i]))
  50.             { if ((fi[i]*fr[i])>0) pi[i]=90.0;
  51.               else pi[i]=-90.0;
  52.             }
  53.           else
  54.             pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306;
  55.         }
  56.    }
復(fù)制代碼

卷積程序:


  1. void Convolveok(           //卷積函數(shù)
  2.      double *x,                                          //              原始輸入數(shù)據(jù)
  3.      double *h,                                          //              沖擊響應(yīng)
  4.      double *y,                                          //              卷積輸出結(jié)果
  5.      UINT16 Leng,                                           //  序列長(zhǎng)度
  6.      UINT16 h_Len)                          
  7. {
  8.                             UINT16 m,p,j;
  9.                             double r,rm;
  10.                             double xmean = 0.0;
  11.                             double xmid[100];
  12.                             for(m=0;m<h_Len;m++)
  13.                             {
  14.                                           xmid[m] = 0.0;
  15.                             }
  16.                   for (m=0; m<Leng; m++)
  17.                             {
  18.                                           xmean = x[m] + xmean;
  19.                             }                           
  20.                             xmean = 1.0*xmean/Length;
  21.                            
  22.                             for (m=0; m<Leng; m++)
  23.                             {
  24.                                           x[m] = x[m] - xmean;
  25.                             }
  26.                             for (m=0; m<Leng; m++)
  27.                             {
  28.                                           for (p=0; p<h_Len; p++)
  29.                                              {
  30.                                                            xmid[h_Len-p-1] = xmid[h_Len-p-2];
  31.                                              }
  32.                                              xmid[0] = x[m];
  33.                                           r = 0.0;
  34.                                           rm= 0.0;
  35.                                           for (j=0; j<h_Len; j++)
  36.                                           {            
  37.                                                         r  = xmid[j] * h[j];
  38.                                                         rm = rm + r;
  39.                                              }
  40.                                           y[m] = rm;
  41.                                }
  42. }
復(fù)制代碼


頻譜函數(shù),求最大值和次大值函數(shù):

  1. void pinpu(double pr[Length])
  2. {
  3.               num1=0;
  4.               num2=0;
  5.               v=0;
  6.               for(k=0;k<128;k++)
  7.               {
  8.                             value[k]=0;
  9.                             number[k]=0;
  10.               }
  11.               for(k=1;k<127;k++)
  12.               {
  13.                             if(pr[k]>=pr[k-1]&&pr[k]>=pr[k+1])
  14.                             {
  15.                                           value[v]=pr[k];
  16.                                           number[v]=k;
  17.                                           v++;
  18.                             }
  19.               }
  20.               max1=value[0];
  21.               max2=value[0];
  22.               for(k=1;k<=127;k++)
  23.               {
  24.                             if(value[k]>=max1)
  25.                             {
  26.                                           max2=max1;
  27.                                           max1=value[k];
  28.                                           num2=num1;
  29.                                           num1=number[k];
  30.                             }
  31.                             else if(value[k]>=max2)
  32.                             {
  33.                                           max2=value[k];
  34.                                           num2=number[k];
  35.                             }
  36.                             fk1=250000/256*num1;
  37.                             fk2=250000/256*num2;
  38.                             if(fk1>fk2)
  39.                             {
  40.                                           fk3=fk1;
  41.                                           fk1=fk2;
  42.                                           fk2=fk3;
  43.                             }
  44.               }
  45. }
復(fù)制代碼


FIR濾波器設(shè)計(jì)函數(shù)

void firdes(double npass)  //FIR濾波器子程序
  {
                int t;
                 for (t=0; t<51; t++)
                {
if (t == ((51-1)/2))
              h[t]=2*npass;
else
              h[t] = sin((t-(51-1)/2.0)*npass*2*pii)/(pii*(t-(51-1)/2.0));
                }

  }

LCD顯示函數(shù):
  1. void transform()//databuff轉(zhuǎn)換函數(shù)
  2. {
  3.               data_buff3[0]=0xb8;
  4.     data_buff3[1]=0xdf;
  5.     data_buff3[2]=0xc6;
  6.     data_buff3[3]=0xb5;
  7.     number1[0]=fk1/10000;
  8.     number1[1]=fk1/1000-number1[0]*10;
  9.     number1[2]=fk1/100-number1[0]*100-number1[1]*10;
  10.     number1[3]=fk1/10-number1[0]*1000-number1[1]*100-number1[2]*10;
  11.     ffk1=fk1-number1[0]*10000-number1[1]*1000-number1[2]*100;
  12.     ffk1=ffk1*10;
  13.     asm(" nop ");
  14.     number1[4]=ffk1/10;
  15.     data_buff3[4]=number1[0]+0x30;
  16.     data_buff3[5]=number1[1]+0x30;
  17.     data_buff3[6]=number1[2]+0x30;
  18.     data_buff3[7]=number1[3]+0x30;
  19.     data_buff3[8]=number1[4]+0x30;
  20.     //******************************//

  21.     data_buff4[0]=0xb5;
  22.     data_buff4[1]=0xcd;
  23.     data_buff4[2]=0xc6;
  24.     data_buff4[3]=0xb5;
  25.     number2[0]=fk2/10000;
  26.         number2[1]=fk2/1000-number2[0]*10;
  27.         number2[2]=fk2/100-number2[0]*100-number2[1]*10;
  28.         number2[3]=fk2/10-number2[0]*1000-number2[1]*100-number2[2]*10;
  29.         ffk2=fk2-number2[0]*10000-number2[1]*1000-number2[2]*100;
  30.         ffk2=ffk2*10;
  31.         asm(" nop ");
  32.         number1[4]=ffk2/10;
  33.         data_buff4[4]=number2[0]+0x30;
  34.         data_buff4[5]=number2[1]+0x30;
  35.         data_buff4[6]=number2[2]+0x30;
  36.         data_buff4[7]=number2[3]+0x30;
  37.         data_buff4[8]=number2[4]+0x30;
  38. }
  39. void display()  //顯示函數(shù)
  40. {
  41.                 UINT16  temp,i;

  42.               //----------系統(tǒng)初始化-------------------------------
  43.                  asm(" nop ");
  44.                  cpu_initt();          //初始化CPU
  45.                  asm(" nop ");

  46.               //-----------LCD初始化--------------------------------
  47.                  asm(" nop ");
  48.                  Initlcm();
  49.               //------------LCD顯示---------------------------------
  50.               for(;;)
  51.               {

  52.                  Delay(500);
  53.               //-----------------------------------------------------------
  54.                  SendCMD(0x0080);      //設(shè)定DDRAM的地址在第一行 82H
  55.                  delay_100us();
  56.                  for(i =0;i<16;i++)
  57.                  {

  58.                     SendDat(data_buff1[i]);
  59.                     delay_100us();
  60.                     asm(" nop ");
  61.                  }
  62.                  asm(" nop ");

  63.                  //------------------------------
  64.                  SendCMD(0x0092);      //設(shè)定DDRAM的地址在第二行 92H
  65.                  delay_100us();
  66.                  for(i =0;i<10;i++)
  67.                  {

  68.                     SendDat(data_buff2[i]);
  69.                     delay_100us();
  70.                  }
  71.                  asm(" nop ");
  72.                 //--------------------------------
  73.                  SendCMD(0x008a);      //設(shè)定DDRAM的地址在第三行 8AH
  74.                  delay_100us();
  75.                  transform();
  76.                  for(i =0;i<10;i++)
  77.                  {

  78.                     SendDat(data_buff3[i]);
  79.                     delay_100us();
  80.                  }
  81.                  asm(" nop ");
  82.                  //--------------------------------
  83.                  SendCMD(0x009a);      //設(shè)定DDRAM的地址在第四行 9AH
  84.                  delay_100us();
  85.                  for(i =0;i<10;i++)
  86.                  {

  87.                     SendDat(data_buff4[i]);
  88.                     delay_100us();
  89.                  }
  90.                  asm(" nop ");
  91.               //-------------------------------------------------------------
  92.                  delay_100us();
  93.                  Delay(500);
  94.                  delay_100us();
  95.                  SendCMD(CLEAR);       //清除顯示

  96.                  }
復(fù)制代碼


外部中斷2服務(wù)函數(shù)(包含歸一化函數(shù)):

  1. interrupt void ExtInt2()           //中斷2中斷子程序
  2. {

  3.      *(unsigned int*)IFR=0xFFFF;   //清除所有中斷標(biāo)志,"寫(xiě)1清0" ,這個(gè)語(yǔ)句可以省略,響應(yīng)中斷自動(dòng)清除中斷標(biāo)志

  4.      //----讀AD7822的轉(zhuǎn)換結(jié)果----------------

  5.    data_buff[i] = port8002 & 0x00ff;

  6.    i++;

  7.    if(i == 256)
  8.    {sum=0;
  9.    for(i2=0;i2<256;i2++) //歸一化函數(shù)
  10.                  {sum=sum+data_buff[i2];}
  11.    ave=sum/256;
  12.    for(i3=0;i3<256;i3++)
  13.    {pr[i3]=data_buff[i3]-ave;
  14.    data_buff[i3]=pr[i3];
  15.     pi[i3]=0.0;
  16.    fr[i3]=0.0;
  17.    fi[i3]=0.0;}
  18. kfft(pr,pi,256,8, fr, fi,0,1);
  19. pinpu(pr);
  20. npass=(fk1+fk2)/500000;
  21. firdes(npass);
  22. Convolvevok(data_buff,h,y,256,51);
  23.               for(j=0;j<256;j++)
  24. {
  25.               pi[j]=0;
  26. }
  27. kfft(y,pi,256,8,fr,fi,0,1);
  28. display();
  29.       i = 0; //在此設(shè)斷點(diǎn)
  30.       }
  31.      return;
  32. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
DSP設(shè)計(jì)總結(jié)報(bào)告_電子1502王宇1505020223.docx (941.1 KB, 下載次數(shù): 96)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:521065 發(fā)表于 2021-11-5 14:50 | 顯示全部樓層
學(xué)習(xí)到了好東西,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:940788 發(fā)表于 2021-6-20 10:28 | 顯示全部樓層
大神厲害,666
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表