chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于infineonPSOC62開發(fā)板的-信號處理前端 虛擬示波器-工具集

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來源:未知 ? 2023-10-11 18:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言


本項(xiàng)目基于英飛凌PSoC 6 RTT開發(fā)板實(shí)現(xiàn)了信號處理前端-一個(gè)信號處理的工具集。

包括虛擬示波器,音頻采集分析,諧波分析,周期幅值相位分析,數(shù)字濾波,極值檢測,可上位機(jī)可視化和命令行人機(jī)交互,可以方便繼續(xù)擴(kuò)展相關(guān)功能,繼續(xù)豐富工具集。

wKgZomUt2qqANAVDAAEqzFtWVfM414.png

視頻: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_5CMSISDSP下是相關(guān)文件,Source下是源碼

wKgZomUt2qqAI9LLAADrIrG0gII433.png

將DSP文件夾復(fù)制到自己的工程目錄中,只保留

Include,PrivateInclude,Source三個(gè)文件夾

wKgZomUt2qqAQY5VAABscxwByu8359.pngwKgZomUt2qqAbte-AABsDha8WV4274.png

Source下的每個(gè)子文件夾都是一類算法,里面的每個(gè)c都對應(yīng)一個(gè)計(jì)算函數(shù),并且有一個(gè)總文件包括其中所有的單個(gè).c,比如BasicMathFunctions.c中

wKgZomUt2quAbHcKAAF5499h9Fw883.png

刪除這些總的.c,避免編譯重復(fù)

刪除以下文件和所有的非.c和.h文件


		

1BasicMathFunctions:BasicMathFunctions.c,BasicMathFunctionsF16.c 2BayesFunctions:BayesFunctions.c,BayesFunctionsF16.c 3CommonTables:CommonTables.c,CommonTablesF16.c 4ComplexMathFunctions:ComplexMathFunctions.c,ComplexMathFunctionsF16.c 5ControllerFunctions:ControllerFunctions.c 6DistanceFunctions:DistanceFunctions.c,DistanceFunctionsF16.c 7FastMathFunctions:FastMathFunctions.c,FastMathFunctionsF16.c 8FilteringFunctions:FilteringFunctions.c,FilteringFunctionsF16.c 9InterpolationFunctions:InterpolationFunctions.c,InterpolationFunctionsF16.c 10MatrixFunctions:MatrixFunctions.c,MatrixFunctionsF16.c 11QuaternionMathFunctions:QuaternionMathFunctions.c 12StatisticsFunctions:StatisticsFunctions.c,StatisticsFunctionsF16.c 13SupportFunctions:SupportFunctions.c,SupportFunctionsF16.c 14SVMFunctions:SVMFunctions.c,SVMFunctionsF16.c 15TransformFunctions:TransformFunctions.c,TransformFunctionsF16.c,arm_bitreversal2.S


		

wKgZomUt2quAO_M6AAIl-PTKjVM320.png

工程設(shè)置添加相關(guān)頭文件包含路徑

2.2測試

復(fù)制CMSIS_5CMSISDSPExamplesARMarm_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打印,我們已經(jīng)重定向?qū)崿F(xiàn)了printf打印到串口。

由于 arm_cfft_f32(&varInstCfftF32, testInput_f32_10khz, ifftFlag, doBitReverse);會(huì)修改testInput_f32_10khz的內(nèi)容,所以添加一個(gè)緩存,以便能重復(fù)測試


			

1float32_ttesttmp_f32_10khz[2048]; 2/*ProcessthedatathroughtheCFFT/CIFFTmodule*/ 3memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); 4arm_cfft_f32(&varInstCfftF32,testtmp_f32_10khz,ifftFlag,doBitReverse); 5/*ProcessthedatathroughtheComplexMagnitudeModulefor 6calculatingthemagnitudeateachbin*/ 7arm_cmplx_mag_f32(testtmp_f32_10khz,testOutput,fftSize);

在自己的main函數(shù)中申明并調(diào)用

int32_t ffttest_main(void)

ffttest_main()

編譯運(yùn)行可以看到串口打印SUCCESS說明測試OK。

將輸入輸出數(shù)據(jù)打印


			

