/** * @file tiny_corr.c * @author SHUAIWEN CUI (SHUAIWEN001@e.ntu.edu.sg) * @brief tiny_corr | code | source * @version 1.0 * @date 2025-04-27 * @copyright Copyright (c) 2025 * *//* DEPENDENCIES */#include"tiny_corr.h"/** * @name: tiny_corr_f32 * @brief Correlation function * * @param Signal: input signal array * @param siglen: length of the signal array * @param Pattern: input pattern array * @param patlen: length of the pattern array * @param dest: output array for the correlation result * * @return tiny_error_t */tiny_error_ttiny_corr_f32(constfloat*Signal,constintsiglen,constfloat*Pattern,constintpatlen,float*dest){if(NULL==Signal||NULL==Pattern||NULL==dest){returnTINY_ERR_DSP_NULL_POINTER;}if(siglen<=0||patlen<=0){returnTINY_ERR_DSP_INVALID_PARAM;}if(siglen<patlen)/* pattern must fit within the signal */{returnTINY_ERR_DSP_MISMATCH;}#if MCU_PLATFORM_SELECTED == MCU_PLATFORM_ESP32dsps_corr_f32(Signal,siglen,Pattern,patlen,dest);#elsefor(size_tn=0;n<=(siglen-patlen);n++){floatk_corr=0;for(size_tm=0;m<patlen;m++){k_corr+=Signal[n+m]*Pattern[m];}dest[n]=k_corr;}#endifreturnTINY_OK;}/** * @name: tiny_ccorr_f32 * @brief Cross-correlation function * * @param Signal: input signal array * @param siglen: length of the signal array * @param Kernel: input kernel array * @param kernlen: length of the kernel array * @param corrvout: output array for the cross-correlation result * * @return tiny_error_t */tiny_error_ttiny_ccorr_f32(constfloat*Signal,constintsiglen,constfloat*Kernel,constintkernlen,float*corrvout){if(NULL==Signal||NULL==Kernel||NULL==corrvout){returnTINY_ERR_DSP_NULL_POINTER;}if(siglen<=0||kernlen<=0){returnTINY_ERR_DSP_INVALID_PARAM;}#if MCU_PLATFORM_SELECTED == MCU_PLATFORM_ESP32dsps_ccorr_f32(Signal,siglen,Kernel,kernlen,corrvout);#elseconstfloat*sig=Signal;constfloat*kern=Kernel;intlsig=siglen;intlkern=kernlen;/* Cross-correlation is symmetric in its operand lengths, so make * the longer one the "signal" to keep the indexing in the three * stages below valid for either calling convention. */if(siglen<kernlen){sig=Kernel;kern=Signal;lsig=kernlen;lkern=siglen;}// stage Ifor(intn=0;n<lkern;n++){size_tk;size_tkmin=lkern-1-n;corrvout[n]=0;for(k=0;k<=n;k++){corrvout[n]+=sig[k]*kern[kmin+k];}}// stage IIfor(intn=lkern;n<lsig;n++){size_tkmin,kmax,k;corrvout[n]=0;kmin=n-lkern+1;kmax=n;for(k=kmin;k<=kmax;k++){corrvout[n]+=sig[k]*kern[k-kmin];}}// stage IIIfor(intn=lsig;n<lsig+lkern-1;n++){size_tkmin,kmax,k;corrvout[n]=0;kmin=n-lkern+1;kmax=lsig-1;for(k=kmin;k<=kmax;k++){corrvout[n]+=sig[k]*kern[k-kmin];}}#endifreturnTINY_OK;}