Files
32343 843447835d Initial commit: TC264 smart car project with IPS200 menu system
- IPS200 display menu with real-time status and parameter settings
- Camera image processing and line tracking
- IMU attitude solution and PID control
- WiFi SPI oscilloscope data transmission
2026-05-10 21:38:49 +08:00

391 lines
7.3 KiB
C

/**
* \file Ifx_Cf32.c
* \brief Floating point signal, vector, and matrix library
*
*
* \version disabled
* \copyright Copyright (c) 2013 Infineon Technologies AG. All rights reserved.
*
*
* IMPORTANT NOTICE
*
*
* Use of this file is subject to the terms of use agreed between (i) you or
* the company in which ordinary course of business you are acting and (ii)
* Infineon Technologies AG or its licensees. If and as long as no such
* terms of use are agreed, use of this file is subject to following:
* Boost Software License - Version 1.0 - August 17th, 2003
* Permission is hereby granted, free of charge, to any person or
* organization obtaining a copy of the software and accompanying
* documentation covered by this license (the "Software") to use, reproduce,
* display, distribute, execute, and transmit the Software, and to prepare
* derivative works of the Software, and to permit third-parties to whom the
* Software is furnished to do so, all subject to the following:
* The copyright notices in the Software and this entire statement, including
* the above license grant, this restriction and the following disclaimer, must
* be included in all copies of the Software, in whole or in part, and all
* derivative works of the Software, unless such copies or derivative works are
* solely in the form of machine-executable object code generated by a source
* language processor.
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
* SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
* FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
#include "Ifx_Cf32.h"
#include <float.h>
#include <stdio.h>
void CplxVecRst_f32(cfloat32 *X, short nX)
{
for ( ; nX > 0; nX--)
{
X->real = X->imag = 0.0;
X++;
}
}
void CplxVecCpy_f32S(cfloat32 *X, short *S, short nS, short incrS)
{
for ( ; nS > 0; nS--)
{
(*X).imag = 0.0;
(*X).real = *(S);
X++; S += incrS;
}
}
void CplxVecCpy_f32(cfloat32 *X, cfloat32 *S, short nS)
{
for ( ; nS > 0; nS--)
{
*X = *S;
X++; S++;
}
}
float32 *CplxVecPwr_f32(cfloat32 *X, short nX)
{
unsigned short i;
float32 *r = (float32 *)X;
for (i = 0; i < nX; i++)
{
*r = IFX_Cf32_dot(X);
r++; X++;
}
return &r[-nX];
}
float32 *CplxVecMag_f32(cfloat32 *X, short nX)
{
unsigned short i;
float32 *r = (float32 *)X;
for (i = 0; i < nX; i++)
{
*r = IFX_Cf32_mag(X);
r++; X++;
}
return &r[-nX];
}
void CplxVecMul_f32(cfloat32 *X, const cfloat32 *mul, short nX)
{
for ( ; nX > 0; nX--)
{
*X = IFX_Cf32_mul(X, mul);
X++;
}
}
void VecPwrdB_f32(float32 *X, short nX)
{
unsigned short i;
for (i = 0; i < nX; i++)
{
*X = (float32)20.0 * log10f(*X);
X++;
}
}
void VecPwrdB_SF(sint16 *R, float32 *X, short nX)
{
unsigned short i;
for (i = 0; i < nX; i++)
{
*R = (sint16)(20.0 * log10f(*X));
R++; X++;
}
}
float32 VecMaxIdx_f32(float32 *X, short nX, sint16 *minIdx, sint16 *maxIdx)
{
float32 maxPeak = FLT_MIN;
unsigned short m;
for (m = 0; m < nX; m++)
{
if (*X > maxPeak)
{
maxPeak = *X;
*minIdx = m;
}
if (*X >= maxPeak)
{
*maxIdx = m;
}
X++;
}
return maxPeak;
}
float32 VecMinIdx_f32(float32 *X, short nX, sint16 *minIdx, sint16 *maxIdx)
{
float32 minPeak = FLT_MAX;
short m;
for (m = 0; m < nX; m++)
{
if (*X < minPeak)
{
minPeak = *X;
*minIdx = m;
}
if (*X <= minPeak)
{
*maxIdx = m;
}
X++;
}
return minPeak;
}
void VecOfs_f32(float32 *X, float32 offset, short nX)
{
unsigned short i;
for (i = 0; i < nX; i++)
{
*X -= offset;
X++;
}
}
void VecGain_f32(float32 *X, float32 gain, short nX)
{
unsigned short i;
for (i = 0; i < nX; i++)
{
*X = *X * gain;
X++;
}
}
float32 VecSum_f32(float32 *X, short nX)
{
float32 sumX = 0;
unsigned short i;
for (i = 0; i < nX; i++)
{
sumX += *X;
X++;
}
return sumX;
}
float32 VecAvg_f32(float32 *X, short nX)
{
return VecSum_f32(X, nX) / nX;
}
float32 VecMax_f32(float32 *X, short nX)
{
unsigned short i;
float32 r = FLT_MIN;
for (i = 0; i < nX; i++)
{
r = __maxf(r, *X);
X++;
}
return r;
}
float32 VecMin_f32(float32 *X, short nX)
{
unsigned short i;
float32 r = FLT_MAX;
for (i = 0; i < nX; i++)
{
r = __minf(r, *X);
X++;
}
return r;
}
void VecHalfSwap_f32(float32 *X, short nX)
{
unsigned short i;
unsigned short half = nX / 2;
float32 *F = &X[half];
for (i = 0; i < half; i++)
{
float32 tmp = *F;
*F = *X;
*X = tmp;
F++; X++;
}
}
/* NOTE:
* (nX <= nW) && ((nW % nX) == 0) && ((nX % 2) == 0)
* (symW != 0) when the window is symmetrical */
void VecWin_f32(float32 *X, const float32 *W, short nX, short nW, short incrX, short symW)
{
short step = nW / nX;
short i;
if (symW != 0)
{ /* symmetrical window, using half of the length */
for (i = 0; i < nX / 2; i++)
{
*X = *X * *W;
X = &X[incrX];
W = &W[step];
}
W = &W[-step];
for ( ; i < nX; i++)
{
*X = *X * *W;
X = &X[incrX];
W = &W[-step];
}
}
}
#ifdef __WIN32__
#define ENDL "\r\n"
void DataF_printf(FILE *fp, pchar fileName, float32 *data, long nX, int enclosed)
{
long i;
if (fileName != NULL)
{
fp = fopen(fileName, "w+");
}
if (fp != NULL)
{
if (enclosed)
{
for (i = 0; i < nX; i++)
{
fprintf(fp, "_DATAF(%10.20f),"ENDL, *data);
data = &data[1];
}
}
else
{
for (i = 0; i < nX; i++)
{
fprintf(fp, "%10.20f,"ENDL, *data);
data = &data[1];
}
}
}
if (fileName != NULL)
{
fclose(fp);
}
}
void Cplx_f32_printf(FILE *fp, pchar fileName, cfloat32 *data, long nX, int encloseData)
{
long i;
if (fileName != NULL)
{
fp = fopen(fileName, "w+");
}
if (fp != NULL)
{
if (encloseData)
{
for (i = 0; i < nX; i++)
{
fprintf(fp, "{_DATAF(%10.20f), _DATAF(%10.20f)},"ENDL, data->real, data->imag);
data = &data[1];
}
}
else
{
for (i = 0; i < nX; i++)
{
fprintf(fp, "%10.20f, %10.20f"ENDL, data->real, data->imag);
data = &data[1];
}
}
}
if (fileName != NULL)
{
fclose(fp);
}
}
#endif