DSP集成開發環境中的混合編程及FFT算法的實現

2021-01-10 電子產品世界

 1  引言

       CCS(Code Composer Studio)是TI公司的DSP集成開發環境。它提供了環境配置、源文件編輯、程序調試、跟蹤和分析等工具,幫助用戶在一個軟體環境下完成編輯、編譯連結、調試和數據分析等工作。與TI提供的早期軟體開發工具相比,利用CCS能夠加快軟體開發進程,提高工作效率。CCS一般工作在兩種模式下:軟體仿真器和與硬體開發板相結合的在線編程。前者可以脫離DSP晶片,在PC機上模擬DSP指令集與工作機制,主要用於前期算法實現和調試。後者實時運行在DSP晶片上,可以在線編制和調試應用程式。 

       2  C語言和彙編語言的混合編程

       TMS320 C5000系列的軟體設計通常有三種方法:

       (1  
) 用C語言開發;

       (2) 用彙編語言開發;

       (3) C和彙編的混合開發。

       其中用C語言開發具有兼容性和可移植的優點,有利於縮短開發周期和減少開發難度,但是在運算量較大的情況下,C代碼的效率還是無法和手工編寫的彙編代碼的效率相比,比如FFT運算,用彙編語言開發的效率高,程序執行速度快,而且可以合理利用晶片的硬體資源,但是開發難度較大,開發周期長,而且可讀性和可移植性差。C和彙編的混合編程則可以充分利用前兩者的優點,以達到最佳利用DSP資源的目的。但是,採用C和彙編語言混合編程必須遵循相關函數調用規則和寄存器調用規則,否則會給程序的開發帶來意想不到的問題。

       2.1  C語言和彙編語言混合編程的四種方法

       (1) 獨立編寫彙編程序和C程序,分開編譯或彙編成各自的目標代碼模塊,再用連結器將二者連結起來。這種方法比較靈活,但是設計者必須自己維護各彙編模塊的入口和出口代碼,自己計算傳遞的參數在堆棧中的偏移量,工作量較大,但是能做到對程序的絕對控制。

       (2) 在C程序中使用彙編程序中定義的變量和常數。

       (3) 在C程序中內嵌彙編語句。這種方法可以實現C語言無法實現的一些硬體控制功能,如修改中斷控制寄存器。

       (4) 將C語言編譯生成相應的彙編代碼,手工修改和優化C編譯器生成的彙編代碼。採用這種方法可以控制C編譯器,從而產生具有交叉列表的彙編程序,而設計者可以對其中的彙編語句進行修改,然後對彙編程序進行編譯,產生目標文件。

       後3種方法由於在C中直接嵌入了彙編語言,易造成程序混亂,破壞C環境,甚至導致程序崩潰,而開發者又很難對不良結果進行預期和有效控制。而如果採用第一種方法,只要遵循有關C語言函數調用規則和寄存器規則,就能預見到程序運行的結果,保證程序正確。

       2.2  編程注意事項

       C編譯器對函數調用制定了一組嚴格的規則。除了特殊的運行時間支持庫函數外,任何調用函數和被C函數調用的函數都必須遵守這些規則。結合作者在編程中的實際情況和切身體會,提出在編程時要注意以下幾點:

       (1) 必須保護任何被函數修正的專用寄存器。這些專用寄存器包括:AR1,AR6,AR72和堆棧指針(SP)。其中,如果對SP正常使用,則不必明顯的保存。換句話說,只要彙編函數在調用返回時彈出壓入的對象,實際上就已經保護了SP。

       (2) 中斷函數必須保存其使用的所有寄存器。

       (3) 從彙編函數中調用C函數時,第一個參數(最左邊的)必須放入累加器A中,剩下的參數按照自右向左的順序壓入堆棧。 

      (4) 如果函數有返回值,則返回值存放在累加器A中。

       (5) 調用C函數時,注意C函數隻保護了幾個特定的寄存器,對於其他寄存器C函數是可以自由使用的。

       (6) 長整數和浮點數存儲在存儲器中的方法是最高有效字在低位地址。

       (7) 彙編語言模塊不能改變由C模塊產生的.cinit段,如果改變其中的內容將會引起不可預測的後果。

       (8) 在彙編語言模塊中,對可以從C中訪問的變量和函數名需加上前綴「_」。對於僅用於彙編語言模塊中的標識符,不用加下劃線。而且如果僅在彙編中使用,只要不加下劃線,即使與C程序中定義的對象名相同,也不會造成衝突。

   
       (9) 任何在彙編語言模塊中聲明的將要從C訪問或調用的對象或函數,都必須在彙編語言中用.global偽指令聲明為全局變量。同樣,任何在C程序中定義而將在彙編中訪問或調用的對象或函數,在彙編中也必須用.global聲明。

       (10) 在默認的情況下,編譯器總是認為CPL為1。因此,若在彙編程序中將CPL清0,則在返回C環境時,必須將其恢復為1;在默認的情況下,編譯器總是認為 OVM為0。因此,若在彙編程序中將OVM置為1,則返回C環境時,必須將其恢復為0;ARP在函數進入和返回時,必須為0,即當前輔助寄存器為AR0。函數執行時可以為其他值。 {{分頁}} 


       3  編程實例

       3.1  FFT算法簡介

       FFT是一種高效實現離散傅立葉變換的算法,在數位訊號處理系統中,FFT作為一個非常重要的工具,甚至成為DSP運算能力的一個考核因素。如何將FFT算法很好的應用到DSP系統中對於DSP系統的設計具有重要的意義。

       一個優化的實數FFT算法是一個組合以後的算法。該算法主要分為以下幾步,首先將輸入的2N點實序列進行位倒序組合成一個N點的復序列,之後對復序列進行N 點的FFT運算,最後再由N點的複數輸出拆散成2N點的複數序列,這2N點的複數序列與原始的2N點的實數輸入序列的DFT輸出一致。(詳細的算法介紹可參考相關信號處理書籍)。

       3.2  C主程序

