Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
英飞凌Infineon
基于infineonPSOC62开发板的-信号处理前端 虚拟示波器-工具集
发布于 2023-07-14 10:10:57 浏览:995
订阅该版
[TOC] # 基于infineonPSOC62开发板的-信号处理前端 虚拟示波器-工具集 ## 一.前言 本项目基于英飞凌PSoC 6 RTT开发板实现了信号处理前端-一个信号处理的工具集。 包括虚拟示波器,音频采集分析,谐波分析,周期幅值相位分析,数字滤波,极值检测,可上位机可视化和命令行人机交互,可以方便继续扩展相关功能,继续丰富工具集。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/3d8b16935eb68e2b8f8097e1e2046b03.png.webp) 视频: https://www.bilibili.com/video/BV1PM4y147v1/ [视频](https://www.bilibili.com/video/BV1PM4y147v1/ "视频") 代码仓库: https://gitee.com/qinyunti/infineon-psoc62.git ## 二.移植DSP算法库 ### 2.1添加代码 git clone https://github.com/ARM-software/CMSIS_5.git CMSIS_5\CMSIS\DSP下是相关文件,Source下是源码 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/0605ade2339ffc17d29df78be51e2fb0.png.webp) 将DSP文件夹复制到自己的工程目录中,只保留 Include,PrivateInclude,Source三个文件夹 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/45efe9ed58c1f33ca25a19e47c9e58da.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/45efe9ed58c1f33ca25a19e47c9e58da.png.webp) Source下的每个子文件夹都是一类算法,里面的每个c都对应一个计算函数,并且有一个总文件包括其中所有的单个.c,比如BasicMathFunctions.c中 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/bb8d566e7c2e0e8340a5c5d7677659b7.png.webp) 删除这些总的.c,避免编译重复 删除以下文件和所有的非.c和.h文件 ``` BasicMathFunctions:BasicMathFunctions.c,BasicMathFunctionsF16.c BayesFunctions:BayesFunctions.c,BayesFunctionsF16.c CommonTables:CommonTables.c,CommonTablesF16.c ComplexMathFunctions:ComplexMathFunctions.c,ComplexMathFunctionsF16.c ControllerFunctions:ControllerFunctions.c DistanceFunctions:DistanceFunctions.c,DistanceFunctionsF16.c FastMathFunctions:FastMathFunctions.c,FastMathFunctionsF16.c FilteringFunctions:FilteringFunctions.c,FilteringFunctionsF16.c InterpolationFunctions:InterpolationFunctions.c,InterpolationFunctionsF16.c MatrixFunctions:MatrixFunctions.c,MatrixFunctionsF16.c QuaternionMathFunctions:QuaternionMathFunctions.c StatisticsFunctions:StatisticsFunctions.c,StatisticsFunctionsF16.c SupportFunctions:SupportFunctions.c,SupportFunctionsF16.c SVMFunctions:SVMFunctions.c,SVMFunctionsF16.c TransformFunctions:TransformFunctions.c,TransformFunctionsF16.c,arm_bitreversal2.S ``` ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/850aa918de0f6a77d3e413c755bab6e1.png.webp) 工程设置添加相关头文件包含路径 ### 2.2测试 复制`CMSIS_5\CMSIS\DSP\Examples\ARM\arm_fft_bin_example`下的`arm_fft_bin_data.c和arm_fft_bin_example_f32.c`到自己的工程目录 `arm_fft_bin_example_f32.c`下的 `int32_t main(void)改为int32_t ffttest_main(void)` 并添加`#define SEMIHOSTING`以使能`printf`打印,我们已经重定向实现了`printf`打印到串口。 由于 ` arm_cfft_f32(&varInstCfftF32, testInput_f32_10khz, ifftFlag, doBitReverse);`会修改`testInput_f32_10khz`的内容,所以添加一个缓存,以便能重复测试 ``` float32_t testtmp_f32_10khz[2048]; /* Process the data through the CFFT/CIFFT module */ memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); arm_cfft_f32(&varInstCfftF32, testtmp_f32_10khz, ifftFlag, doBitReverse); /* Process the data through the Complex Magnitude Module for calculating the magnitude at each bin */ arm_cmplx_mag_f32(testtmp_f32_10khz, testOutput, fftSize); ``` 在自己的main函数中申明并调用 ` int32_t ffttest_main(void);` ` ffttest_main();` 编译运行可以看到串口打印SUCCESS说明测试OK。 将输入输出数据打印 ``` printf("SUCCESS\n"); for(int i=0; i
#define TEST_LENGTH_SAMPLES 2048 extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; static uint32_t fftSize = 1024; static uint32_t ifftFlag = 0; static uint32_t doBitReverse = 1; static arm_cfft_instance_f32 varInstCfftF32; static int testIndex = 0; static float testtmp_f32_10khz[2048]; static int32_t adcbuffer[2048]; int32_t fft_main(void) { arm_status status; float32_t maxValue; status = ARM_MATH_SUCCESS; status=arm_cfft_init_f32(&varInstCfftF32,fftSize); //memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); adc_samp(adcbuffer,2048); for(int i=0; i<2048;i ++) { testtmp_f32_10khz[i] = (float)adcbuffer[i]; } arm_cfft_f32(&varInstCfftF32, testtmp_f32_10khz, ifftFlag, doBitReverse); arm_cmplx_mag_f32(testtmp_f32_10khz, testOutput, fftSize); /* Calculates maxValue and returns corresponding BIN value */ arm_max_f32(testOutput, fftSize, &maxValue, &testIndex); int32_t out = 0; for(int i=0; i
TEST_LENGTH_SAMPLES/2) { out = testOutput[i-TEST_LENGTH_SAMPLES/2]/1024; } else { out = testOutput[i]/1024; } printf("/*%ld,%ld*/\r\n", adcbuffer[i],out); } } /** \endlink */ ``` Fft.h ``` #ifndef FFT_H #define FFT_H int fft_main(void); #endif ``` 测试 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/27479d2486966c47c45d89a2a6e79af4.png.webp) ### 4.2 周期(频率),幅值,相位分析 #### 4.2.1 原理 FFT变换结果,幅值最大的横坐标对应信号频率,纵坐标对应幅度。幅值最大的为out[m]=val;则信号频率f0=(Fs/N)m ,信号幅值Vpp=val/(N/2)。N为FFT的点数,Fs为采样频率。相位Pha=atan2(a, b)弧度制,其中ab是输出虚数结果的实部和虚部。 #### 4.2.2添加命令行 `shell_fun.h`中 ``` void FrqFun(void* param); ``` `shell_fun.c`中 `include "frq.h"` `shell_cmd_list`中添加一行 ``` { (const uint8_t*)"frt", FrqFun, "frq"}, ``` 添加命令执行函数 ``` void FrqFun(void* param) { Frq_main(); } ``` #### 4.2.3实现代码 Frq.c ``` #include "arm_math.h" #include "arm_const_structs.h" #include
#define TEST_LENGTH_SAMPLES 2048 #define FS 10000 extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; static float32_t testOutput[TEST_LENGTH_SAMPLES/2]; static uint32_t fftSize = 1024; static uint32_t ifftFlag = 0; static uint32_t doBitReverse = 1; static arm_cfft_instance_f32 varInstCfftF32; static int testIndex = 0; static float testtmp_f32_10khz[2048]; static int32_t adcbuffer[2048]; int32_t frq_main(void) { arm_status status; float32_t maxValue; status = ARM_MATH_SUCCESS; status=arm_cfft_init_f32(&varInstCfftF32,fftSize); //memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); adc_samp(adcbuffer,2048); for(int i=0; i<2048;i ++) { testtmp_f32_10khz[i] = (float)adcbuffer[i]; } arm_cfft_f32(&varInstCfftF32, testtmp_f32_10khz, ifftFlag, doBitReverse); arm_cmplx_mag_f32(testtmp_f32_10khz, testOutput, fftSize); /* Calculates maxValue and returns corresponding BIN value */ arm_max_f32(testOutput, fftSize, &maxValue, &testIndex); float freq = (FS/TEST_LENGTH_SAMPLES)*testIndex; float vpp = maxValue/(TEST_LENGTH_SAMPLES/2); float pha = atan2(testOutput[2*testIndex],testOutput[2*testIndex+1]); printf("freq=%f,vpp=%f,pha=%f\r\n",freq,vpp,pha); } /** \endlink */ ``` Frq.h ``` #ifndef FRQ_H #define FRQ_H int frq_main(void); #endif ``` #### 4.2.4测试 输入frq开始测试印如下 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/b34d18d3a9e83928546cdbe8e87d8cc4.png.webp) 实时采集测试 此时采集的是音频背景声,噪声很小,所以频率为0 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/38de5ff4e40d8446f82ad16b6f542644.png.webp) ### 4.3数字滤波信号前端 #### 4.3.1原理 CMSIS-DSP提供直接I型IIR库支持Q7,Q15,Q31和浮点四种数据类型。其中Q15和Q31提供了快速版本。 直接I型IIR滤波器是基于二阶Biquad级联的方式来实现的。每个Biquad由一个二阶的滤波器组成: y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2] 直接I型算法每个阶段需要5个系数和4个状态变量。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/2e90efe1517603b6f409f84da85c840c.png.webp) y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2] matlab使用上面的公式实现,在使用fdatool工具箱生成的a系数需要取反才能用于直接I型IIR滤波器的函数中。 高阶IIR滤波器的实现是采用二阶Biquad级联的方式来实现的。其中参数numStages就是用来做指定二阶Biquad的个数。比如8阶IIR滤波器就可以采用numStages=4个二阶Biquad来实现。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20230714/fb4461232568d3c62ee68daa26e2fbf5.png.webp) 如果要实现9阶IIR滤波器就需要将numStages=5,这时就需要其中一个Biquad配置成一阶滤波器(也就是b2=0,a2=0)。 #### 4.3.2添加命令行 `shell_fun.h`中 `void IirFun(void* param);` `shell_fun.c`中 ``` include "iir.h" ``` `shell_cmd_list`中添加一行 ``` { (const uint8_t*)"iir", IirFun, “iir"}, ``` 添加命令执行函数 ``` void IirFun(void* param) { Iir_main(); } ``` #### 4.3.3实现代码 Iir.c ``` #include "arm_math.h" #include "arm_const_structs.h" #include
#define TEST_LENGTH_SAMPLES 2048 #define FS 10000 extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES]; static float32_t testOutput[TEST_LENGTH_SAMPLES]; static uint32_t fftSize = 1024; static uint32_t ifftFlag = 0; static uint32_t doBitReverse = 1; static arm_cfft_instance_f32 varInstCfftF32; static int testIndex = 0; static float testtmp_f32_10khz[2048]; static int32_t adcbuffer[2048]; #define numStages 2 /* 2阶IIR滤波的个数 */ #define BLOCK_SIZE 128 /* 调用一次arm_biquad_cascade_df1_f32处理的采样点个数 */ uint32_t blockSize = BLOCK_SIZE; uint32_t numBlocks = TEST_LENGTH_SAMPLES/BLOCK_SIZE; /* 需要调用arm_biquad_cascade_df1_f32的次数 */ static float32_t IIRStateF32[4*numStages]; /* 状态缓存 */ /* 巴特沃斯低通滤波器系数 80Hz*/ const float32_t IIRCoeffs32LP[5*numStages] = { 1.0f, 2.0f, 1.0f, 1.479798894397216679763573665695730596781f, -0.688676953053861784503908438637154176831f, 1.0f, 2.0f, 1.0f, 1.212812092620218384908525877108331769705f, -0.384004162286553540894828984164632856846f }; int32_t iir_main(void) { uint32_t i; arm_biquad_casd_df1_inst_f32 S; float32_t ScaleValue; float32_t *inputF32, *outputF32; /* 初始化输入输出缓存指针 */ //memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); #if 1 adc_samp(adcbuffer,2048); for(int i=0; i<2048;i ++) { testtmp_f32_10khz[i] = (float)adcbuffer[i]; } #endif inputF32 = testtmp_f32_10khz; outputF32 = testOutput; /* 初始化 */ arm_biquad_cascade_df1_init_f32(&S, numStages, (float32_t *)&IIRCoeffs32LP[0], (float32_t *)&IIRStateF32[0]); /* 实现IIR滤波,这里每次处理1个点 */ for(i=0; i < numBlocks; i++) { arm_biquad_cascade_df1_f32(&S, inputF32 + (i * blockSize), outputF32 + (i * blockSize), blockSize); } /*放缩系数 */ ScaleValue = 0.012f* 0.42f; /* 打印滤波后结果 */ for(i=0; i
data[i - k]) && (data[i] > data[i + k])) { row_sum -= 1; } } arr_rowsum[k-1] = row_sum; } int min_index = argmin(arr_rowsum,len/2+1); max_window_length = min_index; for(int k=1; k
data[i - k]) && (data[i] > data[i + k])) { p_data[i] += 1; } } } for(int k=0; k
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
qinyunti
这家伙很懒,什么也没写!
文章
30
回答
1
被采纳
0
关注TA
发私信
相关文章
1
RT-Thread支持英飞凌芯片吗?
2
RT-Thread系统在英飞凌TC364芯片上仅能在 Cpu 0 运行
3
请问版主RTT有没有移植到infineon的XC2000系列MCU上
4
关于RTT对于infineon 的Aurix系列的支持。
5
RT-AK使用,插件如何构建
6
PSOC6 BSP工程导入不成功
7
PSoCTM 62 初始化串口后进入休眠,功耗增加。
8
英飞凌PSoC 6 RTT开发板普通工程编译完ROM使用量就达到了1101KB
9
2023开发者大会动手实验环境搭建
10
英飞凌CYW43012 Wi-Fi 功能提示MAC地址获取错误
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
a1012112796
20
个答案
3
次被采纳
张世争
11
个答案
3
次被采纳
踩姑娘的小蘑菇
7
个答案
3
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部