![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
sa'da
Dependencies: mbed mbed-dsp drive
main.cpp
- Committer:
- NoFederation
- Date:
- 2020-05-31
- Revision:
- 0:662138e6d294
File content as of revision 0:662138e6d294:
#include "mbed.h" #include "arm_math.h" #include "arm_common_tables.h" #include "arm_const_structs.h" #include "math_helper.h" #include "SeeedGrayOLED.h" #include "logo.h" Serial pc(SERIAL_TX, SERIAL_RX); //串口 DigitalOut myled(LED1); //LED SeeedGrayOLED myOLED; //OLED屏幕 InterruptIn button(USER_BUTTON); //用户按键 #define TEST_LENGTH_SAMPLES 2048 static void arm_cfft_f32_app(uint32_t ifftFlag); static void arm_rfft_fast_f32_app(uint32_t ifftFlag); static float32_t testOutput[TEST_LENGTH_SAMPLES]; static float32_t testInput[TEST_LENGTH_SAMPLES]; static float32_t testInput_cfft[TEST_LENGTH_SAMPLES]; static float32_t testInput_rfft[TEST_LENGTH_SAMPLES]; /* ******************************************************************************** * 函 数 名: arm_cfft_f32_app * 功能说明: 调用函数arm_cfft_f32_app计算幅频 * 形 参: 无 * 返 回 值: 无 ******************************************************************************** */ static void arm_cfft_f32_app(uint32_t ifftFlag) { uint16_t i; uint32_t fftSize = 1024; uint32_t doBitReverse = 1; if(ifftFlag == 0) { /* 按照实部,虚部,实部,虚部.....的顺序存储数据 */ for(i = 0; i<TEST_LENGTH_SAMPLES/2; i++) { testInput_cfft[i*2+1] = 0; /* 50Hz正弦波,采样率1kHz */ testInput_cfft[i*2] = testInput[i]; } /* CFFT变换 */ arm_cfft_f32(&arm_cfft_sR_f32_len1024,testInput_cfft,ifftFlag,doBitReverse); /* 求解模值 */ arm_cmplx_mag_f32(testInput_cfft,testOutput,fftSize); /* 串口打印求解的模值 */ for(i = 0; i<TEST_LENGTH_SAMPLES/2; i++) { printf("%f\r\n",testOutput[i]); } } else if(ifftFlag == 1) { /* CFFT变换 */ arm_cfft_f32(&arm_cfft_sR_f32_len1024,testInput_cfft,ifftFlag,doBitReverse); /* 串口打印求解的模值 */ for(i = 0; i<TEST_LENGTH_SAMPLES/2; i++) { printf("%f\r\n",testInput_cfft[i*2]); } } } /* ********************************************************************* * 函数名:arm_rfft_fast_f32_app * 功能说明:调用函数arm_rfft_fast_f32_app计算幅频 * 形参:无 * 返回值:无 ********************************************************************* */ static void arm_rfft_fast_f32_app(uint32_t ifftFlag) { uint16_t i; arm_rfft_fast_instance_f32 S; uint32_t fftSize = 1024; arm_rfft_fast_init_f32(&S, fftSize); if(ifftFlag == 0) { arm_rfft_fast_f32(&S, testInput, testInput_rfft, ifftFlag); arm_cmplx_mag_f32(testInput_rfft, testOutput, fftSize); for(i=0; i<TEST_LENGTH_SAMPLES/2; i++) { printf("%f\r\n", testOutput[i]); } } else if(ifftFlag == 1) { arm_rfft_fast_f32(&S, testInput_rfft, testOutput, ifftFlag); for(i=0; i<TEST_LENGTH_SAMPLES/2; i++) { printf("%f\r\n", testOutput[i]); } } } /* ********************************************************************* * 函数名:DSP_Sine_Synthesis * 功能说明:调用函数arm_sin_f32,生成采样频率1000Hz的50Hz正弦波和200Hz正弦波 * 形参:f1-信号1频率,f2-信号2频率 * 返回值:无 ********************************************************************* */ static void DSP_Sine_Synthesis(int f1,int f2,int f3,int a1,int a2,int a3) { uint16_t i; for(i = 0; i < TEST_LENGTH_SAMPLES; i++) { testInput[i] = a1*arm_sin_f32(2*3.1415926f*f1*i/1000) + a2*arm_sin_f32(2*3.1415926f*f2*i/1000) + a3*arm_sin_f32(2*3.1415926f*f3*i/1000); } for(i = 0; i < TEST_LENGTH_SAMPLES; i++) { pc.printf("%f\r\n",testInput[i]); } } int main() { int f1,f2,f3,a1,a2,a3; char str1[10]; myOLED.init(SH1107G); logo:myOLED.clearDisplay(); while(1) { myOLED.drawzifu(1,0,str3_2,16*16/8); //F myOLED.drawzifu(2,0,str3_2,16*16/8); //F myOLED.drawzifu(3,0,str3_3,16*16/8); //T myOLED.drawzifu(4,0,str_bian,16*16/8); //变 myOLED.drawzifu(5,0,str_huan,16*16/8); //换 myOLED.drawzifu(6,0,str_shi1,16*16/8); //实 myOLED.drawzifu(7,0,str_yan1,16*16/8); //验 myOLED.drawzifu(2,2,str_deng,16*16/8); //等 myOLED.drawzifu(3,2,str_dai,16*16/8); //待 myOLED.drawzifu(4,2,str_she,16*16/8); //设 myOLED.drawzifu(5,2,str_zhi,16*16/8); //置 myOLED.drawzifu(2,3,str_xin,16*16/8); //信 myOLED.drawzifu(3,3,str_hao,16*16/8); //号 myOLED.drawzifu(4,3,str_can,16*16/8); //参 myOLED.drawzifu(5,3,str_shu2,16*16/8); //数 pc.scanf("%s",str1); if(strcmp(str1,"set_para") == 0) { pc.scanf("%d %d %d %d %d %d",&f1,&f2,&f3,&a1,&a2,&a3); //读取信号参数 myOLED.drawzifu(2,2,str_xin,16*16/8); //信 myOLED.drawzifu(3,2,str_hao,16*16/8); //号 myOLED.drawzifu(4,2,str_can,16*16/8); //参 myOLED.drawzifu(5,2,str_shu2,16*16/8); //数 myOLED.drawzifu(2,3,str_she,16*16/8); //设 myOLED.drawzifu(3,3,str_zhi,16*16/8); //置 myOLED.drawzifu(4,3,str_wan,16*16/8); //完 myOLED.drawzifu(5,3,str_cheng,16*16/8); //成 while(1) { pc.scanf("%s",str1); if(strcmp(str1,"send_data") == 0) { myOLED.drawzifu(2,2,str_zheng,16*16/8); //正 myOLED.drawzifu(3,2,str_zai,16*16/8); //在 myOLED.drawzifu(4,2,str_shang,16*16/8); //上 myOLED.drawzifu(5,2,str_chuan,16*16/8); //传 myOLED.drawzifu(2,3,str_yuan,16*16/8); //原 myOLED.drawzifu(3,3,str_shi2,16*16/8); //始 myOLED.drawzifu(4,3,str_xin,16*16/8); //信 myOLED.drawzifu(5,3,str_hao,16*16/8); //号 DSP_Sine_Synthesis(f1,f2,f3,a1,a2,a3); //上传原始数据 myOLED.drawzifu(2,2,str_xin,16*16/8); //信 myOLED.drawzifu(3,2,str_hao,16*16/8); //号 myOLED.drawzifu(4,2,str_shu2,16*16/8); //数 myOLED.drawzifu(5,2,str_ju,16*16/8); //据 myOLED.drawzifu(2,3,str_shang,16*16/8); //上 myOLED.drawzifu(3,3,str_chuan,16*16/8); //传 myOLED.drawzifu(4,3,str_wan,16*16/8); //完 myOLED.drawzifu(5,3,str_cheng,16*16/8); //成 while(1) { pc.scanf("%s",str1); if(strcmp(str1,"cfft_data") == 0) { myOLED.clearDisplay(); myOLED.drawzifu(2,1,str_bian,16*16/8); //变 myOLED.drawzifu(3,1,str_huan,16*16/8); //换 myOLED.drawzifu(4,1,str_lei,16*16/8); //类 myOLED.drawzifu(5,1,str_xing,16*16/8); //型 myOLED.drawzifu(2,2,str_fu,16*16/8); //复 myOLED.drawzifu(3,2,str_shu2,16*16/8); //数 myOLED.drawzifu(4,2,str3_2,16*16/8); //F myOLED.drawzifu(5,2,str3_2,16*16/8); //F myOLED.drawzifu(6,2,str3_3,16*16/8); //T myOLED.drawzifu(2,4,str_zheng,16*16/8); //正 myOLED.drawzifu(3,4,str_zai,16*16/8); //在 myOLED.drawzifu(4,4,str_shang,16*16/8); //上 myOLED.drawzifu(5,4,str_chuan,16*16/8); //传 myOLED.drawzifu(2,5,str_shi1,16*16/8); //实 myOLED.drawzifu(3,5,str_yan1,16*16/8); //验 myOLED.drawzifu(4,5,str_shu2,16*16/8); //数 myOLED.drawzifu(5,5,str_ju,16*16/8); //据 arm_cfft_f32_app(0); myOLED.drawzifu(2,4,str_shi1,16*16/8); //实 myOLED.drawzifu(3,4,str_yan1,16*16/8); //验 myOLED.drawzifu(4,4,str_shu2,16*16/8); //数 myOLED.drawzifu(5,4,str_ju,16*16/8); //据 myOLED.drawzifu(2,5,str_shang,16*16/8); //上 myOLED.drawzifu(3,5,str_chuan,16*16/8); //传 myOLED.drawzifu(4,5,str_wan,16*16/8); //完 myOLED.drawzifu(5,5,str_cheng,16*16/8); //成 while(1) { pc.scanf("%s",str1); if(strcmp(str1,"cifft_data") == 0) { myOLED.clearDisplay(); myOLED.drawzifu(2,1,str_bian,16*16/8); //变 myOLED.drawzifu(3,1,str_huan,16*16/8); //换 myOLED.drawzifu(4,1,str_lei,16*16/8); //类 myOLED.drawzifu(5,1,str_xing,16*16/8); //型 myOLED.drawzifu(1,2,str_fu,16*16/8); //复 myOLED.drawzifu(2,2,str_shu2,16*16/8); //数 myOLED.drawzifu(3,2,str_i,16*16/8); //I myOLED.drawzifu(4,2,str3_2,16*16/8); //F myOLED.drawzifu(5,2,str3_2,16*16/8); //F myOLED.drawzifu(6,2,str3_3,16*16/8); //T myOLED.drawzifu(2,4,str_zheng,16*16/8); //正 myOLED.drawzifu(3,4,str_zai,16*16/8); //在 myOLED.drawzifu(4,4,str_shang,16*16/8); //上 myOLED.drawzifu(5,4,str_chuan,16*16/8); //传 myOLED.drawzifu(2,5,str_shi1,16*16/8); //实 myOLED.drawzifu(3,5,str_yan1,16*16/8); //验 myOLED.drawzifu(4,5,str_shu2,16*16/8); //数 myOLED.drawzifu(5,5,str_ju,16*16/8); //据 arm_cfft_f32_app(1); myOLED.drawzifu(2,4,str_shi1,16*16/8); //实 myOLED.drawzifu(3,4,str_yan1,16*16/8); //验 myOLED.drawzifu(4,4,str_shu2,16*16/8); //数 myOLED.drawzifu(5,4,str_ju,16*16/8); //据 myOLED.drawzifu(2,5,str_shang,16*16/8); //上 myOLED.drawzifu(3,5,str_chuan,16*16/8); //传 myOLED.drawzifu(4,5,str_wan,16*16/8); //完 myOLED.drawzifu(5,5,str_cheng,16*16/8); //成 wait(5); goto logo; } } } else if(strcmp(str1,"rfft_data") == 0) { myOLED.clearDisplay(); myOLED.drawzifu(2,1,str_bian,16*16/8); //变 myOLED.drawzifu(3,1,str_huan,16*16/8); //换 myOLED.drawzifu(4,1,str_lei,16*16/8); //类 myOLED.drawzifu(5,1,str_xing,16*16/8); //型 myOLED.drawzifu(2,2,str_shi1,16*16/8); //实 myOLED.drawzifu(3,2,str_shu2,16*16/8); //数 myOLED.drawzifu(4,2,str3_2,16*16/8); //F myOLED.drawzifu(5,2,str3_2,16*16/8); //F myOLED.drawzifu(6,2,str3_3,16*16/8); //T myOLED.drawzifu(2,4,str_zheng,16*16/8); //正 myOLED.drawzifu(3,4,str_zai,16*16/8); //在 myOLED.drawzifu(4,4,str_shang,16*16/8); //上 myOLED.drawzifu(5,4,str_chuan,16*16/8); //传 myOLED.drawzifu(2,5,str_shi1,16*16/8); //实 myOLED.drawzifu(3,5,str_yan1,16*16/8); //验 myOLED.drawzifu(4,5,str_shu2,16*16/8); //数 myOLED.drawzifu(5,5,str_ju,16*16/8); //据 arm_rfft_fast_f32_app(0); myOLED.drawzifu(2,4,str_shi1,16*16/8); //实 myOLED.drawzifu(3,4,str_yan1,16*16/8); //验 myOLED.drawzifu(4,4,str_shu2,16*16/8); //数 myOLED.drawzifu(5,4,str_ju,16*16/8); //据 myOLED.drawzifu(2,5,str_shang,16*16/8); //上 myOLED.drawzifu(3,5,str_chuan,16*16/8); //传 myOLED.drawzifu(4,5,str_wan,16*16/8); //完 myOLED.drawzifu(5,5,str_cheng,16*16/8); //成 while(1) { pc.scanf("%s",str1); if(strcmp(str1,"rifft_data") == 0) { myOLED.clearDisplay(); myOLED.drawzifu(2,1,str_bian,16*16/8); //变 myOLED.drawzifu(3,1,str_huan,16*16/8); //换 myOLED.drawzifu(4,1,str_lei,16*16/8); //类 myOLED.drawzifu(5,1,str_xing,16*16/8); //型 myOLED.drawzifu(1,2,str_shi1,16*16/8); //实 myOLED.drawzifu(2,2,str_shu2,16*16/8); //数 myOLED.drawzifu(3,2,str_i,16*16/8); //I myOLED.drawzifu(4,2,str3_2,16*16/8); //F myOLED.drawzifu(5,2,str3_2,16*16/8); //F myOLED.drawzifu(6,2,str3_3,16*16/8); //T myOLED.drawzifu(2,4,str_zheng,16*16/8); //正 myOLED.drawzifu(3,4,str_zai,16*16/8); //在 myOLED.drawzifu(4,4,str_shang,16*16/8); //上 myOLED.drawzifu(5,4,str_chuan,16*16/8); //传 myOLED.drawzifu(2,5,str_shi1,16*16/8); //实 myOLED.drawzifu(3,5,str_yan1,16*16/8); //验 myOLED.drawzifu(4,5,str_shu2,16*16/8); //数 myOLED.drawzifu(5,5,str_ju,16*16/8); //据 arm_rfft_fast_f32_app(1); myOLED.drawzifu(2,4,str_shi1,16*16/8); //实 myOLED.drawzifu(3,4,str_yan1,16*16/8); //验 myOLED.drawzifu(4,4,str_shu2,16*16/8); //数 myOLED.drawzifu(5,4,str_ju,16*16/8); //据 myOLED.drawzifu(2,5,str_shang,16*16/8); //上 myOLED.drawzifu(3,5,str_chuan,16*16/8); //传 myOLED.drawzifu(4,5,str_wan,16*16/8); //完 myOLED.drawzifu(5,5,str_cheng,16*16/8); //成 wait(5); goto logo; } } } } } } } } }