<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 使用STM32 的DSP庫(kù)進(jìn)行FFT變換

          使用STM32 的DSP庫(kù)進(jìn)行FFT變換

          作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
          /*

          *********************************************************************************************************
          FileName:dsp_asm.h
          *********************************************************************************************************
          */

          #ifndef __DSP_ASM_H__
          #define __DSP_ASM_H__
          *********************************************************************************************************
          * FUNCTION PROTOTYPES
          *********************************************************************************************************
          */

          void dsp_asm_test(void);
          void dsp_asm_init(void);

          #endif /* End of module include. */
          /*8888888888888888888888888888888888888888888888888888888888888888*/
          /*8888888888888888888888888888888888888888888888888888888888888888*/
          /*
          * FileName:dsp_asm.c
          * Author:Bobby.Chen
          * Email:heroxx@163.com
          * Date:2010-08-11
          * Description:This file showes how to use the dsp library in mdk project.
          * 使用三角函數(shù)生成采樣點(diǎn),供FFT計(jì)算
          * 進(jìn)行FFT測(cè)試時(shí),按下面順序調(diào)用函數(shù)即可:
          * dsp_asm_init();
          * dsp_asm_test();
          */
          #include "stm32f10x.h"
          #include "dsp_asm.h"
          #include "stm32_dsp.h"
          #include "table_fft.h"
          #include
          #include


          /*
          *********************************************************************************************************
          * LOCAL CONSTANTS
          *********************************************************************************************************
          */
          #define PI2 6.28318530717959
          // Comment the lines that you dont want to use.
          // 要模擬FFT,請(qǐng)注釋掉其他的預(yù)定義
          // 此處也可以全部注釋掉,在MDK的工程屬性->"C/C++"->"Preprocessor Symbols"-"Define:"中添加NPT_XXX項(xiàng)目
          // 但是這樣做法的缺點(diǎn)是每次修改XXX數(shù)據(jù),都會(huì)導(dǎo)致MDK下次編譯時(shí)會(huì)編譯全部文件,速度太慢。
          //#define NPT_64 64
          #define NPT_256 256
          //#define NPT_1024 1024

          // N=64,Fs/N=50Hz,Max(Valid)=1600Hz
          // 64點(diǎn)FFt,采樣率3200Hz,頻率分辨率50Hz,測(cè)量最大有效頻率1600Hz
          #ifdef NPT_64
          #define NPT 64
          #define Fs 3200
          #endif

          // N=256,Fs/N=25Hz,Max(Valid)=3200Hz
          // 256點(diǎn)FFt,采樣率6400Hz,頻率分辨率25Hz,測(cè)量最大有效頻率3200Hz
          #ifdef NPT_256
          #define NPT 256
          #define Fs 6400
          #endif

          // N=1024,Fs/N=5Hz,Max(Valid)=2560Hz
          // 1024點(diǎn)FFt,采樣率5120Hz,頻率分辨率5Hz,測(cè)量最大有效頻率2560Hz
          #ifdef NPT_1024
          #define NPT 1024
          #define Fs 5120
          #endif

          /*
          *********************************************************************************************************
          * LOCAL GLOBAL VARIABLES
          *********************************************************************************************************
          */
          extern uint16_t TableFFT[];
          long lBUFIN[NPT]; /* Complex input vector */
          long lBUFOUT[NPT]; /* Complex output vector */
          long lBUFMAG[NPT];/* Magnitude vector */
          /*
          *********************************************************************************************************
          * LOCAL FUNCTION PROTOTYPES
          *********************************************************************************************************
          */
          void dsp_asm_powerMag(void);

          /*
          *********************************************************************************************************
          * Initialize data tables for lBUFIN
          * 模擬采樣數(shù)據(jù),采樣數(shù)據(jù)中包含3種頻率正弦波:50Hz,2500Hz,2550Hz
          * lBUFIN數(shù)組中,每個(gè)單元數(shù)據(jù)高字(高16位)中存儲(chǔ)采樣數(shù)據(jù)的實(shí)部,低字(低16位)存儲(chǔ)采樣數(shù)據(jù)的虛部(總是為0)
          *********************************************************************************************************
          */
          void dsp_asm_init()
          {
          u16 i=0;
          float fx;
          for(i=0;i {
          fx = 4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs);
          lBUFIN[i] = ((s16)fx)<<16;
          }
          }

          /*
          *********************************************************************************************************
          * Test FFT,calculate powermag
          * 進(jìn)行FFT變換,并計(jì)算各次諧波幅值
          *********************************************************************************************************
          */
          void dsp_asm_test()
          {
          // 根據(jù)預(yù)定義選擇合適的FFT函數(shù)
          #ifdef NPT_64
          cr4_fft_64_stm32(lBUFOUT, lBUFIN, NPT);
          #endif

          #ifdef NPT_256
          cr4_fft_256_stm32(lBUFOUT, lBUFIN, NPT);
          #endif

          #ifdef NPT_1024
          cr4_fft_1024_stm32(lBUFOUT, lBUFIN, NPT);
          #endif

          // 計(jì)算幅值
          dsp_asm_powerMag();

          // printf("No. Freq Powern");
          // for(i=0;i// {
          // printf("%4d,%4d,%10d,%10d,%10dn",i,(u16)((float)i*Fs/NPT),lBUFMAG[i],(lBUFOUT[i]>>16),(lBUFOUT[i]&0xffff));
          // }
          // printf("*********END**********rn");
          }
          /*
          *********************************************************************************************************
          * Calculate powermag
          * 計(jì)算各次諧波幅值
          * 先將lBUFOUT分解成實(shí)部(X)和虛部(Y),然后計(jì)算賦值(sqrt(X*X+Y*Y)
          *********************************************************************************************************
          */
          void dsp_asm_powerMag(void)
          {
          s16 lX,lY;
          u32 i;
          for(i=0;i {
          lX = (lBUFOUT[i] << 16) >> 16;
          lY = (lBUFOUT[i] >> 16);
          {
          float X = NPT * ((float)lX) /32768;
          float Y = NPT * ((float)lY) /32768;
          float Mag = sqrt(X*X + Y*Y)/NPT;
          lBUFMAG[i] = (u32)(Mag * 65536);
          }
          }
          }


          // 筆者使用的是金牛開(kāi)發(fā)板,CPU為STM32F107VC;JLink V8,MDK-ARM 4.10

          本文引用地址:http://www.ex-cimer.com/article/201611/315882.htm

          // 注意FFT運(yùn)算結(jié)果的對(duì)稱性,也即256點(diǎn)的運(yùn)算結(jié)果,只有前面128點(diǎn)的數(shù)據(jù)是有效可用的。
          // 64點(diǎn)FFT運(yùn)算結(jié)果圖(局部):

          上圖中,數(shù)組下標(biāo)X對(duì)應(yīng)的諧波頻率為:N×Fs/64=N×3200/64=N*50Hz.

          lBUFMAG[1] 對(duì)應(yīng) 50Hz諧波幅值

          上圖中由于FFT分辨率50HZ,最大只能識(shí)別1600Hz諧波,導(dǎo)致結(jié)果中出現(xiàn)錯(cuò)誤的數(shù)據(jù)。
          // 256點(diǎn)FFT運(yùn)算結(jié)果圖(局部):

          上圖中,數(shù)組下標(biāo)X對(duì)應(yīng)的諧波頻率為:N×Fs/256=N×6400/256=N*25Hz.

          lBUFMAG[2] 對(duì)應(yīng) 2×25 =50Hz諧波幅值

          lBUFMAG[100] 對(duì)應(yīng) 100×25=2500Hz諧波幅值

          lBUFMAG[102] 對(duì)應(yīng) 102×25=2550Hz諧波幅值


          // 1024點(diǎn)FFT運(yùn)算結(jié)果圖(局部):

          上圖中,數(shù)組下標(biāo)X對(duì)應(yīng)的諧波頻率為:N×Fs/1024=N×5120/1024=N*5Hz.

          lBUFMAG[10] 對(duì)應(yīng) 10×5 =50Hz諧波幅值

          lBUFMAG[500] 對(duì)應(yīng) 500×5=2500Hz諧波幅值

          lBUFMAG[510] 對(duì)應(yīng) 510×5=2550Hz諧波幅值

          該工程中模擬信號(hào)源為:4000 * sin(PI2*i*50.0/Fs) + 4000 * sin(PI2*i*2500.0/Fs) + 4000*sin(PI2*i*2550.0/Fs)

          信號(hào)為1個(gè)50Hz、1個(gè)2500Hz、1個(gè)2550Hz的正弦波混合信號(hào),幅值為均為4000。



          關(guān)鍵詞: STM32DSP庫(kù)FFT變

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();