CKS32F4xx系列DSP功能
CKS32F4xx系列使用高性能的32位內核,支持浮點運算單元(FPU),同時還支持DSP指令以及存儲保護(MPU)用來加強應用的安全性。
DSP介紹
CKS32F4xx系列擁有兩個DSP指令:MAC指令(32位乘法累加)和SIMD指令。32位乘法累加(MAC)單元包括新的指令集,能夠在單周期內完成一個32×32+64→64的操作或兩個16×16的操作。而SIMD指令與硬件乘法器一起工作(MAC),使所有這些指令都能在單個周期內執行。受益于SIMD指令的支持,CKS32F4xx系列能在單周期內完成高達32×32+64→64的運算,為其他任務釋放處理器的帶寬,而不是被乘法和加法消耗運算資源。
DSP源碼庫具有以下功能:
提供浮點數的各種基本運算函數,如向量加減乘除等運算。
CommonTables
arm_common_tables.c文件提供位翻轉或相關參數表。
ComplexMathFunctions
復雜數學功能,如向量處理,求模運算的。
ControllerFunctions
控制功能函數。包括正弦余弦,PID電機控制,矢量Clarke變換,矢量Clarke逆變換等。
FastMathFunctions
快速數學功能函數。提供了一種快速的近似正弦,余弦和平方根等,相比CMSIS計算庫要快的數學函數。
FilteringFunctions
濾波函數功能,主要為FIR和LMS(最小均方根)等濾波函數。
MatrixFunctions
矩陣處理函數。包括矩陣加法、矩陣初始化、矩陣反、矩陣乘法、矩陣規模、矩陣減法、矩陣轉置等函數。
StatisticsFunctions
統計功能函數。如求平均值、最大值、最小值、計算均方根RMS、計算方差/標準差等。
SupportFunctions
支持功能函數,如數據拷貝,Q格式和浮點格式相互轉換,Q任意格式相互轉換。
TransformFunctions
變換功能。包括復數FFT(CFFT)/復數FFT逆運算(CIFFT)、實數FFT(RFFT)/實數FFT逆運算(RIFFT)、和DCT(離散余弦變換)和配套的初始化函數。
DSP庫運行環境搭建
接下來我們講解如何搭建DSP庫運行環境,只要運行環境搭建好了,使用DSP庫里面的函數來做相關處理就非常簡單了。在MDK里面搭建CKS32F4xx系列的DSP運行環境(使用.lib方式)是很簡單的,分為3個步驟:
1
添加文件
首先,我們在例程工程目錄下新建DSP_LIB文件夾,存放我們將要添加的相關文件,如圖1所示:
然后,打開工程,新建DSP_LIB分組,并將.lib文件添加到工程里面,如圖2所示:
2
添加頭文件包含路徑
添加好.lib文件后,我們要添加頭文件包含路徑,將第一步拷貝的Include文件夾和DSP_LIB文件夾加入頭文件包含路徑,如圖3所示:
3
添加全局宏定義
最后,為了使用DSP庫的所有功能,我們還需要添加幾個全局宏定義:
1,__FPU_USED
2,__FPU_PRESENT
3,ARM_MATH_CM4
4,__CC_ARM
5,ARM_MATH_MATRIX_CHECK
6,ARM_MATH_ROUNDING
添加方法:點擊魔法棒→C/C++選項卡,然后在Define里面進行設置,如圖4所示:
這里,兩個宏之間用“,”隔開。并且,上面的全局宏里面,我們沒有添加__FPU_USED,因為這個宏定義在Target選項卡設置Code Generation的時候選擇了:Use FPU(如果沒有設置Use FPU,則必須設置!!),故MDK會自動添加這個全局宏,因此不需要我們手動添加了。這樣,在Define處要輸入的所有宏為:
CKS32F40_41xxx,USE_STDPERIPH_DRIVER,ARM_MATH_CM4,__CC_ARM,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING 共6個。
至此,CKS32F4xx系列的DSP庫運行環境就搭建完成了。為了方便調試,本章例程我們將MDK的優化設置為-O0優化,以得到最好的調試效果。
DSP FFT測試
關于FFT這里就不再詳細介紹。如果我們要自己實現FFT算法,對于不懂數字信號處理的人來說,是比較難的,不過,DSP庫里面就有FFT函數給我們調用,因此我們只需要知道如何使用這些函數,就可以迅速的完成FFT計算。DSP庫里面提供了定點和浮點 FFT 實現方式,并且有基4的也有基2的,大家可以根據需要自由選擇實現方式。
注意:對于基4的FFT輸入點數必須是4n,而基2的FFT 輸入點數則必須是2n,并且基4的FFT算法要比基2的快。本章我們將采用DSP庫里面的基4浮點FFT算法來實現FFT變換,并計算每個點的模值,所用到的函數有:
FFT變換用到的函數
arm_status arm_cfft_radix4_init_f32( arm_cfft_radix4_instance_f32 * S, uint16_t fftLen,uint8_t ifftFlag,uint8_t bitReverseFlag)
void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc)
void arm_cmplx_mag_f32(float32_t * pSrc,float32_t * pDst,uint32_t numSamples)
arm_cfft_radix4_init_f32用于初始化FFT運算相關參數,其中:fftLen用于指定 FFT長度(16/64/256/1024/4096),本章設置為1024;ifftFlag用于指定是傅里葉變換(0)還是反傅里葉變換(1),本章設置為0;bitReverseFlag用于設置是否按位取反,本章設置為1;最后,所有這些參數存儲在一個 arm_cfft_radix4_instance_f32結構體指針S里面。
arm_cfft_radix4_f32就是執行基4浮點FFT運算的,pSrc傳入采集到的輸入信號數據(實部+虛部形式),同時FFT變換后的數據,也按順序存放在pSrc里面,pSrc必須大于等于 2倍fftLen長度。另外,S結構體指針參數是先由arm_cfft_radix4_init_f32函數設置好,然后傳入該函數的。
arm_cmplx_mag_f32用于計算復數模值,可以對FFT變換后的結果數據,執行取模操作。pSrc為復數輸入數組(大小為 2*numSamples)指針,指向FFT變換后的結果;pDst 為輸出數組(大小為 numSamples)指針,存儲取模后的值;numSamples就是總共有多少個數據需要取模。
通過這三個函數,我們便可以完成 FFT 計算,并取模值。
主函數
int main(void)
{
arm_cfft_radix4_instance_f32 scfft;
float time;
u8 buf[50];
u16 i;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
delay_init(168); //初始化延時函數
Debug_USART_Config(); //初始化串口波特率為115200
TIM3_Int_Init(65535,84-1); //1Mhz計數頻率,最大計時65ms左右超出
arm_cfft_radix4_init_f32(&scfft,FFT_LENGTH,0,1);//初始化scfft結構體,設定FFT相關參數
while(1)
{
for(i=0;i
{
fft_inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*4/FFT_LENGTH)+50*arm_cos_f32(2*PI*i*8/FFT_LENGTH); //生成輸入信號實部
fft_inputbuf[2*i+1]=0;//虛部全部為0
}
TIM_SetCounter(TIM3,0);//重設TIM3定時器的計數器值
timeout=0;
arm_cfft_radix4_f32(&scfft,fft_inputbuf); //FFT計算(基4)
time=TIM_GetCounter(TIM3)+(u32)timeout*65536;
sprintf((char*)buf,"%0.3fms ",time/1000);
printf(" FFT基4運算運行時間為: %s", buf);
arm_cmplx_mag_f32(fft_inputbuf,fft_outputbuf,FFT_LENGTH);
printf(" %d point FFT runtime:%0.3fms ",FFT_LENGTH,time/1000);
printf("FFT Result: ");
for(i=0;i
{
printf("fft_outputbuf[%d]:%f ",i,fft_outputbuf[i]);
}
delay_ms(2000);
delay_ms(2000);
delay_ms(2000);
}
}
主函數里面通過我們前面介紹的三個函數:arm_cfft_radix4_init_f32、 arm_cfft_radix4_f32和arm_cmplx_mag_f32來執行FFT變換并取模值。每隔6秒就會重新生成一個輸入信號序列,并執行一次FFT計算,將 arm_cfft_radix4_f32 所用時間統計出來,同時將取模后的模值通過串口打印出來。
審核編輯:劉清
-
處理器
+關注
關注
68文章
19286瀏覽量
229842 -
dsp
+關注
關注
553文章
7998瀏覽量
348925 -
MPU
+關注
關注
0文章
359瀏覽量
48797 -
浮點運算
+關注
關注
0文章
19瀏覽量
11168
原文標題:MCU微課堂|CKS32F4xx系列DSP功能
文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論