#include "stdlib.h"
extern void fft();  // FFT運算函數
int DisData[256];  // 輸出結果
int SimData[256]={
0,6270,11585,15137, 16384, 15137, 11585,6270,
0, -6270, -11585,-15137,-16384,-15137,-11585,-6270,
……
0,6270,11585,15137,16384,15137,11585,6270,
0,-6270,-11585,-15137,-16384,-15137,-11585,-6270
};  
// 輸入數據
int  main()
{
rfft();  
// 調用FFT函數
while(1)  ;
}

       本程序中FFT運算所用到的數據是通過matlab仿真產生的,然後通過全局數組進行傳值,這種方式的優點是數據的通用性強,方便對數據進行其他相關處理; 也可通過其他C程序產生然後保存到一個文本文件中,再由彙編程序將該數據文件拷到數據存儲器中參與FFT運算。這種方式的優點是程序的可讀性強,缺點是當輸入數據修改後,必須進行重新編譯、彙編和連結。

3.3  彙編程序

  .mmregs
  .global  sav_sin,sav_idx,sav_grp,_rFFT,_DisData
  .data 
DATA .space 1024   ;數據緩衝區
INPUT .set     0x9000 ;輸入數據起始地址
N  .set 128  ;複數點數
LOGN .set 7     ;碟形運算級數
sav_grp .usect "tempv",3 ;定義組變量值
sav_sin .set sav_grp+1 ;定義旋轉因子表
sav_idx .set sav_grp+2
  .copy  "twiddle1.inc" ;正弦表係數
  .copy  "twiddle2.inc" ;餘弦表係數
  .text
_rfft:
  SSBX TC
  SSBX C
  RSBX OVA
  RSBX OVB
  LD  #0,DP
  RSBX CPL
  SSBX XF
  SSBX SX  
M
  LD  #00,ASM   
  SSBX FRCT
  ……   {{分頁}}

       本程序主要是對輸入的256點實數作FFT運算,通過修改N和LOGN可以完成16-1024點的FFT運算。在編寫彙編程序的時候要注意以下幾個方面:

       (1) 由於採用循環尋址來對旋轉因子表尋址,因此每張表的開始地址必須是10個LSB位為0的地址。如:正弦表係數可以放在0400h開始的地址,餘弦表係數可以放在0800h開始的地址;

       (2) 在彙編程序的入口處要注意設置好彙編程序所需要的運行環境(見前述程序),如果此處按照編譯器默認的環境將得不到正確的結果。詳細的彙編程序可參考TI公司提供的例程。

       3.4  運算結果

       輸入正弦信號的頻率為f=16Hz,幅值為1(單位),採樣長度為2N=256點,採樣頻率為fs=256Hz。CCS提供了很多方法將程序產生的數據畫圖顯示,包括時域/頻域波形顯示等。可通過查看相關圖像來檢驗FFT運算的正確性。由連結命令文件可以知道輸入信號存儲在程序存儲區0900h開始的256 個單元中,經程序計算得到的信號幅值譜存放在數據存儲區0200h開始的256個單元中。在CCS中選擇View——>Graph——> Time/Frequency命令,相關設置可參考圖1:  

       

                         圖1  FFT運算結果查看選項設置參考

       輸入信號的時域波形見圖2。 

  


  圖2     輸入信號的時域波形

       經FFT運算後得到的信號幅值譜圖見圖3。 



     圖3     信號幅值譜圖

     將輸入信號通過Matlab仿真進行驗證。輸入信號的時域波形見圖4。  {{分頁}}