1printf("SUCCESS "); 2for(inti=0;i 3{ 4if(i2) 5{ 6printf("/*%f,%f*/ ",testInput_f32_10khz[i],testOutput[i]); 7} 8else 9{ 10printf("/*%f,%f*/ ",testInput_f32_10khz[i],0.0); 11} 12}

使用serialstudio可視化顯示,可以看到計(jì)算結(jié)果FFT頻率明顯的峰值

wKgZomUt2quAYaGdAAJwW6fancA932.png

三、音頻采集


3.1原理圖

從原理圖看到有6路模擬輸入,分別對應(yīng)

P10.0~P10.5, VREF為模擬參考電壓。

wKgZomUt2quANX5HAAFJr7GsAmM777.png

wKgZomUt2quABh9MAANJysolPLo323.png

使用的是MAX4466的MIC,接到ADC0,如下圖所示

wKgZomUt2qyANhDlAAXNXx882vI665.png

wKgZomUt2qyALrBBAANE_SBjPwE946.png


		

3.2配置模擬采集引腳

wKgZomUt2qyAPUbOAAIv02LauXg829.png

3.3代碼

Adc.c


			

1#include"cy_pdl.h" 2#include"cyhal.h" 3#include"cybsp.h" 4#include"cy_retarget_io.h" 5#defineVPLUS_CHANNEL_0(P10_0) 6/*Conversionfactor*/ 7#defineMICRO_TO_MILLI_CONV_RATIO(1000u) 8/*Acquistiontimeinnanosecond*/ 9#defineACQUISITION_TIME_NS(116680u) 10/*ADCScandelayinmillisecond*/ 11#defineADC_SCAN_DELAY_MS(200u) 12/******************************************************************************* 13*EnumeratedTypes 14*******************************************************************************/ 15/*ADCChannelconstants*/ 16enumADC_CHANNELS 17{ 18CHANNEL_0=0, 19NUM_CHANNELS 20}adc_channel; 21/******************************************************************************* 22*GlobalVariables 23*******************************************************************************/ 24/*ADCObject*/ 25cyhal_adc_tadc_obj; 26/*ADCChannel0Object*/ 27cyhal_adc_channel_tadc_chan_0_obj; 28/*DefaultADCconfiguration*/ 29constcyhal_adc_config_tadc_config={ 30.continuous_scanning=false,//ContinuousScanningisdisabled 31.average_count=1,//Averagecountdisabled 32.vref=CYHAL_ADC_REF_VDDA,//VREFforSingleendedchannelsettoVDDA 33.vneg=CYHAL_ADC_VNEG_VSSA,//VNEGforSingleendedchannelsettoVSSA 34.resolution=12u,//12-bitresolution 35.ext_vref=NC,//Noconnection 36.bypass_pin=NC};//Noconnection 37/*Asynchronousreadcompleteflag,usedinEventHandler*/ 38staticboolasync_read_complete=true; 39#defineNUM_SCAN(1000) 40#defineNUM_CHANNELS(1) 41/*Variabletostoreresultsfrommultiplechannelsduringasynchronousread*/ 42int32_tresult_arr[NUM_CHANNELS*NUM_SCAN]={0}; 43staticvoidadc_event_handler(void*arg,cyhal_adc_event_tevent) 44{ 45if(0u!=(event&CYHAL_ADC_ASYNC_READ_COMPLETE)) 46{ 47/*Setasyncreadcompleteflagtotrue*/ 48async_read_complete=true; 49} 50} 51intadc_init(void) 52{ 53/*Variabletocapturereturnvalueoffunctions*/ 54cy_rslt_tresult; 55/*InitializeADC.TheADCblockwhichcanconnecttothechannel0inputpinisselected*/ 56result=cyhal_adc_init(&adc_obj,VPLUS_CHANNEL_0,NULL); 57if(result!=CY_RSLT_SUCCESS) 58{ 59printf("ADCinitializationfailed.Error:%ld ",(longunsignedint)result); 60CY_ASSERT(0); 61} 62/*ADCchannelconfiguration*/ 63constcyhal_adc_channel_config_tchannel_config={ 64.enable_averaging=false,//Disableaveragingforchannel 65.min_acquisition_ns=ACQUISITION_TIME_NS,//Minimumacquisitiontimesetto1us 66.enabled=true};//SamplethischannelwhenADCperformsascan 67/*Initializeachannel0andconfigureittoscanthechannel0inputpininsingleendedmode.*/ 68result=cyhal_adc_channel_init_diff(&adc_chan_0_obj,&adc_obj,VPLUS_CHANNEL_0, 69CYHAL_ADC_VNEG,&channel_config); 70if(result!=CY_RSLT_SUCCESS) 71{ 72printf("ADCfirstchannelinitializationfailed.Error:%ld ",(longunsignedint)result); 73CY_ASSERT(0); 74} 75/*Registeracallbacktohandleasynchronousreadcompletion*/ 76cyhal_adc_register_callback(&adc_obj,&adc_event_handler,result_arr); 77/*Subscribetotheasyncreadcompleteeventtoprocesstheresults*/ 78cyhal_adc_enable_event(&adc_obj,CYHAL_ADC_ASYNC_READ_COMPLETE,CYHAL_ISR_PRIORITY_DEFAULT,true); 79printf("ADCisconfiguredinmultichannelconfiguration. "); 80printf("Channel0isconfiguredinsingleendedmode,connectedtothe "); 81printf("channel0inputpin.Provideinputvoltageatthechannel0inputpin "); 82return0; 83} 84intadc_samp(void) 85{ 86/*Variabletocapturereturnvalueoffunctions*/ 87cy_rslt_tresult; 88/*VariabletostoreADCconversionresultfromchannel0*/ 89int32_tadc_result_0=0; 90/*Clearasyncreadcompleteflag*/ 91async_read_complete=false; 92/*Initiateanasynchronousreadoperation.Theeventhandlerwillbecalled 93*whenitiscomplete.*/ 94memset(result_arr,0,sizeof(result_arr)); 95cyhal_gpio_write_internal(CYBSP_USER_LED,true); 96result=cyhal_adc_read_async_uv(&adc_obj,NUM_SCAN,result_arr); 97if(result!=CY_RSLT_SUCCESS) 98{ 99printf("ADCasyncreadfailed.Error:%ld ",(longunsignedint)result); 100CY_ASSERT(0); 101} 102while(async_read_complete==false); 103cyhal_gpio_write_internal(CYBSP_USER_LED,false); 104/* 105*Readdatafromresultlist,inputvoltageintheresultlistisin 106*microvolts.Convertitmillivoltsandprintinputvoltage 107* 108*/ 109for(inti=0;i110{ 111adc_result_0=result_arr[i]/MICRO_TO_MILLI_CONV_RATIO; 112printf("/*%4ld*/ ",(longint)adc_result_0); 113} 114return0; 115}

Adc.h


			

1#ifndefADC_H 2#defineADC_H 3intadc_init(void); 4intadc_samp(void); 5#endif

Main.c調(diào)用

adc_init();

adc_samp();

3.4時(shí)鐘

時(shí)鐘源是100Mhz,12分頻=8.33M,滿足1.8MHz~18MHz之間的要求

默認(rèn)是按照8M配置

wKgZomUt2qyAam4EAAIgBrBQPbk231.png

wKgZomUt2qyAXsRjAAH-QToczyI645.png

3.5采樣時(shí)間

采樣前后翻轉(zhuǎn)LED用示波器測量時(shí)間


			

1intadc_samp(void) 2{ 3/*Variabletocapturereturnvalueoffunctions*/ 4cy_rslt_tresult; 5/*VariabletostoreADCconversionresultfromchannel0*/ 6int32_tadc_result_0=0; 7/*Clearasyncreadcompleteflag*/ 8async_read_complete=false; 9/*Initiateanasynchronousreadoperation.Theeventhandlerwillbecalled 10*whenitiscomplete.*/ 11memset(result_arr,0,sizeof(result_arr)); 12cyhal_gpio_write_internal(CYBSP_USER_LED,true); 13result=cyhal_adc_read_async_uv(&adc_obj,NUM_SCAN,result_arr); 14if(result!=CY_RSLT_SUCCESS) 15{ 16printf("ADCasyncreadfailed.Error:%ld ",(longunsignedint)result); 17CY_ASSERT(0); 18} 19while(async_read_complete==false); 20cyhal_gpio_write_internal(CYBSP_USER_LED,false); 21/* 22*Readdatafromresultlist,inputvoltageintheresultlistisin 23*microvolts.Convertitmillivoltsandprintinputvoltage 24* 25*/ 26for(inti=0;i27{ 28adc_result_0=result_arr[i]/MICRO_TO_MILLI_CONV_RATIO; 29printf("/*%4ld*/ ",(longint)adc_result_0); 30} 31return0; 32}

采樣1000次,分別設(shè)置采樣時(shí)間為2uS和1uS對比。

#define ACQUISITION_TIME_NS (2000u)

10.28mS

wKgZomUt2q2AXCqeAAOo21kjK3M789.png

#define ACQUISITION_TIME_NS (1000u)

9.32mS

wKgZomUt2q2AGWKPAAOfvkv-IWo683.png

10.28-9.32=0.96mS 1000次約1mS,1次剛好是1uS。

而1000次除去采樣時(shí)間其他時(shí)間為8.32mS,即一次8.32uS。

因?yàn)榍懊嬖O(shè)置了時(shí)鐘為8.33MHz, 從前面時(shí)序一節(jié)可以看到,除去采樣時(shí)間,其他轉(zhuǎn)換時(shí)間等需要14個(gè)CLK,所以需要14/8.33uS=1.7uS. 剩余的8.32-1.7為數(shù)據(jù)搬運(yùn),軟件處理等時(shí)間。

3.6 采樣值正確性

1.545V和示波器采集為1.54V差不多是正確的,這里沒有高精度萬用表就不對測試精度了,只測試了正確性。

wKgZomUt2q2Aem6MAAHPY_Qtpsk969.png

wKgZomUt2q2AAVn6AANOUdltiws298.png

3.7音頻采集

一次采集1000次然后串口打印,使用SerialStudio可視化顯示


			

1intadc_samp(void) 2{ 3/*Variabletocapturereturnvalueoffunctions*/ 4cy_rslt_tresult; 5/*VariabletostoreADCconversionresultfromchannel0*/ 6int32_tadc_result_0=0; 7/*Clearasyncreadcompleteflag*/ 8async_read_complete=false; 9/*Initiateanasynchronousreadoperation.Theeventhandlerwillbecalled 10*whenitiscomplete.*/ 11memset(result_arr,0,sizeof(result_arr)); 12cyhal_gpio_write_internal(CYBSP_USER_LED,true); 13result=cyhal_adc_read_async_uv(&adc_obj,NUM_SCAN,result_arr); 14if(result!=CY_RSLT_SUCCESS) 15{ 16printf("ADCasyncreadfailed.Error:%ld ",(longunsignedint)result); 17CY_ASSERT(0); 18} 19while(async_read_complete==false); 20cyhal_gpio_write_internal(CYBSP_USER_LED,false); 21/* 22*Readdatafromresultlist,inputvoltageintheresultlistisin 23*microvolts.Convertitmillivoltsandprintinputvoltage 24* 25*/ 26for(inti=0;i27{ 28adc_result_0=result_arr[i]/MICRO_TO_MILLI_CONV_RATIO; 29printf("/*%4ld*/ ",(longint)adc_result_0); 30} 31return0; 32}

四、信號處理前端


4.1 電能質(zhì)量,諧波分析

4.1.1添加命令行

在電能檢測應(yīng)用中,電能質(zhì)量一項(xiàng)分析即諧波分析,諧波分量大,說明電能質(zhì)量不好,

基于本板信號處理前端也實(shí)現(xiàn)了該功能。

shell_fun.h


			

1voidFftFun(void*param);

shell_fun.c


			

1include"fft.h"

shell_cmd_list中添加一行


			

1{(constuint8_t*)"fft",FftFun,"fft"},/*打印幫助信息*/

添加命令執(zhí)行函數(shù)


			

1voidFftFun(void*param) 2{ 3fft_main(); 4}

4.1.2添加實(shí)現(xiàn)

Fft.c


			

1#include"arm_math.h" 2#include"arm_const_structs.h" 3#include 4#defineTEST_LENGTH_SAMPLES2048 5externfloat32_ttestInput_f32_10khz[TEST_LENGTH_SAMPLES]; 6staticfloat32_ttestOutput[TEST_LENGTH_SAMPLES/2]; 7staticuint32_tfftSize=1024; 8staticuint32_tifftFlag=0; 9staticuint32_tdoBitReverse=1; 10staticarm_cfft_instance_f32varInstCfftF32; 11staticinttestIndex=0; 12staticfloattesttmp_f32_10khz[2048]; 13staticint32_tadcbuffer[2048]; 14int32_tfft_main(void) 15{ 16arm_statusstatus; 17float32_tmaxValue; 18status=ARM_MATH_SUCCESS; 19status=arm_cfft_init_f32(&varInstCfftF32,fftSize); 20//memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); 21adc_samp(adcbuffer,2048); 22for(inti=0;i<2048;i++) 23{ 24testtmp_f32_10khz[i]=(float)adcbuffer[i]; 25} 26arm_cfft_f32(&varInstCfftF32,testtmp_f32_10khz,ifftFlag,doBitReverse); 27arm_cmplx_mag_f32(testtmp_f32_10khz,testOutput,fftSize); 28/*CalculatesmaxValueandreturnscorrespondingBINvalue*/ 29arm_max_f32(testOutput,fftSize,&maxValue,&testIndex); 30int32_tout=0; 31for(inti=0;i32{ 33if(i>TEST_LENGTH_SAMPLES/2) 34{ 35out=testOutput[i-TEST_LENGTH_SAMPLES/2]/1024; 36} 37else 38{ 39out=testOutput[i]/1024; 40} 41printf("/*%ld,%ld*/ ",adcbuffer[i],out); 42} 43} 44/**endlink*/

Fft.h


			

1#ifndefFFT_H 2#defineFFT_H 3intfft_main(void); 4#endif

測試

wKgZomUt2q2AN5sgAADTvVziW8A653.png

4.2 周期(頻率),幅值,相位分析

4.2.1 原理

FFT變換結(jié)果,幅值最大的橫坐標(biāo)對應(yīng)信號頻率,縱坐標(biāo)對應(yīng)幅度。幅值最大的為out[m]=val;則信號頻率f0=(Fs/N)m ,信號幅值Vpp=val/(N/2)。N為FFT的點(diǎn)數(shù),F(xiàn)s為采樣頻率。相位Pha=atan2(a, b)弧度制,其中ab是輸出虛數(shù)結(jié)果的實(shí)部和虛部。

4.2.2添加命令行

shell_fun.h


			

1voidFrqFun(void*param);

shell_fun.c

include "frq.h"

shell_cmd_list中添加一行


			

1{(constuint8_t*)"frt",FrqFun,"frq"},

添加命令執(zhí)行函數(shù)


			

1voidFrqFun(void*param) 2{ 3Frq_main(); 4}

4.2.3實(shí)現(xiàn)代碼

Frq.c


			

1#include"arm_math.h" 2#include"arm_const_structs.h" 3#include 4#defineTEST_LENGTH_SAMPLES2048 5#defineFS10000 6externfloat32_ttestInput_f32_10khz[TEST_LENGTH_SAMPLES]; 7staticfloat32_ttestOutput[TEST_LENGTH_SAMPLES/2]; 8staticuint32_tfftSize=1024; 9staticuint32_tifftFlag=0; 10staticuint32_tdoBitReverse=1; 11staticarm_cfft_instance_f32varInstCfftF32; 12staticinttestIndex=0; 13staticfloattesttmp_f32_10khz[2048]; 14staticint32_tadcbuffer[2048]; 15int32_tfrq_main(void) 16{ 17arm_statusstatus; 18float32_tmaxValue; 19status=ARM_MATH_SUCCESS; 20status=arm_cfft_init_f32(&varInstCfftF32,fftSize); 21//memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); 22adc_samp(adcbuffer,2048); 23for(inti=0;i<2048;i++) 24{ 25testtmp_f32_10khz[i]=(float)adcbuffer[i]; 26} 27arm_cfft_f32(&varInstCfftF32,testtmp_f32_10khz,ifftFlag,doBitReverse); 28arm_cmplx_mag_f32(testtmp_f32_10khz,testOutput,fftSize); 29/*CalculatesmaxValueandreturnscorrespondingBINvalue*/ 30arm_max_f32(testOutput,fftSize,&maxValue,&testIndex); 31floatfreq=(FS/TEST_LENGTH_SAMPLES)*testIndex; 32floatvpp=maxValue/(TEST_LENGTH_SAMPLES/2); 33floatpha=atan2(testOutput[2*testIndex],testOutput[2*testIndex+1]); 34printf("freq=%f,vpp=%f,pha=%f ",freq,vpp,pha); 35} 36/**endlink*/

Frq.h


			

1#ifndefFRQ_H 2#defineFRQ_H 3intfrq_main(void); 4#endif

4.2.4測試

輸入frq開始測試印如下

wKgZomUt2q6AH1wDAAGub2QI3Y4534.png

實(shí)時(shí)采集測試

此時(shí)采集的是音頻背景聲,噪聲很小,所以頻率為0

wKgZomUt2q6AFsBLAAK8FKV37vk422.png

4.3數(shù)字濾波信號前端

4.3.1原理

CMSIS-DSP提供直接I型IIR庫支持Q7,Q15,Q31和浮點(diǎn)四種數(shù)據(jù)類型。其中Q15和Q31提供了快速版本。

直接I型IIR濾波器是基于二階Biquad級聯(lián)的方式來實(shí)現(xiàn)的。每個(gè)Biquad由一個(gè)二階的濾波器組成:

y[n] = b0 x[n] + b1 x[n-1] + b2 x[n-2] + a1 y[n-1] + a2 * y[n-2]

直接I型算法每個(gè)階段需要5個(gè)系數(shù)和4個(gè)狀態(tài)變量。

wKgZomUt2q6AM3PCAAD-eOvWUQ0445.png

matlab使用上面的公式實(shí)現(xiàn),在使用fdatool工具箱生成的a系數(shù)需要取反才能用于直接I型IIR濾波器的函數(shù)中。

高階IIR濾波器的實(shí)現(xiàn)是采用二階Biquad級聯(lián)的方式來實(shí)現(xiàn)的。其中參數(shù)numStages就是用來做指定二階Biquad的個(gè)數(shù)。比如8階IIR濾波器就可以采用numStages=4個(gè)二階Biquad來實(shí)現(xiàn)。

wKgZomUt2q6ATa4qAABT1mUq6iM062.png

如果要實(shí)現(xiàn)9階IIR濾波器就需要將numStages=5,這時(shí)就需要其中一個(gè)Biquad配置成一階濾波器(也就是b2=0,a2=0)。

4.3.2添加命令行

shell_fun.h

void IirFun(void* param);

shell_fun.c


			

1include"iir.h"

shell_cmd_list中添加一行


			

1{(constuint8_t*)"iir",IirFun,“iir"},

添加命令執(zhí)行函數(shù)


			

1voidIirFun(void*param) 2{ 3Iir_main(); 4}

4.3.3實(shí)現(xiàn)代碼

Iir.c


			

1#include"arm_math.h" 2#include"arm_const_structs.h" 3#include 4#defineTEST_LENGTH_SAMPLES2048 5#defineFS10000 6externfloat32_ttestInput_f32_10khz[TEST_LENGTH_SAMPLES]; 7staticfloat32_ttestOutput[TEST_LENGTH_SAMPLES]; 8staticuint32_tfftSize=1024; 9staticuint32_tifftFlag=0; 10staticuint32_tdoBitReverse=1; 11staticarm_cfft_instance_f32varInstCfftF32; 12staticinttestIndex=0; 13staticfloattesttmp_f32_10khz[2048]; 14staticint32_tadcbuffer[2048]; 15#definenumStages2/*2階IIR濾波的個(gè)數(shù)*/ 16#defineBLOCK_SIZE128/*調(diào)用一次arm_biquad_cascade_df1_f32處理的采樣點(diǎn)個(gè)數(shù)*/ 17uint32_tblockSize=BLOCK_SIZE; 18uint32_tnumBlocks=TEST_LENGTH_SAMPLES/BLOCK_SIZE;/*需要調(diào)用arm_biquad_cascade_df1_f32的次數(shù)*/ 19staticfloat32_tIIRStateF32[4*numStages];/*狀態(tài)緩存*/ 20/*巴特沃斯低通濾波器系數(shù)80Hz*/ 21constfloat32_tIIRCoeffs32LP[5*numStages]={ 221.0f,2.0f,1.0f,1.479798894397216679763573665695730596781f, 23-0.688676953053861784503908438637154176831f, 241.0f,2.0f,1.0f,1.212812092620218384908525877108331769705f, 25-0.384004162286553540894828984164632856846f 26}; 27int32_tiir_main(void) 28{ 29uint32_ti; 30arm_biquad_casd_df1_inst_f32S; 31float32_tScaleValue; 32float32_t*inputF32,*outputF32; 33/*初始化輸入輸出緩存指針*/ 34//memcpy(testtmp_f32_10khz,testInput_f32_10khz,sizeof(testInput_f32_10khz)); 35#if1 36adc_samp(adcbuffer,2048); 37for(inti=0;i<2048;i++) 38{ 39testtmp_f32_10khz[i]=(float)adcbuffer[i]; 40} 41#endif 42inputF32=testtmp_f32_10khz; 43outputF32=testOutput; 44/*初始化*/ 45arm_biquad_cascade_df1_init_f32(&S,numStages,(float32_t*)&IIRCoeffs32LP[0], 46(float32_t*)&IIRStateF32[0]); 47/*實(shí)現(xiàn)IIR濾波,這里每次處理1個(gè)點(diǎn)*/ 48for(i=0;i49{ 50arm_biquad_cascade_df1_f32(&S,inputF32+(i*blockSize),outputF32+(i*blockSize), 51blockSize); 52} 53/*放縮系數(shù)*/ 54ScaleValue=0.012f*0.42f; 55/*打印濾波后結(jié)果*/ 56for(i=0;i57{ 58printf("/*%f,%f*/ ",testtmp_f32_10khz[i],testOutput[i]*ScaleValue); 59} 60} 61/**endlink*/

Iir.h


			

1#ifndefIIR_H 2#defineIIR_H 3intiir_main(void); 4#endif

4.3.4測試

輸入iir回車,查看波形

見視頻

以下可以看到濾波導(dǎo)致了滯后,黃色線有滯后

wKgZomUt2q6AZUffAABU0wp83P0878.jpg

wKgZomUt2q6ADlU-AAA7J-2D5i0757.jpg

以下是實(shí)時(shí)采集濾波

wKgZomUt2q6AX-oVAABCxtthyV8535.jpg

4.4 極大值檢測

在電力等行業(yè),分析電壓極值,是一項(xiàng)重要的參數(shù)分析,可以分析電壓的波動(dòng);示波器中也有自動(dòng)測量極值的功能更。本板作為信號處理前端也實(shí)現(xiàn)了該功能。

4.4.1 算法

算法來源于論文https://www.mdpi.com/1999-4893/5/4/588/htm

核心代碼如下


			

1voidampd(int32_t*data,int32_tlen) 2{ 3introw_sum; 4for(intk=1;k<len/2+1;k++) 5{ 6row_sum=0; 7for(inti=k;i<len-k;i++) 8{ 9if((data[i]>data[i-k])&&(data[i]>data[i+k])) 10{ 11row_sum-=1; 12} 13} 14arr_rowsum[k-1]=row_sum; 15} 16intmin_index=argmin(arr_rowsum,len/2+1); 17max_window_length=min_index; 18for(intk=1;k1;k++) 19{ 20for(inti=k;i<len-k;i++) 21{ 22if((data[i]>data[i-k])&&(data[i]>data[i+k])) 23{ 24p_data[i]+=1; 25} 26} 27} 28for(intk=0;k<len;k++) 29{ 30if(p_data[k]==max_window_length) 31{ 32/*極大值*/ 33} 34} 35}

4.4.2 添加命令行


			

1{(constuint8_t*)"max",MaxFun,"max"},/*打印幫助信息*/ 2voidMaxFun(void*param) 3{ 4max_test(); 5} 6voidMaxFun(void*param);

測試代碼如下,串口命令行輸入命令max,開始采集ADC值,并計(jì)算極值,打印到PC串口通過seraistudio可視化顯示


			

1intmax_test(void) 2{ 3for(inti=0;i<10;i++) 4{ 5memset(p_data,0,sizeof(p_data)); 6//adc_samp(sim_data_buffer,1000); 7sim_data(); 8ampd(sim_data_buffer,sizeof(sim_data_buffer)/sizeof(sim_data_buffer[0])); 9for(intk=0;k<sizeof(sim_data_buffer)/sizeof(sim_data_buffer[0]);k++) 10{ 11if(p_data[k]==max_window_length) 12{ 13/*極大值*/ 14printf("/*%ld,%ld*/ ",sim_data_buffer[k],sim_data_buffer[k]); 15} 16else 17{ 18printf("/*%ld,%d*/ ",sim_data_buffer[k],0); 19} 20cyhal_system_delay_ms(10); 21} 22} 23return0; 24}

4.4.3 測試

效果如下IN是原始數(shù)據(jù),MAX是檢測到的極大值,如果檢測極小值將原始數(shù)據(jù)取反即可。

wKgZomUt2q-AEzK0AABkghq9CX4766.jpg

wKgZomUt2q-AKWrGAABCqborvGI705.jpg

檢測語音,效果如下

wKgZomUt2q-AH-RRAABPblN0HsA284.jpg

wKgZomUt2q-AC5nPAAA_Ym_aWb8479.jpg

五、總結(jié)


得益于開發(fā)板出色的處理性能,和外設(shè)性能,以及官方可視化的代碼配置工具,可以方便的搭建開發(fā)環(huán)境,實(shí)現(xiàn)外設(shè)采集信號比如ADC,移植DSP庫,實(shí)現(xiàn)各種算法。本Demo實(shí)現(xiàn)了諧波分析,周期幅值相位分析,數(shù)字濾波,極大值檢測等功能,是一個(gè)小的工具集,還可以繼續(xù)擴(kuò)展,設(shè)計(jì)了人機(jī)交互命令行,方便實(shí)用和測試,具備一定實(shí)用價(jià)值。

———————End——————

wKgZomUt2rCAKQZiAHiX-BnG6Ho319.gif

點(diǎn)擊閱讀原文進(jìn)入官網(wǎng)


原文標(biāo)題:基于infineonPSOC62開發(fā)板的-信號處理前端 虛擬示波器-工具集

文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1497

    瀏覽量

    43533

原文標(biāo)題:基于infineonPSOC62開發(fā)板的-信號處理前端 虛擬示波器-工具集

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    ESP32開發(fā)板元件資料

    ESP32開發(fā)板元件
    發(fā)表于 07-21 14:47 ?13次下載

    Vivado無法選中開發(fā)板的常見原因及解決方法

    對應(yīng)的器件信息和約束文件(XDC),大大簡化工程初始化流程。然而,在某些情況下,我們可能會(huì)發(fā)現(xiàn) Vivado 的界面中無法選中目標(biāo)開發(fā)板,導(dǎo)致只能手動(dòng)選擇器件。那么,遇到這種情況該如何處理呢?
    的頭像 發(fā)表于 07-15 10:19 ?1078次閱讀
    Vivado無法選中<b class='flag-5'>開發(fā)板</b>的常見原因及解決方法

    如何部署流媒體服務(wù)實(shí)現(xiàn)監(jiān)控功能--基于米爾TI AM62x開發(fā)板

    本文將介紹基于米爾電子MYD-YM62X開發(fā)板(米爾基于TIAM62開發(fā)板)的部署流媒體服務(wù)實(shí)現(xiàn)監(jiān)控功能方案的開發(fā)測試。摘自優(yōu)秀創(chuàng)作者-Ho
    的頭像 發(fā)表于 07-03 08:03 ?1781次閱讀
    如何部署流媒體服務(wù)實(shí)現(xiàn)監(jiān)控功能--基于米爾TI AM<b class='flag-5'>62</b>x<b class='flag-5'>開發(fā)板</b>

    超低功耗開發(fā)工具PY32L020開發(fā)板

    PY32L020開發(fā)板是針對普冉PY32L020超低功耗32位單片機(jī)設(shè)計(jì)的官方評估平臺,用于快速驗(yàn)證芯片功能和開發(fā)原型系統(tǒng)開發(fā)支持有工具鏈?zhǔn)侵С諯eil/IAR
    的頭像 發(fā)表于 06-13 14:58 ?444次閱讀
    超低功耗<b class='flag-5'>開發(fā)工具</b>PY32L020<b class='flag-5'>開發(fā)板</b>

    【新品】遠(yuǎn)距離圖傳數(shù)傳模塊開發(fā)板、藍(lán)牙模塊開發(fā)板、無線模塊開發(fā)板

    新品上市圖傳數(shù)傳模塊開發(fā)板藍(lán)牙模塊開發(fā)板國產(chǎn)無線模塊開發(fā)板部分型號參與送樣文末了解詳情↓↓↓EWT611-900NW20S遠(yuǎn)距離圖傳數(shù)傳模塊開發(fā)板EWT611-900NW20S是一款入
    的頭像 發(fā)表于 06-12 19:33 ?691次閱讀
    【新品】遠(yuǎn)距離圖傳數(shù)傳模塊<b class='flag-5'>開發(fā)板</b>、藍(lán)牙模塊<b class='flag-5'>開發(fā)板</b>、無線模塊<b class='flag-5'>開發(fā)板</b>

    效率提升,飛凌AM62x開發(fā)板的常見接口問題及排查思路(第1期)

    AM62x處理器作為TI新一代高性能、低功耗處理器,在工業(yè)控制、人機(jī)交互、邊緣計(jì)算等領(lǐng)域有著廣泛應(yīng)用。飛凌嵌入式基于AM62x處理器設(shè)計(jì)
    的頭像 發(fā)表于 06-06 14:33 ?1511次閱讀
    效率提升,飛凌AM<b class='flag-5'>62</b>x<b class='flag-5'>開發(fā)板</b>的常見接口問題及排查思路(第1期)

    技術(shù)分享 | 迅為RK3568開發(fā)板如何將 Linux 板卡虛擬成U盤

    技術(shù)分享 | 迅為RK3568開發(fā)板如何將 Linux 板卡虛擬成U盤
    的頭像 發(fā)表于 06-04 10:57 ?733次閱讀
    技術(shù)分享 | 迅為RK3568<b class='flag-5'>開發(fā)板</b>如何將 Linux 板卡<b class='flag-5'>虛擬</b>成U盤

    雷卯收集增強(qiáng)現(xiàn)實(shí)AR開發(fā)板

    現(xiàn)實(shí)AR開發(fā)板明細(xì)如下: 如下是AR開發(fā)板介紹: AR是一種將虛擬元素與現(xiàn)實(shí)環(huán)境完美融合的技術(shù)。它通過攝像頭捕捉現(xiàn)實(shí)世界的場景,再利用計(jì)算機(jī)處理將這些場景與
    的頭像 發(fā)表于 04-07 09:34 ?484次閱讀
    雷卯收集增強(qiáng)現(xiàn)實(shí)AR<b class='flag-5'>開發(fā)板</b>

    雷卯收集AI實(shí)驗(yàn)課程開發(fā)板

    。歡迎聯(lián)系。 雷卯收集AI實(shí)驗(yàn)課程開發(fā)板明細(xì)如下: 如下是AI實(shí)驗(yàn)課程開發(fā)板介紹: AI實(shí)驗(yàn)課程的核心在于利用人工智能技術(shù)進(jìn)行實(shí)踐操作。虛擬實(shí)驗(yàn)室讓學(xué)生在模擬的真實(shí)環(huán)境中進(jìn)行實(shí)驗(yàn),減少物理風(fēng)險(xiǎn)和資源消耗。同時(shí),AI輔助安全監(jiān)管功
    的頭像 發(fā)表于 04-02 12:14 ?460次閱讀
    雷卯收集AI實(shí)驗(yàn)課程<b class='flag-5'>開發(fā)板</b>

    雷卯收集云終端開發(fā)板

    收集云終端開發(fā)板明細(xì)如下: 如下是云終端開發(fā)板介紹: 云終端是一種依托于云計(jì)算技術(shù)的終端設(shè)備,它利用虛擬化技術(shù),將計(jì)算和存儲(chǔ)資源集中于云端服務(wù)器,終端設(shè)備僅需處理顯示和輸入。 云終端的
    的頭像 發(fā)表于 04-02 11:15 ?361次閱讀
    雷卯收集云終端<b class='flag-5'>開發(fā)板</b>

    雷卯收集虛擬現(xiàn)實(shí)VR開發(fā)板

    虛擬現(xiàn)實(shí)VR開發(fā)板明細(xì)如下: 如下是VR開發(fā)板介紹: VR是一種通過計(jì)算機(jī)生成的三維虛擬環(huán)境,用戶可以通過視覺、聽覺等感官進(jìn)行互動(dòng)的技術(shù),其核心理念在于打破傳統(tǒng)信息呈現(xiàn)的界限,通過多樣
    的頭像 發(fā)表于 04-01 20:54 ?452次閱讀
    雷卯收集<b class='flag-5'>虛擬</b>現(xiàn)實(shí)VR<b class='flag-5'>開發(fā)板</b>

    正點(diǎn)原子fpga開發(fā)板不同型號

    正點(diǎn)原子作為國內(nèi)領(lǐng)先的FPGA開發(fā)板供應(yīng)商,其產(chǎn)品線覆蓋了從入門級到高端應(yīng)用的各個(gè)領(lǐng)域。這些開發(fā)板不僅適用于學(xué)術(shù)研究,還廣泛應(yīng)用于工業(yè)控制、通信、圖像處理等多個(gè)領(lǐng)域。 1. 入門級開發(fā)板
    的頭像 發(fā)表于 11-13 09:30 ?4775次閱讀

    ARM開發(fā)板與FPGA的結(jié)合應(yīng)用

    大的功能和更高的靈活性,滿足各種復(fù)雜應(yīng)用的需求。 二、ARM開發(fā)板與FPGA的優(yōu)勢 高性能:ARM處理器具有高性能的特點(diǎn),可以處理復(fù)雜的算法和任務(wù)。FPGA則可以實(shí)現(xiàn)高速的數(shù)字信號
    的頭像 發(fā)表于 11-05 11:42 ?1900次閱讀

    ARM開發(fā)板與樹莓派的比較

    處理器 ARM開發(fā)板通常采用不同的ARM處理器,如Cortex-A系列、Cortex-M系列等,而樹莓派則主要使用博通的ARM處理器。樹莓派的處理
    的頭像 發(fā)表于 11-05 11:11 ?1725次閱讀

    使用Tftpd32工具數(shù)據(jù)互傳是一種什么體驗(yàn)?SSD201/202D開發(fā)板演示,深圳觸覺智能嵌入式方案商

    本文介紹了Tftpd32工具的使用方法,方便電腦與開發(fā)板文件互相傳輸。使用到的是觸覺智能的Purple Pi R1雙網(wǎng)口開發(fā)板,搭載了SigmaStar SSD201/SSD202D芯片,是嵌入式新人入門學(xué)習(xí)的高性價(jià)比
    的頭像 發(fā)表于 10-17 11:20 ?1091次閱讀
    使用Tftpd32<b class='flag-5'>工具</b>數(shù)據(jù)互傳是一種什么體驗(yàn)?SSD201/202D<b class='flag-5'>開發(fā)板</b>演示,深圳觸覺智能嵌入式方案商