圖4     輸入信號的時域波形

       經FFT運算後得到的信號幅值譜圖見圖5。 


  圖5     信號幅值譜圖  


       通過比較CCS中的輸出圖形和Matlab中的仿真輸出圖形, 可以看到二者是一致的,說明本程序的結果是正確的。

       4  結束語

       本文通過實例,說明了TMS320 C5000系列DSP晶片的混合編程方法,利用混合編程達到了提高程序的可讀性與編程效率的目的,是開發DSP軟體的常用方法。本文介紹的混合編程方法不但適用於TI C5000系列DSP晶片,同樣也適用於TI其他系列的DSP晶片,如C2000系列、C6000系列,甚至對其他晶片,如51系列單片機等,實現混合編程也有很大參考價值。


相關焦點

  • 第六講 DSP在雷達信號處理中的應用
    dsp可以利用硬體算術單元、片內存儲器、哈佛總線結構、專用尋址單元、流水處理技術等特有的硬體結構,高速完成fft、fir、複數乘加、相關、三角函數以及矩陣運算等數位訊號處理。因此,dsp非常適合雷達數位訊號處理算法的實現。 fft是雷達信號處理的重要工具。
  • 使用STM32 的DSP庫進行FFT變換
    * 使用三角函數生成採樣點,供FFT計算* 進行FFT測試時,按下面順序調用函數即可:* dsp_asm_init();* dsp_asm_test();*/#include "stm32f10x.h"#include "dsp_asm.h"#include "stm32_dsp.h"#include "table_fft.h"
  • 基於DSP的FFT算法實現
    基於DSP的FFT算法實現1、FFT的原理快速傅氏變換(FFT)是離散傅氏變換的快速算法,它是根據離散傅氏變換的奇、偶、
  • 用FPGA實現FFT算法(圖)
    當n較大時,因計算量太大,直接用dft算法進行譜分析和信號的實時處理是不切實際的。快速傅立葉變換(fast fourier transformation,簡稱fft)使dft運算效率提高1~2個數量級。其原因是當n較大時,對dft進行了基4和基2分解運算。fft算法除了必需的數據存儲器ram和旋轉因子rom外,仍需較複雜的運算和控制電路單元,即使現在,實現長點數的fft仍然是很困難。
  • 基於MSP430系列微控制器的FFT算法實現
    監測技術的研究對市電質量的補償具有很高的價值,考慮到實際情況,在供電系統質量監測中需要一些低成本,但分析速度較快的監測系統。離散時間採樣的快速傅立葉變換FFT(fast Fouriertrans form)算法是目前最主要的諧波檢測和分析方法。FFT算法的實現可以採用專用晶片37—40、DSP晶片6—1141—44、FPGA晶片193— 207以及微控制器等。
  • 基於DSP集成開發環境CCS2.2的指紋圖像預處理的應用研究
    基於DSP集成開發環境CCS2.2的指紋圖像預處理的應用研究 趙慧民 , 朱立 發表於 2020-12-01 10:47:00 利用生物認證技術進行個人身份鑑定,取代傳統的使用鑰匙
  • 基於DSP和FPGA的機器人聲控系統設計與實現
    2 系統硬體總體設計 系統的硬體功能是實現語音指令的採集和步進電機的驅動控制,為系統軟體提供開發和調試平臺。如圖1所示。 tlv320aic23具有可編程特性,dsp可通過控制接口來編輯該器件的控制寄存器,而且能夠編譯spi,i2c兩種規格的接口,tlv320aic23b與dsp5509的電路連接如圖2所示。
  • 基於Cyclone II FPGA開發平臺實現語音識別算法程序的設計
    基於Cyclone II FPGA開發平臺實現語音識別算法程序的設計 瀋陽;馮良;洪誠 發表於 2021-01-12 10:21:38 SOPC可編程片上系統是一種獨特的嵌入式微處理系統。
  • 利用FFT IP Core實現FFT算法
    FFT傳統實現方法無非是軟體(軟體編程)和硬體(專用晶片ASIC)兩種,FPGA的出現使人們在FFT的實現方面又多了一種選擇。FPGA同時具有軟體編程的靈活性和ASIC電路的快速性等優點,適合高速數位訊號處理。大多數FPGA廠商都提供了可配置的邏輯核(Core)實現各種算法功能,其中包括FFT IP Core(智慧財產權核)。
  • 固定幾何結構的FFT算法及其FPGA實現
    在用VHDL編程時可以用MegaWizard的方法指定用DSP模塊生成乘法器,用這種乘法器來做蝶形,用多個蝶形來構成FFT運算級,通過循環即可實現FFT核心運算的並行化。用Altera公司的Quartus軟體做邏輯分析和波形分析。Quartus軟體具有很強的硬體仿真和邏輯分析功能,它可將用VHDL編寫的硬體描述綜合到FPGA中。
  • 通俗易懂的講解FFT的讓你快速了解FFT
    在基本上的研究FFT,並且通過編程的形式實現之後。我決定寫一篇通俗易懂的關於FFT的講解。因此我在接下來的敘述中儘量非常通俗細緻的講解。 本人最早知道傅立葉變換的時候是沉迷於音樂的頻譜跳動無法自拔,當時就很想做一個音樂頻譜顯示器。搜閱了很多資料之後,才了解到傅立葉變換,和FFT。
  • DARPA開發集成混合模式射頻電子產品
    當前基於單個晶片的商用射頻混合模式系統(SoC)是在數字的互補金屬氧化物半導體(CMOS)平臺上實現的; 這種技術已經使用了數十年,用於構建集成電路、高度集成的收發器、微處理器等。儘管遵循摩爾定律的軌跡不斷發展和擴展並獲得了高集成度,但這些CMOS平臺仍無法支持更高頻率下的以更大的信號帶寬和更高的解析度所進行的操作,從而從根本上限制了其在新興國防射頻應用領域對下一代混合模式接口的應用。
  • 基於FPGA的高速流水線FFT算法實現
    FFT(快速傅立葉變換)算法是作為DFT的快速算法提出,它將長序列的DFT分解為短序列的DFT,大大減少了運算量,使得DFT算法在頻譜分析、濾波器設計等領域得到了廣泛的應用。  FPGA(現場可編程門陣列)是一種具有大規模可編程門陣列的器件,不僅具有專用集成電路(ASIC)快速的特點,更具有很好的系統實現的靈活性。FPGA可通過開發工具實現在線編程。
  • 28335DSP的FFT算法時間
    最近在做課題過程中用到28335實現FFT算法,分析的數據是由AD高速採樣得來,為減輕CPU的負擔,保證實時性,AD採樣的數據通過DMA直接送到存儲器
  • matlab下實現FFT信號分析
    ,當採樣頻率 fs.max大於信號中最高頻率 fmax 的 2 倍時(fs.max > 2fmax),採樣之後的數位訊號完整地保留了原始信號中的信息,一般實際應用中保證採樣頻率為信號最高頻率的2.56~4倍;採樣定理又稱奈奎斯特定理或香農採樣定理。
  • 基於小波變換與DSP的實時音頻視頻處理系統
    本文介紹一種基於adv611,ct8021晶片同時結合ti公司的tms320c6201晶片實現音/視頻實時處理系統。在該實時系統中,dsp晶片作為控制核心、一方面要管理adv611,ct8021,存儲器和通信接口,另一方面要對adv611的圖像壓縮效果進行調解,對數據速率實時控制。系統實現方案原理圖如圖1所示。
  • 基於FPGA的FFT算法硬體實現
    在高速數位訊號處理中,FFT的處理速度往往是整個系統設計性能的關鍵所在。FPGA(現場可編程門陣列)是一種具有大規模可編程門陣列的器件,不僅具有ASIC(專用集成電路)快速的特點,更具有很好的系統實現的靈活性。基於FPGA的設計可以滿足實時數位訊號處理的要求,在市場競爭中具有很大的優勢。因此,FPGA為高速FFT算法的實現提供了一個很好的平臺。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    之 初識 excel操控 12【VBA宏工程插件與python+xlwings混合調用】 13python +VBA混合開發 之 winapi自由世界 14python+panas+excel+vba混合調用 15【hybridDev實戰】【py+excel+ppt自動匯報】 16原創獨家配套筆記之混合開發VBA基礎
  • 用FPGA實現FFT算法
    當N較大時,因計算量太大,直接用DFT算法進行譜分析和信號的實時處理是不切實際的。快速傅立葉變換(Fast Fourier Transformation,簡稱FFT)使DFT運算效率提高1~2個數量級。其原因是當N較大時,對DFT進行了基4和基2分解運算。FFT算法除了必需的數據存儲器ram和旋轉因子rom外,仍需較複雜的運算和控制電路單元,即使現在,實現長點數的FFT仍然是很困難。
  • 基於DSP的數字掃描探針顯微鏡的硬體解決方案研究
    技術也已經廣泛地應用於通信、測量、多媒體、消費電子產品等領域,由於把dsp和spm結合在一起是spm儀器發展的必然方向,它能使spm性能更趨於完善,為此,本文介紹如何用tms320c5416來實現這一設想!