Compare commits
2
Commits
5cf2212fc0
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
829ee15a2d | ||
|
|
f01d3213c0 |
No files matched your search
Vendored
+2
@@ -28,6 +28,8 @@
|
|||||||
"${workspaceFolder}/Appli/TouchGFX/App",
|
"${workspaceFolder}/Appli/TouchGFX/App",
|
||||||
"${workspaceFolder}/Drivers/CMSIS/Include",
|
"${workspaceFolder}/Drivers/CMSIS/Include",
|
||||||
"${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32H7RSxx/Include",
|
"${workspaceFolder}/Drivers/CMSIS/Device/ST/STM32H7RSxx/Include",
|
||||||
|
"${workspaceFolder}/Drivers/CMSIS/DSP/Include",
|
||||||
|
"${workspaceFolder}/Drivers/CMSIS/DSP/PrivateInclude",
|
||||||
"${workspaceFolder}/Drivers/STM32H7RSxx_HAL_Driver/Inc",
|
"${workspaceFolder}/Drivers/STM32H7RSxx_HAL_Driver/Inc",
|
||||||
"${workspaceFolder}/Drivers/CMSIS/RTOS2/Include",
|
"${workspaceFolder}/Drivers/CMSIS/RTOS2/Include",
|
||||||
"${workspaceFolder}/Drivers/STM32H7RSxx_BSP/STM32H7S78-DK",
|
"${workspaceFolder}/Drivers/STM32H7RSxx_BSP/STM32H7S78-DK",
|
||||||
|
|||||||
Vendored
+1
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
|
|
||||||
{
|
{
|
||||||
"name": "Debug Boot",
|
"name": "Debug Boot",
|
||||||
"type": "cortex-debug",
|
"type": "cortex-debug",
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#ifndef AUDIO_ANALYSIS_H
|
||||||
|
#define AUDIO_ANALYSIS_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FFT calculee sur 2048 points : le spectre d'un signal reel est symetrique, donc
|
||||||
|
* seule la moitie (0 a Fe/2) est utile -> exactement 1024 points affichables,
|
||||||
|
* correspondant a la capacite du widget Graph cote IHM. */
|
||||||
|
#define AUDIO_ANALYSIS_SAMPLE_RATE_HZ 48000U
|
||||||
|
#define AUDIO_ANALYSIS_FFT_SIZE 2048U
|
||||||
|
#define AUDIO_ANALYSIS_NUM_BINS (AUDIO_ANALYSIS_FFT_SIZE / 2U) /* 1024 : 0 a Fe/2 */
|
||||||
|
|
||||||
|
/* A appeler une fois au demarrage, comme AudioEffects_Init(). */
|
||||||
|
void AudioAnalysis_Init(void);
|
||||||
|
|
||||||
|
/* A appeler depuis le chemin audio temps reel (ex: push_to_fifo), un echantillon
|
||||||
|
* a la fois. Ne fait rien (cout quasi nul) tant que l'analyse n'est pas activee. */
|
||||||
|
void AudioAnalysis_PushSample(float sample);
|
||||||
|
|
||||||
|
/* A appeler depuis la tache IHM (jamais depuis le contexte audio) : si un bloc de
|
||||||
|
* AUDIO_ANALYSIS_FFT_SIZE echantillons est pret, calcule son spectre (fenetrage +
|
||||||
|
* FFT + magnitude en dB). Retourne true si un nouveau spectre vient d'etre calcule. */
|
||||||
|
bool AudioAnalysis_Update(void);
|
||||||
|
|
||||||
|
/* Spectre courant, AUDIO_ANALYSIS_NUM_BINS valeurs en dB (echelle approximative,
|
||||||
|
* pour affichage uniquement), du bin 0 (continu) au bin NUM_BINS-1 (~Fe/2). Le
|
||||||
|
* pas entre deux bins vaut AUDIO_ANALYSIS_SAMPLE_RATE_HZ / AUDIO_ANALYSIS_FFT_SIZE
|
||||||
|
* (23.4375 Hz ici). Valide apres un AudioAnalysis_Update() ayant retourne true ;
|
||||||
|
* inchange sinon (dernier spectre calcule). */
|
||||||
|
const float *AudioAnalysis_GetMagnitudesDb(void);
|
||||||
|
|
||||||
|
/* Frequence (en Hz) du bin de plus forte magnitude dans le dernier spectre calcule
|
||||||
|
* (frequence dominante / pic). Valide dans les memes conditions que
|
||||||
|
* AudioAnalysis_GetMagnitudesDb(). */
|
||||||
|
float AudioAnalysis_GetPeakFrequencyHz(void);
|
||||||
|
|
||||||
|
/* Active/desactive la capture et le calcul (pilote par le toggle de l'ecran Oscillo). */
|
||||||
|
void AudioAnalysis_SetEnabled(bool enabled);
|
||||||
|
bool AudioAnalysis_IsEnabled(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* AUDIO_ANALYSIS_H */
|
||||||
@@ -18,7 +18,8 @@ extern "C" {
|
|||||||
* octaveur -> egaliseur -> overdrive -> saturation -> echo -> reverberation. */
|
* octaveur -> egaliseur -> overdrive -> saturation -> echo -> reverberation. */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
bool audio_on_off;
|
bool audio_on_off;
|
||||||
|
float master_volume; /* volume general en sortie de chaine, 0.0 a 1.0 */
|
||||||
FxOctaverParams octaver;
|
FxOctaverParams octaver;
|
||||||
FxEqualizerParams equalizer;
|
FxEqualizerParams equalizer;
|
||||||
FxOverdriveParams overdrive;
|
FxOverdriveParams overdrive;
|
||||||
|
|||||||
@@ -0,0 +1,155 @@
|
|||||||
|
#include "audio_analysis.h"
|
||||||
|
#include "arm_math.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#define FFT_SIZE AUDIO_ANALYSIS_FFT_SIZE
|
||||||
|
#define NUM_BINS AUDIO_ANALYSIS_NUM_BINS
|
||||||
|
|
||||||
|
/* --- Capture en double buffer (ping-pong), ecrite depuis le chemin audio temps
|
||||||
|
* reel, lue depuis la tache IHM. Un seul ecrivain, un seul lecteur : pas de verrou
|
||||||
|
* necessaire, meme principe que la FIFO audio principale. --- */
|
||||||
|
static float g_capture_buf[2][FFT_SIZE];
|
||||||
|
static uint32_t g_capture_fill_idx = 0;
|
||||||
|
static uint8_t g_capture_write_buf = 0;
|
||||||
|
static volatile uint8_t g_capture_ready_buf = 0xFFU; /* 0xFF = aucun buffer complet en attente */
|
||||||
|
|
||||||
|
static bool g_analysis_enabled = false;
|
||||||
|
|
||||||
|
/* --- Fenetre precalculee (a l'init uniquement, jamais recalculee en boucle) --- */
|
||||||
|
static float g_hann_window[FFT_SIZE];
|
||||||
|
|
||||||
|
/* --- FFT reelle CMSIS-DSP : instance initialisee une fois, buffers de travail --- */
|
||||||
|
static arm_rfft_fast_instance_f32 g_rfft_instance;
|
||||||
|
static float g_fft_work[FFT_SIZE]; /* echantillons fenetres ; ecrase (scratch) par arm_rfft_fast_f32 */
|
||||||
|
static float g_fft_out[FFT_SIZE]; /* spectre complexe empaquete, format CMSIS (voir plus bas) */
|
||||||
|
|
||||||
|
static float g_magnitudes_db[NUM_BINS]; /* seule la moitie 0..Fe/2 est conservee */
|
||||||
|
static float g_peak_freq_hz = 0.0f;
|
||||||
|
|
||||||
|
static void AudioAnalysis_BuildTables(void)
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < FFT_SIZE; i++)
|
||||||
|
{
|
||||||
|
/* Fenetre de Hann : reduit les fuites spectrales dues a la troncature du bloc. */
|
||||||
|
g_hann_window[i] = 0.5f - 0.5f * cosf(2.0f * (float)M_PI * (float)i / (float)(FFT_SIZE - 1U));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioAnalysis_Init(void)
|
||||||
|
{
|
||||||
|
memset(g_capture_buf, 0, sizeof(g_capture_buf));
|
||||||
|
g_capture_fill_idx = 0;
|
||||||
|
g_capture_write_buf = 0;
|
||||||
|
g_capture_ready_buf = 0xFFU;
|
||||||
|
g_analysis_enabled = false;
|
||||||
|
|
||||||
|
memset(g_magnitudes_db, 0, sizeof(g_magnitudes_db));
|
||||||
|
|
||||||
|
AudioAnalysis_BuildTables();
|
||||||
|
arm_rfft_fast_init_f32(&g_rfft_instance, FFT_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioAnalysis_PushSample(float sample)
|
||||||
|
{
|
||||||
|
if (!g_analysis_enabled)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_capture_buf[g_capture_write_buf][g_capture_fill_idx] = sample;
|
||||||
|
g_capture_fill_idx++;
|
||||||
|
|
||||||
|
if (g_capture_fill_idx >= FFT_SIZE)
|
||||||
|
{
|
||||||
|
g_capture_fill_idx = 0;
|
||||||
|
g_capture_ready_buf = g_capture_write_buf;
|
||||||
|
g_capture_write_buf = 1U - g_capture_write_buf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AudioAnalysis_Update(void)
|
||||||
|
{
|
||||||
|
if (!g_analysis_enabled)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t ready = g_capture_ready_buf;
|
||||||
|
if (ready == 0xFFU)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
g_capture_ready_buf = 0xFFU;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < FFT_SIZE; i++)
|
||||||
|
{
|
||||||
|
g_fft_work[i] = g_capture_buf[ready][i] * g_hann_window[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* arm_rfft_fast_f32 (forward, ifftFlag=0) empaquete le spectre d'un signal reel
|
||||||
|
* en NUM_BINS paires {re,im}, sauf la premiere qui contient les deux seules
|
||||||
|
* valeurs reelles (DC et Nyquist) : g_fft_out[0]=X[0] (DC), g_fft_out[1]=X[N/2]
|
||||||
|
* (Nyquist, non utilise ici). Pour k=1..NUM_BINS-1 : re=g_fft_out[2k], im=g_fft_out[2k+1]. */
|
||||||
|
arm_rfft_fast_f32(&g_rfft_instance, g_fft_work, g_fft_out, 0);
|
||||||
|
|
||||||
|
/* Magnitude normalisee (une sinusoide plein-echelle donne ~0dB) puis convertie
|
||||||
|
* en dB, avec un plancher pour eviter log(0). Destine a un affichage visuel,
|
||||||
|
* pas a une mesure calibree. Seule la moitie 0..Fe/2 du spectre est conservee :
|
||||||
|
* le spectre d'un signal reel est symetrique, la seconde moitie n'apporte rien. */
|
||||||
|
/* Recherche du pic en meme temps que le calcul des magnitudes. Le bin 0 (continu,
|
||||||
|
* 0Hz) est ignore : une composante DC ne doit pas etre rapportee comme "frequence
|
||||||
|
* dominante". */
|
||||||
|
uint32_t peak_bin = 1U;
|
||||||
|
float peak_mag = 0.0f;
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < NUM_BINS; i++)
|
||||||
|
{
|
||||||
|
float re = (i == 0U) ? g_fft_out[0] : g_fft_out[2U * i];
|
||||||
|
float im = (i == 0U) ? 0.0f : g_fft_out[2U * i + 1U];
|
||||||
|
float mag = sqrtf(re * re + im * im) / ((float)FFT_SIZE / 4.0f);
|
||||||
|
|
||||||
|
if (i >= 1U && mag > peak_mag)
|
||||||
|
{
|
||||||
|
peak_mag = mag;
|
||||||
|
peak_bin = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mag < 1.0e-6f)
|
||||||
|
{
|
||||||
|
mag = 1.0e-6f;
|
||||||
|
}
|
||||||
|
g_magnitudes_db[i] = 20.0f * log10f(mag);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_peak_freq_hz = (float)peak_bin * (float)AUDIO_ANALYSIS_SAMPLE_RATE_HZ / (float)FFT_SIZE;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const float *AudioAnalysis_GetMagnitudesDb(void)
|
||||||
|
{
|
||||||
|
return g_magnitudes_db;
|
||||||
|
}
|
||||||
|
|
||||||
|
float AudioAnalysis_GetPeakFrequencyHz(void)
|
||||||
|
{
|
||||||
|
return g_peak_freq_hz;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AudioAnalysis_SetEnabled(bool enabled)
|
||||||
|
{
|
||||||
|
if (enabled && !g_analysis_enabled)
|
||||||
|
{
|
||||||
|
/* Redemarre une capture propre a chaque activation. */
|
||||||
|
g_capture_fill_idx = 0;
|
||||||
|
g_capture_write_buf = 0;
|
||||||
|
g_capture_ready_buf = 0xFFU;
|
||||||
|
}
|
||||||
|
g_analysis_enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AudioAnalysis_IsEnabled(void)
|
||||||
|
{
|
||||||
|
return g_analysis_enabled;
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ static FxReverbState g_reverbState;
|
|||||||
void AudioEffects_Init(void)
|
void AudioEffects_Init(void)
|
||||||
{
|
{
|
||||||
g_params.audio_on_off = false;
|
g_params.audio_on_off = false;
|
||||||
|
g_params.master_volume = 0.0f;
|
||||||
FxOctaver_Init(&g_octaverState, &g_params.octaver);
|
FxOctaver_Init(&g_octaverState, &g_params.octaver);
|
||||||
FxEqualizer_Init(&g_eqState, &g_params.equalizer);
|
FxEqualizer_Init(&g_eqState, &g_params.equalizer);
|
||||||
FxOverdrive_Init(&g_overdriveState, &g_params.overdrive);
|
FxOverdrive_Init(&g_overdriveState, &g_params.overdrive);
|
||||||
@@ -37,7 +38,7 @@ float AudioEffects_Process(float input)
|
|||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
return sample;
|
return sample * g_params.master_volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEffectsParams *AudioEffects_GetParams(void)
|
AudioEffectsParams *AudioEffects_GetParams(void)
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
/* USER CODE BEGIN Includes */
|
/* USER CODE BEGIN Includes */
|
||||||
#include "stm32h7s78_discovery_audio.h"
|
#include "stm32h7s78_discovery_audio.h"
|
||||||
#include "audio_effects.h"
|
#include "audio_effects.h"
|
||||||
|
#include "audio_analysis.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
/* USER CODE END Includes */
|
/* USER CODE END Includes */
|
||||||
|
|
||||||
@@ -188,6 +189,7 @@ int main(void)
|
|||||||
fifo_read_idx = 0;
|
fifo_read_idx = 0;
|
||||||
|
|
||||||
AudioEffects_Init();
|
AudioEffects_Init();
|
||||||
|
AudioAnalysis_Init();
|
||||||
|
|
||||||
sDmaConfig.Address = (uint32_t)adf_buf;
|
sDmaConfig.Address = (uint32_t)adf_buf;
|
||||||
sDmaConfig.DataLength = AUDIO_SAMPLES * sizeof(int32_t); /* OCTETS */
|
sDmaConfig.DataLength = AUDIO_SAMPLES * sizeof(int32_t); /* OCTETS */
|
||||||
@@ -793,6 +795,7 @@ static void push_to_fifo(int32_t raw)
|
|||||||
}
|
}
|
||||||
float sample = adf_sample_to_float(raw);
|
float sample = adf_sample_to_float(raw);
|
||||||
sample = AudioEffects_Process(sample);
|
sample = AudioEffects_Process(sample);
|
||||||
|
AudioAnalysis_PushSample(sample);
|
||||||
int16_t s = float_to_pcm16(sample);
|
int16_t s = float_to_pcm16(sample);
|
||||||
uint32_t idx = fifo_write_idx & (FIFO_SIZE - 1);
|
uint32_t idx = fifo_write_idx & (FIFO_SIZE - 1);
|
||||||
audio_fifo[idx * 2] = s;
|
audio_fifo[idx * 2] = s;
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
{
|
{
|
||||||
"Type": "ButtonWithLabel",
|
"Type": "ButtonWithLabel",
|
||||||
"Name": "buttonWithLabel1",
|
"Name": "buttonWithLabel1",
|
||||||
"Y": 93,
|
"Y": 134,
|
||||||
"Width": 420,
|
"Width": 420,
|
||||||
"Height": 94,
|
"Height": 94,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
@@ -93,7 +93,7 @@
|
|||||||
{
|
{
|
||||||
"Type": "ButtonWithLabel",
|
"Type": "ButtonWithLabel",
|
||||||
"Name": "buttonWithLabel2",
|
"Name": "buttonWithLabel2",
|
||||||
"Y": 281,
|
"Y": 322,
|
||||||
"Width": 420,
|
"Width": 420,
|
||||||
"Height": 94,
|
"Height": 94,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
@@ -116,7 +116,7 @@
|
|||||||
"Type": "ButtonWithLabel",
|
"Type": "ButtonWithLabel",
|
||||||
"Name": "buttonWithLabel3",
|
"Name": "buttonWithLabel3",
|
||||||
"X": 380,
|
"X": 380,
|
||||||
"Y": 281,
|
"Y": 322,
|
||||||
"Width": 420,
|
"Width": 420,
|
||||||
"Height": 94,
|
"Height": 94,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
{
|
{
|
||||||
"Type": "ButtonWithLabel",
|
"Type": "ButtonWithLabel",
|
||||||
"Name": "buttonWithLabel4",
|
"Name": "buttonWithLabel4",
|
||||||
"Y": 187,
|
"Y": 228,
|
||||||
"Width": 420,
|
"Width": 420,
|
||||||
"Height": 94,
|
"Height": 94,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
@@ -161,7 +161,7 @@
|
|||||||
"Type": "ButtonWithLabel",
|
"Type": "ButtonWithLabel",
|
||||||
"Name": "buttonWithLabel5",
|
"Name": "buttonWithLabel5",
|
||||||
"X": 380,
|
"X": 380,
|
||||||
"Y": 187,
|
"Y": 228,
|
||||||
"Width": 420,
|
"Width": 420,
|
||||||
"Height": 94,
|
"Height": 94,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
"Type": "ButtonWithLabel",
|
"Type": "ButtonWithLabel",
|
||||||
"Name": "buttonWithLabel6",
|
"Name": "buttonWithLabel6",
|
||||||
"X": 380,
|
"X": 380,
|
||||||
"Y": 93,
|
"Y": 134,
|
||||||
"Width": 420,
|
"Width": 420,
|
||||||
"Height": 94,
|
"Height": 94,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
@@ -203,16 +203,67 @@
|
|||||||
"TextRotation": "0",
|
"TextRotation": "0",
|
||||||
"Preset": "glass_theme\\presets\\button\\regular\\height_50\\large_rounded_normal.json"
|
"Preset": "glass_theme\\presets\\button\\regular\\height_50\\large_rounded_normal.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"Type": "ButtonWithLabel",
|
||||||
|
"Name": "buttonWithLabel7",
|
||||||
|
"X": 190,
|
||||||
|
"Y": 396,
|
||||||
|
"Width": 420,
|
||||||
|
"Height": 94,
|
||||||
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_pressed.png",
|
||||||
|
"Released": "__generated\\glass_theme_images_widgets_button_regular_height_50_large_rounded_normal.png",
|
||||||
|
"TextId": "OSCILLO",
|
||||||
|
"ReleasedColor": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"PressedColor": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"TextRotation": "0",
|
||||||
|
"Preset": "glass_theme\\presets\\button\\regular\\height_50\\large_rounded_normal.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"Type": "ToggleButton",
|
"Type": "ToggleButton",
|
||||||
"Name": "toggleButton1",
|
"Name": "toggleButton1",
|
||||||
"X": 118,
|
"X": 135,
|
||||||
"Y": 22,
|
"Y": 18,
|
||||||
"Width": 170,
|
"Width": 170,
|
||||||
"Height": 60,
|
"Height": 60,
|
||||||
"Pressed": "__generated\\glass_theme_images_widgets_togglebutton_large_rounded_text_on_active.png",
|
"Pressed": "__generated\\glass_theme_images_widgets_togglebutton_large_rounded_text_on_active.png",
|
||||||
"Released": "__generated\\glass_theme_images_widgets_togglebutton_large_rounded_text_off_normal.png",
|
"Released": "__generated\\glass_theme_images_widgets_togglebutton_large_rounded_text_off_normal.png",
|
||||||
"Preset": "glass_theme\\presets\\togglebutton\\large\\rounded_active_text.json"
|
"Preset": "glass_theme\\presets\\togglebutton\\large\\rounded_active_text.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "Slider",
|
||||||
|
"Name": "slider1",
|
||||||
|
"X": 329,
|
||||||
|
"Y": 22,
|
||||||
|
"Width": 456,
|
||||||
|
"Height": 52,
|
||||||
|
"IsHorizontalSlider": true,
|
||||||
|
"BackgroundUnselected": "__generated\\glass_theme_images_widgets_slider_horizontal_thick_track_large.png",
|
||||||
|
"BackgroundSelected": "__generated\\glass_theme_images_widgets_slider_horizontal_thick_filler_large.png",
|
||||||
|
"Indicator": "__generated\\glass_theme_images_widgets_slider_horizontal_thick_rounded_dark.png",
|
||||||
|
"BackgroundX": 28,
|
||||||
|
"BackgroundY": 21,
|
||||||
|
"IndicatorMax": 400,
|
||||||
|
"ValueMax": 100,
|
||||||
|
"Preset": "glass_theme\\presets\\slider\\horizontal\\thick\\large_rounded_dark.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "ScalableImage",
|
||||||
|
"Name": "scalableImage1",
|
||||||
|
"X": 15,
|
||||||
|
"Y": 4,
|
||||||
|
"Width": 105,
|
||||||
|
"Height": 95,
|
||||||
|
"Filename": "__generated\\icon_theme_images_hardware_headset_50_50_FFFFFF.svg.png",
|
||||||
|
"Alpha": 149,
|
||||||
|
"ScalingAlgorithm": "Bilinear Interpolation"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"Interactions": [
|
"Interactions": [
|
||||||
@@ -298,6 +349,39 @@
|
|||||||
"ScreenTransitionType": "ScreenTransitionNone",
|
"ScreenTransitionType": "ScreenTransitionNone",
|
||||||
"ActionComponent": "Octaver"
|
"ActionComponent": "Octaver"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"InteractionName": "Interaction8",
|
||||||
|
"Trigger": {
|
||||||
|
"Type": "TriggerSliderValueChanged",
|
||||||
|
"TriggerComponent": "slider1"
|
||||||
|
},
|
||||||
|
"Action": {
|
||||||
|
"Type": "ActionCustom",
|
||||||
|
"FunctionName": "slider1Changed"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"InteractionName": "Interaction9",
|
||||||
|
"Trigger": {
|
||||||
|
"Type": "TriggerSliderValueConfirmed",
|
||||||
|
"TriggerComponent": "slider1"
|
||||||
|
},
|
||||||
|
"Action": {
|
||||||
|
"Type": "ActionNone"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"InteractionName": "Interaction10",
|
||||||
|
"Trigger": {
|
||||||
|
"Type": "TriggerClicked",
|
||||||
|
"TriggerComponent": "buttonWithLabel7"
|
||||||
|
},
|
||||||
|
"Action": {
|
||||||
|
"Type": "ActionGotoScreen",
|
||||||
|
"ScreenTransitionType": "ScreenTransitionNone",
|
||||||
|
"ActionComponent": "Oscillo"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@@ -2018,6 +2102,198 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Name": "Oscillo",
|
||||||
|
"CanvasBufferSize": 12000,
|
||||||
|
"Components": [
|
||||||
|
{
|
||||||
|
"Type": "Image",
|
||||||
|
"Name": "image1",
|
||||||
|
"Y": -1,
|
||||||
|
"Width": 800,
|
||||||
|
"Height": 483,
|
||||||
|
"RelativeFilename": "fondHorlogerie1.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "Box",
|
||||||
|
"Name": "box1",
|
||||||
|
"Width": 800,
|
||||||
|
"Height": 480,
|
||||||
|
"Color": {
|
||||||
|
"Red": 35,
|
||||||
|
"Green": 24,
|
||||||
|
"Blue": 15
|
||||||
|
},
|
||||||
|
"Alpha": 240
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "TextArea",
|
||||||
|
"Name": "textArea1",
|
||||||
|
"X": 314,
|
||||||
|
"Y": 26,
|
||||||
|
"Width": 173,
|
||||||
|
"Height": 42,
|
||||||
|
"TextId": "OSCILLO",
|
||||||
|
"TextRotation": "0",
|
||||||
|
"Color": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"AutoSize": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "ToggleButton",
|
||||||
|
"Name": "toggleButton1",
|
||||||
|
"X": 576,
|
||||||
|
"Y": 20,
|
||||||
|
"Width": 170,
|
||||||
|
"Height": 60,
|
||||||
|
"Pressed": "__generated\\glass_theme_images_widgets_togglebutton_large_round_text_on_active.png",
|
||||||
|
"Released": "__generated\\glass_theme_images_widgets_togglebutton_large_round_text_off_normal.png",
|
||||||
|
"Preset": "glass_theme\\presets\\togglebutton\\large\\round_active_text.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "ButtonWithLabel",
|
||||||
|
"Name": "buttonWithLabel1",
|
||||||
|
"Width": 225,
|
||||||
|
"Height": 94,
|
||||||
|
"Pressed": "__generated\\glass_theme_images_widgets_button_regular_height_50_small_rounded_pressed.png",
|
||||||
|
"Released": "__generated\\glass_theme_images_widgets_button_regular_height_50_small_rounded_normal.png",
|
||||||
|
"TextId": "BACK",
|
||||||
|
"ReleasedColor": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"PressedColor": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"TextRotation": "0",
|
||||||
|
"Preset": "glass_theme\\presets\\button\\regular\\height_50\\small_rounded_normal.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "StaticGraph",
|
||||||
|
"Name": "graph1",
|
||||||
|
"Y": 94,
|
||||||
|
"Width": 800,
|
||||||
|
"Height": 386,
|
||||||
|
"DataSeed": 676876642,
|
||||||
|
"NumberOfValues": 1024,
|
||||||
|
"MaxX": 24000.0,
|
||||||
|
"PrecisionX": "1",
|
||||||
|
"MaxY": 100.0,
|
||||||
|
"PrecisionY": "1",
|
||||||
|
"XAxisScale": 1.0,
|
||||||
|
"InsertRandomValues": true,
|
||||||
|
"LabelSizeBottom": 63,
|
||||||
|
"LabelSizeLeft": 16,
|
||||||
|
"LabelSizeRight": 16,
|
||||||
|
"PaddingBottom": 17,
|
||||||
|
"GraphDrawers": [
|
||||||
|
{
|
||||||
|
"Type": "LineDrawer",
|
||||||
|
"LineWidth": 2,
|
||||||
|
"FileNameImage": "",
|
||||||
|
"Color": {
|
||||||
|
"Red": 20,
|
||||||
|
"Green": 151,
|
||||||
|
"Blue": 197
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"XAxisGrid": {
|
||||||
|
"Type": "GraphGrid",
|
||||||
|
"Color": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"Interval": 2400.0,
|
||||||
|
"LineWidth": 1
|
||||||
|
},
|
||||||
|
"YAxisGrid": {
|
||||||
|
"Type": "GraphGrid",
|
||||||
|
"Color": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"Interval": 25.0,
|
||||||
|
"LineWidth": 1
|
||||||
|
},
|
||||||
|
"XAxisLabel": {
|
||||||
|
"Type": "GraphLabel",
|
||||||
|
"Interval": 2400.0,
|
||||||
|
"DecimalSeparator": "Point",
|
||||||
|
"TextColor": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"TextId": "__SingleUse_2C9Q",
|
||||||
|
"TextRotation": "270",
|
||||||
|
"Position": "Bottom"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "Image",
|
||||||
|
"Name": "image2",
|
||||||
|
"X": 535,
|
||||||
|
"Y": 74,
|
||||||
|
"Width": 264,
|
||||||
|
"Height": 80,
|
||||||
|
"RelativeFilename": "__generated\\glass_theme_images_widgets_button_regular_height_36_medium_round_action.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Type": "TextArea",
|
||||||
|
"Name": "textArea2",
|
||||||
|
"X": 582,
|
||||||
|
"Y": 104,
|
||||||
|
"Width": 181,
|
||||||
|
"Height": 23,
|
||||||
|
"TextId": "textAreaMax",
|
||||||
|
"TextRotation": "0",
|
||||||
|
"Color": {
|
||||||
|
"Red": 230,
|
||||||
|
"Green": 214,
|
||||||
|
"Blue": 170
|
||||||
|
},
|
||||||
|
"Wildcard1": {
|
||||||
|
"TextId": "__SingleUse_U5V0",
|
||||||
|
"UseBuffer": true,
|
||||||
|
"BufferSize": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"Interactions": [
|
||||||
|
{
|
||||||
|
"InteractionName": "Interaction1",
|
||||||
|
"Trigger": {
|
||||||
|
"Type": "TriggerClicked",
|
||||||
|
"TriggerComponent": "buttonWithLabel1"
|
||||||
|
},
|
||||||
|
"Action": {
|
||||||
|
"Type": "ActionGotoScreen",
|
||||||
|
"ScreenTransitionType": "ScreenTransitionNone",
|
||||||
|
"ActionComponent": "Overview"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"InteractionName": "Interaction2",
|
||||||
|
"Trigger": {
|
||||||
|
"Type": "TriggerClicked",
|
||||||
|
"TriggerComponent": "toggleButton1"
|
||||||
|
},
|
||||||
|
"Action": {
|
||||||
|
"Type": "ActionCustom",
|
||||||
|
"FunctionName": "toggleClicked"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"CustomContainerDefinitions": [],
|
"CustomContainerDefinitions": [],
|
||||||
|
|||||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 315 B |
@@ -14,6 +14,9 @@
|
|||||||
<Text Id="OCTAVER" Alignment="Center" TypographyId="Large">
|
<Text Id="OCTAVER" Alignment="Center" TypographyId="Large">
|
||||||
<Translation Language="GB">OCTAVER</Translation>
|
<Translation Language="GB">OCTAVER</Translation>
|
||||||
</Text>
|
</Text>
|
||||||
|
<Text Id="OSCILLO" Alignment="Center" TypographyId="Large">
|
||||||
|
<Translation Language="GB">OSCILLO</Translation>
|
||||||
|
</Text>
|
||||||
<Text Id="OVERDRIVE" Alignment="Center" TypographyId="Large">
|
<Text Id="OVERDRIVE" Alignment="Center" TypographyId="Large">
|
||||||
<Translation Language="GB" Alignment="Center">OVERDRIVE</Translation>
|
<Translation Language="GB" Alignment="Center">OVERDRIVE</Translation>
|
||||||
</Text>
|
</Text>
|
||||||
@@ -105,10 +108,20 @@
|
|||||||
<Translation Language="GB" Alignment="Center">+2</Translation>
|
<Translation Language="GB" Alignment="Center">+2</Translation>
|
||||||
</Text>
|
</Text>
|
||||||
</TextGroup>
|
</TextGroup>
|
||||||
<TextGroup Id="Unsorted" />
|
<TextGroup Id="Unsorted">
|
||||||
|
<Text Id="__SingleUse_U5V0" Alignment="Left" TypographyId="Default">
|
||||||
|
<Translation Language="GB">100</Translation>
|
||||||
|
</Text>
|
||||||
|
<Text Id="textAreaMax" Alignment="Left" TypographyId="Default">
|
||||||
|
<Translation Language="GB">Max : <d> Hz</Translation>
|
||||||
|
</Text>
|
||||||
|
<Text Id="__SingleUse_2C9Q" Alignment="Left" TypographyId="Default">
|
||||||
|
<Translation Language="GB"><></Translation>
|
||||||
|
</Text>
|
||||||
|
</TextGroup>
|
||||||
</Texts>
|
</Texts>
|
||||||
<Typographies>
|
<Typographies>
|
||||||
<Typography Id="Default" Font="arial.ttf" Size="20" Bpp="4" IsVector="no" Direction="LTR" FallbackCharacter="?" />
|
<Typography Id="Default" Font="arial.ttf" Size="20" Bpp="4" IsVector="no" Direction="LTR" FallbackCharacter="?" WidgetWildcardCharacters="-., 0123456789" />
|
||||||
<Typography Id="Large" Font="arial.ttf" Size="40" Bpp="4" IsVector="no" Direction="LTR" FallbackCharacter="?" />
|
<Typography Id="Large" Font="arial.ttf" Size="40" Bpp="4" IsVector="no" Direction="LTR" FallbackCharacter="?" />
|
||||||
<Typography Id="Small" Font="arial.ttf" Size="10" Bpp="4" IsVector="no" Direction="LTR" FallbackCharacter="?" />
|
<Typography Id="Small" Font="arial.ttf" Size="10" Bpp="4" IsVector="no" Direction="LTR" FallbackCharacter="?" />
|
||||||
</Typographies>
|
</Typographies>
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef OSCILLOPRESENTER_HPP
|
||||||
|
#define OSCILLOPRESENTER_HPP
|
||||||
|
|
||||||
|
#include <gui/model/ModelListener.hpp>
|
||||||
|
#include <mvp/Presenter.hpp>
|
||||||
|
|
||||||
|
using namespace touchgfx;
|
||||||
|
|
||||||
|
class OscilloView;
|
||||||
|
|
||||||
|
class OscilloPresenter : public touchgfx::Presenter, public ModelListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OscilloPresenter(OscilloView& v);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The activate function is called automatically when this screen is "switched in"
|
||||||
|
* (ie. made active). Initialization logic can be placed here.
|
||||||
|
*/
|
||||||
|
virtual void activate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The deactivate function is called automatically when this screen is "switched out"
|
||||||
|
* (ie. made inactive). Teardown functionality can be placed here.
|
||||||
|
*/
|
||||||
|
virtual void deactivate();
|
||||||
|
|
||||||
|
virtual ~OscilloPresenter() {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
OscilloPresenter();
|
||||||
|
|
||||||
|
OscilloView& view;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OSCILLOPRESENTER_HPP
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#ifndef OSCILLOVIEW_HPP
|
||||||
|
#define OSCILLOVIEW_HPP
|
||||||
|
|
||||||
|
#include <gui_generated/oscillo_screen/OscilloViewBase.hpp>
|
||||||
|
#include <gui/oscillo_screen/OscilloPresenter.hpp>
|
||||||
|
|
||||||
|
class OscilloView : public OscilloViewBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
OscilloView();
|
||||||
|
virtual ~OscilloView() {}
|
||||||
|
virtual void setupScreen();
|
||||||
|
virtual void tearDownScreen();
|
||||||
|
virtual void handleTickEvent();
|
||||||
|
|
||||||
|
virtual void toggleClicked();
|
||||||
|
protected:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OSCILLOVIEW_HPP
|
||||||
@@ -13,6 +13,7 @@ public:
|
|||||||
virtual void tearDownScreen();
|
virtual void tearDownScreen();
|
||||||
|
|
||||||
virtual void toggleAudioOnOFF();
|
virtual void toggleAudioOnOFF();
|
||||||
|
virtual void slider1Changed(int value);
|
||||||
protected:
|
protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#include <gui/oscillo_screen/OscilloView.hpp>
|
||||||
|
#include <gui/oscillo_screen/OscilloPresenter.hpp>
|
||||||
|
|
||||||
|
OscilloPresenter::OscilloPresenter(OscilloView& v)
|
||||||
|
: view(v)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OscilloPresenter::activate()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void OscilloPresenter::deactivate()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
#include <gui/oscillo_screen/OscilloView.hpp>
|
||||||
|
#include <audio_analysis.h>
|
||||||
|
#include <touchgfx/Unicode.hpp>
|
||||||
|
|
||||||
|
OscilloView::OscilloView()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void OscilloView::setupScreen()
|
||||||
|
{
|
||||||
|
OscilloViewBase::setupScreen();
|
||||||
|
toggleButton1.forceState(AudioAnalysis_IsEnabled());
|
||||||
|
|
||||||
|
/* Echelle du graphe en dB (affichage uniquement, pas une mesure calibree) :
|
||||||
|
* de -80dB (proche du plancher de bruit numerique) a +5dB de marge au-dessus
|
||||||
|
* du 0dB nominal. */
|
||||||
|
graph1.setGraphRangeY(-80.0f, 5.0f);
|
||||||
|
|
||||||
|
/* Axe X en Hz, de 0 a Fe/2 (24kHz) : ce graphe (statique, points X/Y explicites,
|
||||||
|
* contrairement au precedent DynamicGraph a increment X automatique) recoit
|
||||||
|
* directement la frequence de chaque bin avec addDataPoint(x, y). */
|
||||||
|
graph1.setGraphRangeX(0.0f, (float)AUDIO_ANALYSIS_SAMPLE_RATE_HZ / 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OscilloView::tearDownScreen()
|
||||||
|
{
|
||||||
|
OscilloViewBase::tearDownScreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OscilloView::handleTickEvent()
|
||||||
|
{
|
||||||
|
OscilloViewBase::handleTickEvent();
|
||||||
|
|
||||||
|
if (!AudioAnalysis_IsEnabled())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (AudioAnalysis_Update())
|
||||||
|
{
|
||||||
|
const float *magnitudesDb = AudioAnalysis_GetMagnitudesDb();
|
||||||
|
const float binHz = (float)AUDIO_ANALYSIS_SAMPLE_RATE_HZ / (float)AUDIO_ANALYSIS_FFT_SIZE;
|
||||||
|
|
||||||
|
graph1.clear();
|
||||||
|
for (int i = 0; i < (int)AUDIO_ANALYSIS_NUM_BINS; i++)
|
||||||
|
{
|
||||||
|
graph1.addDataPoint((float)i * binHz, magnitudesDb[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
touchgfx::Unicode::snprintf(textArea2Buffer, TEXTAREA2_SIZE, "%d", (int)AudioAnalysis_GetPeakFrequencyHz());
|
||||||
|
textArea2.setWildcard(textArea2Buffer);
|
||||||
|
textArea2.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OscilloView::toggleClicked()
|
||||||
|
{
|
||||||
|
AudioAnalysis_SetEnabled(toggleButton1.getState());
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ void OverviewView::setupScreen()
|
|||||||
{
|
{
|
||||||
OverviewViewBase::setupScreen();
|
OverviewViewBase::setupScreen();
|
||||||
toggleButton1.forceState(AudioEffects_GetParams()->audio_on_off);
|
toggleButton1.forceState(AudioEffects_GetParams()->audio_on_off);
|
||||||
|
slider1.setValue((int16_t)(AudioEffects_GetParams()->master_volume * 100.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
void OverviewView::tearDownScreen()
|
void OverviewView::tearDownScreen()
|
||||||
@@ -21,3 +22,15 @@ void OverviewView::toggleAudioOnOFF()
|
|||||||
{
|
{
|
||||||
AudioEffects_GetParams()->audio_on_off = toggleButton1.getState();
|
AudioEffects_GetParams()->audio_on_off = toggleButton1.getState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OverviewView::slider1Changed(int value)
|
||||||
|
{
|
||||||
|
AudioEffects_GetParams()->master_volume = value / 100.0f;
|
||||||
|
|
||||||
|
/* Le volume pilote l'etat marche/arret (0 = off, non nul = on), mais pas
|
||||||
|
* l'inverse : agir sur le toggle ne doit pas modifier le volume. */
|
||||||
|
bool en = (value != 0);
|
||||||
|
AudioEffects_GetParams()->audio_on_off = en;
|
||||||
|
toggleButton1.forceState(en);
|
||||||
|
toggleButton1.invalidate();
|
||||||
|
}
|
||||||
@@ -0,0 +1,539 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_common_tables.h
|
||||||
|
* Description: Extern declaration for common tables
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_COMMON_TABLES_H
|
||||||
|
#define _ARM_COMMON_TABLES_H
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "dsp/fast_math_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
/* Double Precision Float CFFT twiddles */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREV_1024)
|
||||||
|
extern const uint16_t armBitRevTable[1024];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_16)
|
||||||
|
extern const uint64_t twiddleCoefF64_16[32];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_32)
|
||||||
|
extern const uint64_t twiddleCoefF64_32[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_64)
|
||||||
|
extern const uint64_t twiddleCoefF64_64[128];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_128)
|
||||||
|
extern const uint64_t twiddleCoefF64_128[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_256)
|
||||||
|
extern const uint64_t twiddleCoefF64_256[512];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_512)
|
||||||
|
extern const uint64_t twiddleCoefF64_512[1024];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_1024)
|
||||||
|
extern const uint64_t twiddleCoefF64_1024[2048];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_2048)
|
||||||
|
extern const uint64_t twiddleCoefF64_2048[4096];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_4096)
|
||||||
|
extern const uint64_t twiddleCoefF64_4096[8192];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16)
|
||||||
|
extern const float32_t twiddleCoef_16[32];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_32)
|
||||||
|
extern const float32_t twiddleCoef_32[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64)
|
||||||
|
extern const float32_t twiddleCoef_64[128];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_128)
|
||||||
|
extern const float32_t twiddleCoef_128[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256)
|
||||||
|
extern const float32_t twiddleCoef_256[512];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_512)
|
||||||
|
extern const float32_t twiddleCoef_512[1024];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024)
|
||||||
|
extern const float32_t twiddleCoef_1024[2048];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048)
|
||||||
|
extern const float32_t twiddleCoef_2048[4096];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096)
|
||||||
|
extern const float32_t twiddleCoef_4096[8192];
|
||||||
|
#define twiddleCoef twiddleCoef_4096
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
/* Q31 */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16)
|
||||||
|
extern const q31_t twiddleCoef_16_q31[24];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32)
|
||||||
|
extern const q31_t twiddleCoef_32_q31[48];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64)
|
||||||
|
extern const q31_t twiddleCoef_64_q31[96];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128)
|
||||||
|
extern const q31_t twiddleCoef_128_q31[192];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256)
|
||||||
|
extern const q31_t twiddleCoef_256_q31[384];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512)
|
||||||
|
extern const q31_t twiddleCoef_512_q31[768];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024)
|
||||||
|
extern const q31_t twiddleCoef_1024_q31[1536];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048)
|
||||||
|
extern const q31_t twiddleCoef_2048_q31[3072];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096)
|
||||||
|
extern const q31_t twiddleCoef_4096_q31[6144];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16)
|
||||||
|
extern const q15_t twiddleCoef_16_q15[24];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32)
|
||||||
|
extern const q15_t twiddleCoef_32_q15[48];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64)
|
||||||
|
extern const q15_t twiddleCoef_64_q15[96];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128)
|
||||||
|
extern const q15_t twiddleCoef_128_q15[192];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256)
|
||||||
|
extern const q15_t twiddleCoef_256_q15[384];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512)
|
||||||
|
extern const q15_t twiddleCoef_512_q15[768];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024)
|
||||||
|
extern const q15_t twiddleCoef_1024_q15[1536];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048)
|
||||||
|
extern const q15_t twiddleCoef_2048_q15[3072];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096)
|
||||||
|
extern const q15_t twiddleCoef_4096_q15[6144];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
/* Double Precision Float RFFT twiddles */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_32)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_32[32];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_64)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_64[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_128)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_128[128];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_256)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_256[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_512)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_512[512];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_1024)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_1024[1024];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_2048)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_2048[2048];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_4096)
|
||||||
|
extern const uint64_t twiddleCoefF64_rfft_4096[4096];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32)
|
||||||
|
extern const float32_t twiddleCoef_rfft_32[32];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64)
|
||||||
|
extern const float32_t twiddleCoef_rfft_64[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128)
|
||||||
|
extern const float32_t twiddleCoef_rfft_128[128];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256)
|
||||||
|
extern const float32_t twiddleCoef_rfft_256[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512)
|
||||||
|
extern const float32_t twiddleCoef_rfft_512[512];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024)
|
||||||
|
extern const float32_t twiddleCoef_rfft_1024[1024];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048)
|
||||||
|
extern const float32_t twiddleCoef_rfft_2048[2048];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096)
|
||||||
|
extern const float32_t twiddleCoef_rfft_4096[4096];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
|
||||||
|
/* Double precision floating-point bit reversal tables */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_16)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH ((uint16_t)12)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_16[ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_32)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH ((uint16_t)24)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_32[ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_64)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH ((uint16_t)56)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_64[ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_128)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH ((uint16_t)112)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_128[ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_256)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH ((uint16_t)240)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_256[ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_512)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH ((uint16_t)480)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_512[ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_1024)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH ((uint16_t)992)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_1024[ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_2048)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH ((uint16_t)1984)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_2048[ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_4096)
|
||||||
|
#define ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH ((uint16_t)4032)
|
||||||
|
extern const uint16_t armBitRevIndexTableF64_4096[ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
/* floating-point bit reversal tables */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_16)
|
||||||
|
#define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20)
|
||||||
|
extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_32)
|
||||||
|
#define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48)
|
||||||
|
extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_64)
|
||||||
|
#define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56)
|
||||||
|
extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_128)
|
||||||
|
#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208)
|
||||||
|
extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_256)
|
||||||
|
#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440)
|
||||||
|
extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_512)
|
||||||
|
#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448)
|
||||||
|
extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_1024)
|
||||||
|
#define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800)
|
||||||
|
extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_2048)
|
||||||
|
#define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808)
|
||||||
|
extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_4096)
|
||||||
|
#define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032)
|
||||||
|
extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
|
||||||
|
/* fixed-point bit reversal tables */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096)
|
||||||
|
#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)
|
||||||
|
extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_F32)
|
||||||
|
extern const float32_t realCoefA[8192];
|
||||||
|
extern const float32_t realCoefB[8192];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q31)
|
||||||
|
extern const q31_t realCoefAQ31[8192];
|
||||||
|
extern const q31_t realCoefBQ31[8192];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q15)
|
||||||
|
extern const q15_t realCoefAQ15[8192];
|
||||||
|
extern const q15_t realCoefBQ15[8192];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128)
|
||||||
|
extern const float32_t Weights_128[256];
|
||||||
|
extern const float32_t cos_factors_128[128];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512)
|
||||||
|
extern const float32_t Weights_512[1024];
|
||||||
|
extern const float32_t cos_factors_512[512];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048)
|
||||||
|
extern const float32_t Weights_2048[4096];
|
||||||
|
extern const float32_t cos_factors_2048[2048];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192)
|
||||||
|
extern const float32_t Weights_8192[16384];
|
||||||
|
extern const float32_t cos_factors_8192[8192];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128)
|
||||||
|
extern const q15_t WeightsQ15_128[256];
|
||||||
|
extern const q15_t cos_factorsQ15_128[128];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512)
|
||||||
|
extern const q15_t WeightsQ15_512[1024];
|
||||||
|
extern const q15_t cos_factorsQ15_512[512];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048)
|
||||||
|
extern const q15_t WeightsQ15_2048[4096];
|
||||||
|
extern const q15_t cos_factorsQ15_2048[2048];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192)
|
||||||
|
extern const q15_t WeightsQ15_8192[16384];
|
||||||
|
extern const q15_t cos_factorsQ15_8192[8192];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128)
|
||||||
|
extern const q31_t WeightsQ31_128[256];
|
||||||
|
extern const q31_t cos_factorsQ31_128[128];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512)
|
||||||
|
extern const q31_t WeightsQ31_512[1024];
|
||||||
|
extern const q31_t cos_factorsQ31_512[512];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048)
|
||||||
|
extern const q31_t WeightsQ31_2048[4096];
|
||||||
|
extern const q31_t cos_factorsQ31_2048[2048];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192)
|
||||||
|
extern const q31_t WeightsQ31_8192[16384];
|
||||||
|
extern const q31_t cos_factorsQ31_8192[8192];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_ALLOW_TABLES)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q15)
|
||||||
|
extern const q15_t armRecipTableQ15[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q31)
|
||||||
|
extern const q31_t armRecipTableQ31[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
|
||||||
|
/* Tables for Fast Math Sine and Cosine */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_F32)
|
||||||
|
extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q31)
|
||||||
|
extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q15)
|
||||||
|
extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
|
||||||
|
/* Fast vector sqrt */
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q31_MVE)
|
||||||
|
extern const q31_t sqrtTable_Q31[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Accurate scalar sqrt */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SQRT_Q31)
|
||||||
|
extern const q31_t sqrt_initial_lut_q31[32];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SQRT_Q15)
|
||||||
|
extern const q15_t sqrt_initial_lut_q15[16];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q15_MVE)
|
||||||
|
extern const q15_t sqrtTable_Q15[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_TABLES) */
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
extern const float32_t exp_tab[8];
|
||||||
|
extern const float32_t __logf_lut_f32[8];
|
||||||
|
#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
extern const unsigned char hwLUT[256];
|
||||||
|
#endif /* (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARM_COMMON_TABLES_H */
|
||||||
|
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_common_tables_f16.h
|
||||||
|
* Description: Extern declaration for common tables
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_COMMON_TABLES_F16_H
|
||||||
|
#define _ARM_COMMON_TABLES_F16_H
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
|
||||||
|
/* F16 */
|
||||||
|
#if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_16)
|
||||||
|
extern const float16_t twiddleCoefF16_16[32];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_32)
|
||||||
|
extern const float16_t twiddleCoefF16_32[64];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_64)
|
||||||
|
extern const float16_t twiddleCoefF16_64[128];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_128)
|
||||||
|
extern const float16_t twiddleCoefF16_128[256];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_256)
|
||||||
|
extern const float16_t twiddleCoefF16_256[512];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_512)
|
||||||
|
extern const float16_t twiddleCoefF16_512[1024];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_1024)
|
||||||
|
extern const float16_t twiddleCoefF16_1024[2048];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_2048)
|
||||||
|
extern const float16_t twiddleCoefF16_2048[4096];
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_4096)
|
||||||
|
extern const float16_t twiddleCoefF16_4096[8192];
|
||||||
|
#define twiddleCoefF16 twiddleCoefF16_4096
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_32)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_32[32];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_64)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_64[64];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_128)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_128[128];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_256)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_256[256];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_512)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_512[512];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_1024)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_1024[1024];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_2048)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_2048[2048];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_4096)
|
||||||
|
extern const float16_t twiddleCoefF16_rfft_4096[4096];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARMAC5 */
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
|
||||||
|
|
||||||
|
#if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
extern const float16_t exp_tab_f16[8];
|
||||||
|
extern const float16_t __logf_lut_f16[8];
|
||||||
|
#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ARM_COMMON_TABLES_F16_H */
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_const_structs.h
|
||||||
|
* Description: Constant structs that are initialized for user convenience.
|
||||||
|
* For example, some can be given as arguments to the arm_cfft_f32() function.
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_CONST_STRUCTS_H
|
||||||
|
#define _ARM_CONST_STRUCTS_H
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len16;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len32;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len64;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len128;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len256;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len512;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len1024;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len2048;
|
||||||
|
extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len4096;
|
||||||
|
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;
|
||||||
|
extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;
|
||||||
|
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;
|
||||||
|
extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;
|
||||||
|
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;
|
||||||
|
extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_const_structs_f16.h
|
||||||
|
* Description: Constant structs that are initialized for user convenience.
|
||||||
|
* For example, some can be given as arguments to the arm_cfft_f16() function.
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_CONST_STRUCTS_F16_H
|
||||||
|
#define _ARM_CONST_STRUCTS_F16_H
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
#include "arm_common_tables_f16.h"
|
||||||
|
#include "dsp/transform_functions_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len16;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len32;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_64) && defined(ARM_TABLE_BITREVIDX_FLT_64))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len64;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_128) && defined(ARM_TABLE_BITREVIDX_FLT_128))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len128;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_256) && defined(ARM_TABLE_BITREVIDX_FLT_256))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len256;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_512) && defined(ARM_TABLE_BITREVIDX_FLT_512))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len512;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len1024;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len2048;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096))
|
||||||
|
extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len4096;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,753 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_helium_utils.h
|
||||||
|
* Description: Utility functions for Helium development
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_UTILS_HELIUM_H_
|
||||||
|
#define _ARM_UTILS_HELIUM_H_
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
/***************************************
|
||||||
|
|
||||||
|
Definitions available for MVEF and MVEI
|
||||||
|
|
||||||
|
***************************************/
|
||||||
|
#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#define INACTIVELANE 0 /* inactive lane content */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) */
|
||||||
|
|
||||||
|
/***************************************
|
||||||
|
|
||||||
|
Definitions available for MVEF only
|
||||||
|
|
||||||
|
***************************************/
|
||||||
|
#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
__STATIC_FORCEINLINE float32_t vecAddAcrossF32Mve(float32x4_t in)
|
||||||
|
{
|
||||||
|
float32_t acc;
|
||||||
|
|
||||||
|
acc = vgetq_lane(in, 0) + vgetq_lane(in, 1) +
|
||||||
|
vgetq_lane(in, 2) + vgetq_lane(in, 3);
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* newton initial guess */
|
||||||
|
#define INVSQRT_MAGIC_F32 0x5f3759df
|
||||||
|
#define INV_NEWTON_INIT_F32 0x7EF127EA
|
||||||
|
|
||||||
|
|
||||||
|
#define INVSQRT_NEWTON_MVE_F32(invSqrt, xHalf, xStart)\
|
||||||
|
{ \
|
||||||
|
float32x4_t tmp; \
|
||||||
|
\
|
||||||
|
/* tmp = xhalf * x * x */ \
|
||||||
|
tmp = vmulq(xStart, xStart); \
|
||||||
|
tmp = vmulq(tmp, xHalf); \
|
||||||
|
/* (1.5f - xhalf * x * x) */ \
|
||||||
|
tmp = vsubq(vdupq_n_f32(1.5f), tmp); \
|
||||||
|
/* x = x*(1.5f-xhalf*x*x); */ \
|
||||||
|
invSqrt = vmulq(tmp, xStart); \
|
||||||
|
}
|
||||||
|
#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) */
|
||||||
|
|
||||||
|
|
||||||
|
/***************************************
|
||||||
|
|
||||||
|
Definitions available for f16 datatype with HW acceleration only
|
||||||
|
|
||||||
|
***************************************/
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
#if defined (ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
__STATIC_FORCEINLINE float16_t vecAddAcrossF16Mve(float16x8_t in)
|
||||||
|
{
|
||||||
|
float16x8_t tmpVec;
|
||||||
|
_Float16 acc;
|
||||||
|
|
||||||
|
tmpVec = (float16x8_t) vrev32q_s16((int16x8_t) in);
|
||||||
|
in = vaddq_f16(tmpVec, in);
|
||||||
|
tmpVec = (float16x8_t) vrev64q_s32((int32x4_t) in);
|
||||||
|
in = vaddq_f16(tmpVec, in);
|
||||||
|
acc = (_Float16)vgetq_lane_f16(in, 0) + (_Float16)vgetq_lane_f16(in, 4);
|
||||||
|
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_FORCEINLINE float16x8_t __mve_cmplx_sum_intra_vec_f16(
|
||||||
|
float16x8_t vecIn)
|
||||||
|
{
|
||||||
|
float16x8_t vecTmp, vecOut;
|
||||||
|
uint32_t tmp;
|
||||||
|
|
||||||
|
vecTmp = (float16x8_t) vrev64q_s32((int32x4_t) vecIn);
|
||||||
|
// TO TRACK : using canonical addition leads to unefficient code generation for f16
|
||||||
|
// vecTmp = vecTmp + vecAccCpx0;
|
||||||
|
/*
|
||||||
|
* Compute
|
||||||
|
* re0+re1 | im0+im1 | re0+re1 | im0+im1
|
||||||
|
* re2+re3 | im2+im3 | re2+re3 | im2+im3
|
||||||
|
*/
|
||||||
|
vecTmp = vaddq_f16(vecTmp, vecIn);
|
||||||
|
vecOut = vecTmp;
|
||||||
|
/*
|
||||||
|
* shift left, random tmp insertion in bottom
|
||||||
|
*/
|
||||||
|
vecOut = vreinterpretq_f16_s32(vshlcq_s32(vreinterpretq_s32_f16(vecOut) , &tmp, 32));
|
||||||
|
/*
|
||||||
|
* Compute:
|
||||||
|
* DONTCARE | DONTCARE | re0+re1+re0+re1 |im0+im1+im0+im1
|
||||||
|
* re0+re1+re2+re3 | im0+im1+im2+im3 | re2+re3+re2+re3 |im2+im3+im2+im3
|
||||||
|
*/
|
||||||
|
vecOut = vaddq_f16(vecOut, vecTmp);
|
||||||
|
/*
|
||||||
|
* Cmplx sum is in 4rd & 5th f16 elt
|
||||||
|
* return full vector
|
||||||
|
*/
|
||||||
|
return vecOut;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define mve_cmplx_sum_intra_r_i_f16(vec, Re, Im) \
|
||||||
|
{ \
|
||||||
|
float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vec); \
|
||||||
|
Re = vgetq_lane(vecOut, 4); \
|
||||||
|
Im = vgetq_lane(vecOut, 5); \
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_FORCEINLINE void mve_cmplx_sum_intra_vec_f16(
|
||||||
|
float16x8_t vecIn,
|
||||||
|
float16_t *pOut)
|
||||||
|
{
|
||||||
|
float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vecIn);
|
||||||
|
/*
|
||||||
|
* Cmplx sum is in 4rd & 5th f16 elt
|
||||||
|
* use 32-bit extraction
|
||||||
|
*/
|
||||||
|
*(float32_t *) pOut = ((float32x4_t) vecOut)[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define INVSQRT_MAGIC_F16 0x59ba /* ( 0x1ba = 0x3759df >> 13) */
|
||||||
|
|
||||||
|
/* canonical version of INVSQRT_NEWTON_MVE_F16 leads to bad performance */
|
||||||
|
#define INVSQRT_NEWTON_MVE_F16(invSqrt, xHalf, xStart) \
|
||||||
|
{ \
|
||||||
|
float16x8_t tmp; \
|
||||||
|
\
|
||||||
|
/* tmp = xhalf * x * x */ \
|
||||||
|
tmp = vmulq(xStart, xStart); \
|
||||||
|
tmp = vmulq(tmp, xHalf); \
|
||||||
|
/* (1.5f - xhalf * x * x) */ \
|
||||||
|
tmp = vsubq(vdupq_n_f16((float16_t)1.5), tmp); \
|
||||||
|
/* x = x*(1.5f-xhalf*x*x); */ \
|
||||||
|
invSqrt = vmulq(tmp, xStart); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/***************************************
|
||||||
|
|
||||||
|
Definitions available for MVEI and MVEF only
|
||||||
|
|
||||||
|
***************************************/
|
||||||
|
#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
/* Following functions are used to transpose matrix in f32 and q31 cases */
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_32bit_2x2_mve(
|
||||||
|
uint32_t * pDataSrc,
|
||||||
|
uint32_t * pDataDest)
|
||||||
|
{
|
||||||
|
static const uint32x4_t vecOffs = { 0, 2, 1, 3 };
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* | 0 1 | => | 0 2 |
|
||||||
|
* | 2 3 | | 1 3 |
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
uint32x4_t vecIn = vldrwq_u32((uint32_t const *)pDataSrc);
|
||||||
|
vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs, vecIn);
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve(
|
||||||
|
uint32_t * pDataSrc,
|
||||||
|
uint32_t * pDataDest)
|
||||||
|
{
|
||||||
|
const uint32x4_t vecOffs1 = { 0, 3, 6, 1};
|
||||||
|
const uint32x4_t vecOffs2 = { 4, 7, 2, 5};
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* | 0 1 2 | | 0 3 6 | 4 x 32 flattened version | 0 3 6 1 |
|
||||||
|
* | 3 4 5 | => | 1 4 7 | => | 4 7 2 5 |
|
||||||
|
* | 6 7 8 | | 2 5 8 | (row major) | 8 . . . |
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
uint32x4_t vecIn1 = vldrwq_u32((uint32_t const *) pDataSrc);
|
||||||
|
uint32x4_t vecIn2 = vldrwq_u32((uint32_t const *) &pDataSrc[4]);
|
||||||
|
|
||||||
|
vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs1, vecIn1);
|
||||||
|
vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs2, vecIn2);
|
||||||
|
|
||||||
|
pDataDest[8] = pDataSrc[8];
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t * pDataSrc, uint32_t * pDataDest)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 4x4 Matrix transposition
|
||||||
|
* is 4 x de-interleave operation
|
||||||
|
*
|
||||||
|
* 0 1 2 3 0 4 8 12
|
||||||
|
* 4 5 6 7 1 5 9 13
|
||||||
|
* 8 9 10 11 2 6 10 14
|
||||||
|
* 12 13 14 15 3 7 11 15
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32x4x4_t vecIn;
|
||||||
|
|
||||||
|
vecIn = vld4q((uint32_t const *) pDataSrc);
|
||||||
|
vstrwq(pDataDest, vecIn.val[0]);
|
||||||
|
pDataDest += 4;
|
||||||
|
vstrwq(pDataDest, vecIn.val[1]);
|
||||||
|
pDataDest += 4;
|
||||||
|
vstrwq(pDataDest, vecIn.val[2]);
|
||||||
|
pDataDest += 4;
|
||||||
|
vstrwq(pDataDest, vecIn.val[3]);
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve(
|
||||||
|
uint16_t srcRows,
|
||||||
|
uint16_t srcCols,
|
||||||
|
uint32_t * pDataSrc,
|
||||||
|
uint32_t * pDataDest)
|
||||||
|
{
|
||||||
|
uint32x4_t vecOffs;
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t blkCnt;
|
||||||
|
uint32_t const *pDataC;
|
||||||
|
uint32_t *pDataDestR;
|
||||||
|
uint32x4_t vecIn;
|
||||||
|
|
||||||
|
vecOffs = vidupq_u32((uint32_t)0, 1);
|
||||||
|
vecOffs = vecOffs * srcCols;
|
||||||
|
|
||||||
|
i = srcCols;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pDataC = (uint32_t const *) pDataSrc;
|
||||||
|
pDataDestR = pDataDest;
|
||||||
|
|
||||||
|
blkCnt = srcRows >> 2;
|
||||||
|
while (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs);
|
||||||
|
vstrwq(pDataDestR, vecIn);
|
||||||
|
pDataDestR += 4;
|
||||||
|
pDataC = pDataC + srcCols * 4;
|
||||||
|
/*
|
||||||
|
* Decrement the blockSize loop counter
|
||||||
|
*/
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tail
|
||||||
|
*/
|
||||||
|
blkCnt = srcRows & 3;
|
||||||
|
if (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
mve_pred16_t p0 = vctp32q(blkCnt);
|
||||||
|
vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs);
|
||||||
|
vstrwq_p(pDataDestR, vecIn, p0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDataSrc += 1;
|
||||||
|
pDataDest += srcRows;
|
||||||
|
}
|
||||||
|
while (--i);
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_cmplx_trans_32bit(
|
||||||
|
uint16_t srcRows,
|
||||||
|
uint16_t srcCols,
|
||||||
|
uint32_t *pDataSrc,
|
||||||
|
uint16_t dstRows,
|
||||||
|
uint16_t dstCols,
|
||||||
|
uint32_t *pDataDest)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t const *pDataC;
|
||||||
|
uint32_t *pDataRow;
|
||||||
|
uint32_t *pDataDestR, *pDataDestRow;
|
||||||
|
uint32x4_t vecOffsRef, vecOffsCur;
|
||||||
|
uint32_t blkCnt;
|
||||||
|
uint32x4_t vecIn;
|
||||||
|
|
||||||
|
#ifdef ARM_MATH_MATRIX_CHECK
|
||||||
|
/*
|
||||||
|
* Check for matrix mismatch condition
|
||||||
|
*/
|
||||||
|
if ((srcRows != dstCols) || (srcCols != dstRows))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Set status as ARM_MATH_SIZE_MISMATCH
|
||||||
|
*/
|
||||||
|
return ARM_MATH_SIZE_MISMATCH;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void)dstRows;
|
||||||
|
(void)dstCols;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* 2x2, 3x3 and 4x4 specialization to be added */
|
||||||
|
|
||||||
|
vecOffsRef[0] = 0;
|
||||||
|
vecOffsRef[1] = 1;
|
||||||
|
vecOffsRef[2] = srcCols << 1;
|
||||||
|
vecOffsRef[3] = (srcCols << 1) + 1;
|
||||||
|
|
||||||
|
pDataRow = pDataSrc;
|
||||||
|
pDataDestRow = pDataDest;
|
||||||
|
i = srcCols;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pDataC = (uint32_t const *) pDataRow;
|
||||||
|
pDataDestR = pDataDestRow;
|
||||||
|
vecOffsCur = vecOffsRef;
|
||||||
|
|
||||||
|
blkCnt = (srcRows * CMPLX_DIM) >> 2;
|
||||||
|
while (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
vecIn = vldrwq_gather_shifted_offset(pDataC, vecOffsCur);
|
||||||
|
vstrwq(pDataDestR, vecIn);
|
||||||
|
pDataDestR += 4;
|
||||||
|
vecOffsCur = vaddq(vecOffsCur, (srcCols << 2));
|
||||||
|
/*
|
||||||
|
* Decrement the blockSize loop counter
|
||||||
|
*/
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* tail
|
||||||
|
* (will be merged thru tail predication)
|
||||||
|
*/
|
||||||
|
blkCnt = (srcRows * CMPLX_DIM) & 3;
|
||||||
|
if (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
mve_pred16_t p0 = vctp32q(blkCnt);
|
||||||
|
vecIn = vldrwq_gather_shifted_offset(pDataC, vecOffsCur);
|
||||||
|
vstrwq_p(pDataDestR, vecIn, p0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDataRow += CMPLX_DIM;
|
||||||
|
pDataDestRow += (srcRows * CMPLX_DIM);
|
||||||
|
}
|
||||||
|
while (--i);
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_16bit_2x2(uint16_t * pDataSrc, uint16_t * pDataDest)
|
||||||
|
{
|
||||||
|
pDataDest[0] = pDataSrc[0];
|
||||||
|
pDataDest[3] = pDataSrc[3];
|
||||||
|
pDataDest[2] = pDataSrc[1];
|
||||||
|
pDataDest[1] = pDataSrc[2];
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_16bit_3x3_mve(uint16_t * pDataSrc, uint16_t * pDataDest)
|
||||||
|
{
|
||||||
|
static const uint16_t stridesTr33[8] = { 0, 3, 6, 1, 4, 7, 2, 5 };
|
||||||
|
uint16x8_t vecOffs1;
|
||||||
|
uint16x8_t vecIn1;
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* | 0 1 2 | | 0 3 6 | 8 x 16 flattened version | 0 3 6 1 4 7 2 5 |
|
||||||
|
* | 3 4 5 | => | 1 4 7 | => | 8 . . . . . . . |
|
||||||
|
* | 6 7 8 | | 2 5 8 | (row major)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
vecOffs1 = vldrhq_u16((uint16_t const *) stridesTr33);
|
||||||
|
vecIn1 = vldrhq_u16((uint16_t const *) pDataSrc);
|
||||||
|
|
||||||
|
vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs1, vecIn1);
|
||||||
|
|
||||||
|
pDataDest[8] = pDataSrc[8];
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_16bit_4x4_mve(uint16_t * pDataSrc, uint16_t * pDataDest)
|
||||||
|
{
|
||||||
|
static const uint16_t stridesTr44_1[8] = { 0, 4, 8, 12, 1, 5, 9, 13 };
|
||||||
|
static const uint16_t stridesTr44_2[8] = { 2, 6, 10, 14, 3, 7, 11, 15 };
|
||||||
|
uint16x8_t vecOffs1, vecOffs2;
|
||||||
|
uint16x8_t vecIn1, vecIn2;
|
||||||
|
uint16_t const * pDataSrcVec = (uint16_t const *) pDataSrc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 4x4 Matrix transposition
|
||||||
|
*
|
||||||
|
* | 0 1 2 3 | | 0 4 8 12 | 8 x 16 flattened version
|
||||||
|
* | 4 5 6 7 | => | 1 5 9 13 | => [0 4 8 12 1 5 9 13]
|
||||||
|
* | 8 9 10 11 | | 2 6 10 14 | [2 6 10 14 3 7 11 15]
|
||||||
|
* | 12 13 14 15 | | 3 7 11 15 |
|
||||||
|
*/
|
||||||
|
|
||||||
|
vecOffs1 = vldrhq_u16((uint16_t const *) stridesTr44_1);
|
||||||
|
vecOffs2 = vldrhq_u16((uint16_t const *) stridesTr44_2);
|
||||||
|
vecIn1 = vldrhq_u16(pDataSrcVec);
|
||||||
|
pDataSrcVec += 8;
|
||||||
|
vecIn2 = vldrhq_u16(pDataSrcVec);
|
||||||
|
|
||||||
|
vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs1, vecIn1);
|
||||||
|
vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs2, vecIn2);
|
||||||
|
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_trans_16bit_generic(
|
||||||
|
uint16_t srcRows,
|
||||||
|
uint16_t srcCols,
|
||||||
|
uint16_t * pDataSrc,
|
||||||
|
uint16_t * pDataDest)
|
||||||
|
{
|
||||||
|
uint16x8_t vecOffs;
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t blkCnt;
|
||||||
|
uint16_t const *pDataC;
|
||||||
|
uint16_t *pDataDestR;
|
||||||
|
uint16x8_t vecIn;
|
||||||
|
|
||||||
|
vecOffs = vidupq_u16((uint32_t)0, 1);
|
||||||
|
vecOffs = vecOffs * srcCols;
|
||||||
|
|
||||||
|
i = srcCols;
|
||||||
|
while(i > 0U)
|
||||||
|
{
|
||||||
|
pDataC = (uint16_t const *) pDataSrc;
|
||||||
|
pDataDestR = pDataDest;
|
||||||
|
|
||||||
|
blkCnt = srcRows >> 3;
|
||||||
|
while (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
vecIn = vldrhq_gather_shifted_offset_u16(pDataC, vecOffs);
|
||||||
|
vstrhq_u16(pDataDestR, vecIn);
|
||||||
|
pDataDestR += 8;
|
||||||
|
pDataC = pDataC + srcCols * 8;
|
||||||
|
/*
|
||||||
|
* Decrement the blockSize loop counter
|
||||||
|
*/
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* tail
|
||||||
|
*/
|
||||||
|
blkCnt = srcRows & 7;
|
||||||
|
if (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
mve_pred16_t p0 = vctp16q(blkCnt);
|
||||||
|
vecIn = vldrhq_gather_shifted_offset_u16(pDataC, vecOffs);
|
||||||
|
vstrhq_p_u16(pDataDestR, vecIn, p0);
|
||||||
|
}
|
||||||
|
pDataSrc += 1;
|
||||||
|
pDataDest += srcRows;
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit(
|
||||||
|
uint16_t srcRows,
|
||||||
|
uint16_t srcCols,
|
||||||
|
uint16_t *pDataSrc,
|
||||||
|
uint16_t dstRows,
|
||||||
|
uint16_t dstCols,
|
||||||
|
uint16_t *pDataDest)
|
||||||
|
{
|
||||||
|
static const uint16_t loadCmplxCol[8] = { 0, 0, 1, 1, 2, 2, 3, 3 };
|
||||||
|
int i;
|
||||||
|
uint16x8_t vecOffsRef, vecOffsCur;
|
||||||
|
uint16_t const *pDataC;
|
||||||
|
uint16_t *pDataRow;
|
||||||
|
uint16_t *pDataDestR, *pDataDestRow;
|
||||||
|
uint32_t blkCnt;
|
||||||
|
uint16x8_t vecIn;
|
||||||
|
|
||||||
|
#ifdef ARM_MATH_MATRIX_CHECK
|
||||||
|
/*
|
||||||
|
* Check for matrix mismatch condition
|
||||||
|
*/
|
||||||
|
if ((srcRows != dstCols) || (srcCols != dstRows))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Set status as ARM_MATH_SIZE_MISMATCH
|
||||||
|
*/
|
||||||
|
return ARM_MATH_SIZE_MISMATCH;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void)dstRows;
|
||||||
|
(void)dstCols;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 2x2, 3x3 and 4x4 specialization to be added
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* build [0, 1, 2xcol, 2xcol+1, 4xcol, 4xcol+1, 6xcol, 6xcol+1]
|
||||||
|
*/
|
||||||
|
vecOffsRef = vldrhq_u16((uint16_t const *) loadCmplxCol);
|
||||||
|
vecOffsRef = vmulq(vecOffsRef, (uint16_t) (srcCols * CMPLX_DIM))
|
||||||
|
+ viwdupq_u16((uint32_t)0, (uint16_t) 2, 1);
|
||||||
|
|
||||||
|
pDataRow = pDataSrc;
|
||||||
|
pDataDestRow = pDataDest;
|
||||||
|
i = srcCols;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
pDataC = (uint16_t const *) pDataRow;
|
||||||
|
pDataDestR = pDataDestRow;
|
||||||
|
vecOffsCur = vecOffsRef;
|
||||||
|
|
||||||
|
blkCnt = (srcRows * CMPLX_DIM) >> 3;
|
||||||
|
while (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
vecIn = vldrhq_gather_shifted_offset(pDataC, vecOffsCur);
|
||||||
|
vstrhq(pDataDestR, vecIn);
|
||||||
|
pDataDestR+= 8; // VEC_LANES_U16
|
||||||
|
vecOffsCur = vaddq(vecOffsCur, (srcCols << 3));
|
||||||
|
/*
|
||||||
|
* Decrement the blockSize loop counter
|
||||||
|
*/
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* tail
|
||||||
|
* (will be merged thru tail predication)
|
||||||
|
*/
|
||||||
|
blkCnt = (srcRows * CMPLX_DIM) & 0x7;
|
||||||
|
if (blkCnt > 0U)
|
||||||
|
{
|
||||||
|
mve_pred16_t p0 = vctp16q(blkCnt);
|
||||||
|
vecIn = vldrhq_gather_shifted_offset(pDataC, vecOffsCur);
|
||||||
|
vstrhq_p(pDataDestR, vecIn, p0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pDataRow += CMPLX_DIM;
|
||||||
|
pDataDestRow += (srcRows * CMPLX_DIM);
|
||||||
|
}
|
||||||
|
while (--i);
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
#endif /* MVEF and MVEI */
|
||||||
|
|
||||||
|
/***************************************
|
||||||
|
|
||||||
|
Definitions available for MVEI only
|
||||||
|
|
||||||
|
***************************************/
|
||||||
|
#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
|
||||||
|
#define MVE_ASRL_SAT16(acc, shift) ((sqrshrl_sat48(acc, -(32-shift)) >> 32) & 0xffffffff)
|
||||||
|
#define MVE_ASRL_SAT32(acc, shift) ((sqrshrl(acc, -(32-shift)) >> 32) & 0xffffffff)
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q31_MVE)
|
||||||
|
__STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn)
|
||||||
|
{
|
||||||
|
q63x2_t vecTmpLL;
|
||||||
|
q31x4_t vecTmp0, vecTmp1;
|
||||||
|
q31_t scale;
|
||||||
|
q63_t tmp64;
|
||||||
|
q31x4_t vecNrm, vecDst, vecIdx, vecSignBits;
|
||||||
|
|
||||||
|
|
||||||
|
vecSignBits = vclsq(vecIn);
|
||||||
|
vecSignBits = vbicq_n_s32(vecSignBits, 1);
|
||||||
|
/*
|
||||||
|
* in = in << no_of_sign_bits;
|
||||||
|
*/
|
||||||
|
vecNrm = vshlq(vecIn, vecSignBits);
|
||||||
|
/*
|
||||||
|
* index = in >> 24;
|
||||||
|
*/
|
||||||
|
vecIdx = vecNrm >> 24;
|
||||||
|
vecIdx = vecIdx << 1;
|
||||||
|
|
||||||
|
vecTmp0 = vldrwq_gather_shifted_offset_s32(sqrtTable_Q31, (uint32x4_t)vecIdx);
|
||||||
|
|
||||||
|
vecIdx = vecIdx + 1;
|
||||||
|
|
||||||
|
vecTmp1 = vldrwq_gather_shifted_offset_s32(sqrtTable_Q31, (uint32x4_t)vecIdx);
|
||||||
|
|
||||||
|
vecTmp1 = vqrdmulhq(vecTmp1, vecNrm);
|
||||||
|
vecTmp0 = vecTmp0 - vecTmp1;
|
||||||
|
vecTmp1 = vqrdmulhq(vecTmp0, vecTmp0);
|
||||||
|
vecTmp1 = vqrdmulhq(vecNrm, vecTmp1);
|
||||||
|
vecTmp1 = vdupq_n_s32(0x18000000) - vecTmp1;
|
||||||
|
vecTmp0 = vqrdmulhq(vecTmp0, vecTmp1);
|
||||||
|
vecTmpLL = vmullbq_int(vecNrm, vecTmp0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* scale elements 0, 2
|
||||||
|
*/
|
||||||
|
scale = 26 + (vecSignBits[0] >> 1);
|
||||||
|
tmp64 = asrl(vecTmpLL[0], scale);
|
||||||
|
vecDst[0] = (q31_t) tmp64;
|
||||||
|
|
||||||
|
scale = 26 + (vecSignBits[2] >> 1);
|
||||||
|
tmp64 = asrl(vecTmpLL[1], scale);
|
||||||
|
vecDst[2] = (q31_t) tmp64;
|
||||||
|
|
||||||
|
vecTmpLL = vmulltq_int(vecNrm, vecTmp0);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* scale elements 1, 3
|
||||||
|
*/
|
||||||
|
scale = 26 + (vecSignBits[1] >> 1);
|
||||||
|
tmp64 = asrl(vecTmpLL[0], scale);
|
||||||
|
vecDst[1] = (q31_t) tmp64;
|
||||||
|
|
||||||
|
scale = 26 + (vecSignBits[3] >> 1);
|
||||||
|
tmp64 = asrl(vecTmpLL[1], scale);
|
||||||
|
vecDst[3] = (q31_t) tmp64;
|
||||||
|
/*
|
||||||
|
* set negative values to 0
|
||||||
|
*/
|
||||||
|
vecDst = vdupq_m(vecDst, 0, vcmpltq_n_s32(vecIn, 0));
|
||||||
|
|
||||||
|
return vecDst;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q15_MVE)
|
||||||
|
__STATIC_INLINE q15x8_t FAST_VSQRT_Q15(q15x8_t vecIn)
|
||||||
|
{
|
||||||
|
q31x4_t vecTmpLev, vecTmpLodd, vecSignL;
|
||||||
|
q15x8_t vecTmp0, vecTmp1;
|
||||||
|
q15x8_t vecNrm, vecDst, vecIdx, vecSignBits;
|
||||||
|
|
||||||
|
vecDst = vuninitializedq_s16();
|
||||||
|
|
||||||
|
vecSignBits = vclsq(vecIn);
|
||||||
|
vecSignBits = vbicq_n_s16(vecSignBits, 1);
|
||||||
|
/*
|
||||||
|
* in = in << no_of_sign_bits;
|
||||||
|
*/
|
||||||
|
vecNrm = vshlq(vecIn, vecSignBits);
|
||||||
|
|
||||||
|
vecIdx = vecNrm >> 8;
|
||||||
|
vecIdx = vecIdx << 1;
|
||||||
|
|
||||||
|
vecTmp0 = vldrhq_gather_shifted_offset_s16(sqrtTable_Q15, (uint16x8_t)vecIdx);
|
||||||
|
|
||||||
|
vecIdx = vecIdx + 1;
|
||||||
|
|
||||||
|
vecTmp1 = vldrhq_gather_shifted_offset_s16(sqrtTable_Q15, (uint16x8_t)vecIdx);
|
||||||
|
|
||||||
|
vecTmp1 = vqrdmulhq(vecTmp1, vecNrm);
|
||||||
|
vecTmp0 = vecTmp0 - vecTmp1;
|
||||||
|
vecTmp1 = vqrdmulhq(vecTmp0, vecTmp0);
|
||||||
|
vecTmp1 = vqrdmulhq(vecNrm, vecTmp1);
|
||||||
|
vecTmp1 = vdupq_n_s16(0x1800) - vecTmp1;
|
||||||
|
vecTmp0 = vqrdmulhq(vecTmp0, vecTmp1);
|
||||||
|
|
||||||
|
vecSignBits = vecSignBits >> 1;
|
||||||
|
|
||||||
|
vecTmpLev = vmullbq_int(vecNrm, vecTmp0);
|
||||||
|
vecTmpLodd = vmulltq_int(vecNrm, vecTmp0);
|
||||||
|
|
||||||
|
vecTmp0 = vecSignBits + 10;
|
||||||
|
/*
|
||||||
|
* negate sign to apply register based vshl
|
||||||
|
*/
|
||||||
|
vecTmp0 = -vecTmp0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* shift even elements
|
||||||
|
*/
|
||||||
|
vecSignL = vmovlbq(vecTmp0);
|
||||||
|
vecTmpLev = vshlq(vecTmpLev, vecSignL);
|
||||||
|
/*
|
||||||
|
* shift odd elements
|
||||||
|
*/
|
||||||
|
vecSignL = vmovltq(vecTmp0);
|
||||||
|
vecTmpLodd = vshlq(vecTmpLodd, vecSignL);
|
||||||
|
/*
|
||||||
|
* merge and narrow odd and even parts
|
||||||
|
*/
|
||||||
|
vecDst = vmovnbq_s32(vecDst, vecTmpLev);
|
||||||
|
vecDst = vmovntq_s32(vecDst, vecTmpLodd);
|
||||||
|
/*
|
||||||
|
* set negative values to 0
|
||||||
|
*/
|
||||||
|
vecDst = vdupq_m(vecDst, 0, vcmpltq_n_s16(vecIn, 0));
|
||||||
|
|
||||||
|
return vecDst;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI) */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,236 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_math.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\mainpage CMSIS DSP Software Library
|
||||||
|
*
|
||||||
|
* \section intro Introduction
|
||||||
|
*
|
||||||
|
* This user manual describes the CMSIS DSP software library,
|
||||||
|
* a suite of common signal processing functions for use on Cortex-M and Cortex-A processor
|
||||||
|
* based devices.
|
||||||
|
*
|
||||||
|
* The library is divided into a number of functions each covering a specific category:
|
||||||
|
* - Basic math functions
|
||||||
|
* - Fast math functions
|
||||||
|
* - Complex math functions
|
||||||
|
* - Filtering functions
|
||||||
|
* - Matrix functions
|
||||||
|
* - Transform functions
|
||||||
|
* - Motor control functions
|
||||||
|
* - Statistical functions
|
||||||
|
* - Support functions
|
||||||
|
* - Interpolation functions
|
||||||
|
* - Support Vector Machine functions (SVM)
|
||||||
|
* - Bayes classifier functions
|
||||||
|
* - Distance functions
|
||||||
|
* - Quaternion functions
|
||||||
|
*
|
||||||
|
* The library has generally separate functions for operating on 8-bit integers, 16-bit integers,
|
||||||
|
* 32-bit integer and 32-bit floating-point values.
|
||||||
|
*
|
||||||
|
* The library is providing vectorized versions of most algorthms for Helium
|
||||||
|
* and of most f32 algorithms for Neon.
|
||||||
|
*
|
||||||
|
* When using a vectorized version, provide a little bit of padding after the end of
|
||||||
|
* a buffer (3 words) because the vectorized code may read a little bit after the end
|
||||||
|
* of a buffer. You don't have to modify your buffers but just ensure that the
|
||||||
|
* end of buffer + padding is not outside of a memory region.
|
||||||
|
*
|
||||||
|
* \section using Using the Library
|
||||||
|
*
|
||||||
|
* The library is released in source form. It is strongly advised to compile the library using -Ofast to
|
||||||
|
* have the best performances.
|
||||||
|
*
|
||||||
|
* The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder.
|
||||||
|
* Simply include this file. If you don't want to include everything, you can also rely
|
||||||
|
* on headers in Include/dsp folder and use only what you need.
|
||||||
|
*
|
||||||
|
* \section example Examples
|
||||||
|
*
|
||||||
|
* The library ships with a number of examples which demonstrate how to use the library functions.
|
||||||
|
*
|
||||||
|
* \section toolchain Toolchain Support
|
||||||
|
*
|
||||||
|
* The library is now tested on Fast Models building with cmake.
|
||||||
|
* Core M0, M4, M7, M33, M55, A32 are tested.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \section preprocessor Preprocessor Macros
|
||||||
|
*
|
||||||
|
* Each library project have different preprocessor macros.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_BIG_ENDIAN:
|
||||||
|
*
|
||||||
|
* Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_MATRIX_CHECK:
|
||||||
|
*
|
||||||
|
* Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
|
||||||
|
*
|
||||||
|
* - ARM_MATH_ROUNDING:
|
||||||
|
*
|
||||||
|
* Define macro ARM_MATH_ROUNDING for rounding on support functions
|
||||||
|
*
|
||||||
|
* - ARM_MATH_LOOPUNROLL:
|
||||||
|
*
|
||||||
|
* Define macro ARM_MATH_LOOPUNROLL to enable manual loop unrolling in DSP functions
|
||||||
|
*
|
||||||
|
* - ARM_MATH_NEON:
|
||||||
|
*
|
||||||
|
* Define macro ARM_MATH_NEON to enable Neon versions of the DSP functions.
|
||||||
|
* It is not enabled by default when Neon is available because performances are
|
||||||
|
* dependent on the compiler and target architecture.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_NEON_EXPERIMENTAL:
|
||||||
|
*
|
||||||
|
* Define macro ARM_MATH_NEON_EXPERIMENTAL to enable experimental Neon versions of
|
||||||
|
* of some DSP functions. Experimental Neon versions currently do not have better
|
||||||
|
* performances than the scalar versions.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_HELIUM:
|
||||||
|
*
|
||||||
|
* It implies the flags ARM_MATH_MVEF and ARM_MATH_MVEI and ARM_MATH_MVE_FLOAT16.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_HELIUM_EXPERIMENTAL:
|
||||||
|
*
|
||||||
|
* Only taken into account when ARM_MATH_MVEF, ARM_MATH_MVEI or ARM_MATH_MVE_FLOAT16 are defined.
|
||||||
|
* Enable some vector versions which may have worse performance than scalar
|
||||||
|
* depending on the core / compiler configuration.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_MVEF:
|
||||||
|
*
|
||||||
|
* Select Helium versions of the f32 algorithms.
|
||||||
|
* It implies ARM_MATH_FLOAT16 and ARM_MATH_MVEI.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_MVEI:
|
||||||
|
*
|
||||||
|
* Select Helium versions of the int and fixed point algorithms.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_MVE_FLOAT16:
|
||||||
|
*
|
||||||
|
* MVE Float16 implementations of some algorithms (Requires MVE extension).
|
||||||
|
*
|
||||||
|
* - DISABLEFLOAT16:
|
||||||
|
*
|
||||||
|
* Disable float16 algorithms when __fp16 is not supported for a
|
||||||
|
* specific compiler / core configuration.
|
||||||
|
* This is only valid for scalar. When vector architecture is
|
||||||
|
* supporting f16 then it can't be disabled.
|
||||||
|
*
|
||||||
|
* - ARM_MATH_AUTOVECTORIZE:
|
||||||
|
*
|
||||||
|
* With Helium or Neon, disable the use of vectorized code with C intrinsics
|
||||||
|
* and use pure C instead. The vectorization is then done by the compiler.
|
||||||
|
*
|
||||||
|
* <hr>
|
||||||
|
* \section pack CMSIS-DSP in ARM::CMSIS Pack
|
||||||
|
*
|
||||||
|
* The following files relevant to CMSIS-DSP are present in the <b>ARM::CMSIS</b> Pack directories:
|
||||||
|
* |File/Folder |Content |
|
||||||
|
* |---------------------------------|------------------------------------------------------------------------|
|
||||||
|
* |\b CMSIS\\Documentation\\DSP | This documentation |
|
||||||
|
* |\b CMSIS\\DSP\\Examples | Example projects demonstrating the usage of the library functions |
|
||||||
|
* |\b CMSIS\\DSP\\Include | DSP_Lib include files for using and building the lib
|
||||||
|
* |\b CMSIS\\DSP\\PrivateInclude | DSP_Lib private include files for building the lib |
|
||||||
|
* |\b CMSIS\\DSP\\Lib | DSP_Lib binaries |
|
||||||
|
* |\b CMSIS\\DSP\\Source | DSP_Lib source files |
|
||||||
|
*
|
||||||
|
* <hr>
|
||||||
|
* \section rev Revision History of CMSIS-DSP
|
||||||
|
* Please refer to \ref ChangeLog_pg.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupExamples Examples
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _ARM_MATH_H
|
||||||
|
#define _ARM_MATH_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/basic_math_functions.h"
|
||||||
|
#include "dsp/interpolation_functions.h"
|
||||||
|
#include "dsp/bayes_functions.h"
|
||||||
|
#include "dsp/matrix_functions.h"
|
||||||
|
#include "dsp/complex_math_functions.h"
|
||||||
|
#include "dsp/statistics_functions.h"
|
||||||
|
#include "dsp/controller_functions.h"
|
||||||
|
#include "dsp/support_functions.h"
|
||||||
|
#include "dsp/distance_functions.h"
|
||||||
|
#include "dsp/svm_functions.h"
|
||||||
|
#include "dsp/fast_math_functions.h"
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
#include "dsp/filtering_functions.h"
|
||||||
|
#include "dsp/quaternion_math_functions.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//#define TABLE_SPACING_Q31 0x400000
|
||||||
|
//#define TABLE_SPACING_Q15 0x80
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _ARM_MATH_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* End of file.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_math_f16.h
|
||||||
|
* @brief Public header file for f16 function of the CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MATH_F16_H
|
||||||
|
#define _ARM_MATH_F16_H
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
#include "dsp/basic_math_functions_f16.h"
|
||||||
|
#include "dsp/interpolation_functions_f16.h"
|
||||||
|
#include "dsp/bayes_functions_f16.h"
|
||||||
|
#include "dsp/matrix_functions_f16.h"
|
||||||
|
#include "dsp/complex_math_functions_f16.h"
|
||||||
|
#include "dsp/statistics_functions_f16.h"
|
||||||
|
#include "dsp/controller_functions_f16.h"
|
||||||
|
#include "dsp/support_functions_f16.h"
|
||||||
|
#include "dsp/distance_functions_f16.h"
|
||||||
|
#include "dsp/svm_functions_f16.h"
|
||||||
|
#include "dsp/fast_math_functions_f16.h"
|
||||||
|
#include "dsp/transform_functions_f16.h"
|
||||||
|
#include "dsp/filtering_functions_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ARM_MATH_F16_H */
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_math_memory.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MATH_MEMORY_H_
|
||||||
|
|
||||||
|
#define _ARM_MATH_MEMORY_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief definition to read/write two 16 bit values.
|
||||||
|
@deprecated
|
||||||
|
*/
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#define __SIMD32_TYPE int32_t __packed
|
||||||
|
#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )
|
||||||
|
#define __SIMD32_TYPE int32_t
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#define __SIMD32_TYPE int32_t
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#define __SIMD32_TYPE int32_t __packed
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#define __SIMD32_TYPE int32_t
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#define __SIMD32_TYPE int32_t
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#define __SIMD32_TYPE __un(aligned) int32_t
|
||||||
|
#elif defined(_MSC_VER )
|
||||||
|
#define __SIMD32_TYPE int32_t
|
||||||
|
#else
|
||||||
|
#error Unknown compiler
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr))
|
||||||
|
#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr))
|
||||||
|
#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr))
|
||||||
|
#define __SIMD64(addr) (*( int64_t **) & (addr))
|
||||||
|
|
||||||
|
|
||||||
|
/* SIMD replacement */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read 2 Q15 from Q15 pointer.
|
||||||
|
@param[in] pQ15 points to input value
|
||||||
|
@return Q31 value
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q31_t read_q15x2 (
|
||||||
|
q15_t const * pQ15)
|
||||||
|
{
|
||||||
|
q31_t val;
|
||||||
|
|
||||||
|
#ifdef __ARM_FEATURE_UNALIGNED
|
||||||
|
memcpy (&val, pQ15, 4);
|
||||||
|
#else
|
||||||
|
val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF) ;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read 2 Q15 from Q15 pointer and increment pointer afterwards.
|
||||||
|
@param[in] pQ15 points to input value
|
||||||
|
@return Q31 value
|
||||||
|
*/
|
||||||
|
#define read_q15x2_ia(pQ15) read_q15x2((*(pQ15) += 2) - 2)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards.
|
||||||
|
@param[in] pQ15 points to input value
|
||||||
|
@return Q31 value
|
||||||
|
*/
|
||||||
|
#define read_q15x2_da(pQ15) read_q15x2((*(pQ15) -= 2) + 2)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Write 2 Q15 to Q15 pointer and increment pointer afterwards.
|
||||||
|
@param[in] pQ15 points to input value
|
||||||
|
@param[in] value Q31 value
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void write_q15x2_ia (
|
||||||
|
q15_t ** pQ15,
|
||||||
|
q31_t value)
|
||||||
|
{
|
||||||
|
q31_t val = value;
|
||||||
|
#ifdef __ARM_FEATURE_UNALIGNED
|
||||||
|
memcpy (*pQ15, &val, 4);
|
||||||
|
#else
|
||||||
|
(*pQ15)[0] = (q15_t)(val & 0x0FFFF);
|
||||||
|
(*pQ15)[1] = (q15_t)((val >> 16) & 0x0FFFF);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*pQ15 += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Write 2 Q15 to Q15 pointer.
|
||||||
|
@param[in] pQ15 points to input value
|
||||||
|
@param[in] value Q31 value
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void write_q15x2 (
|
||||||
|
q15_t * pQ15,
|
||||||
|
q31_t value)
|
||||||
|
{
|
||||||
|
q31_t val = value;
|
||||||
|
|
||||||
|
#ifdef __ARM_FEATURE_UNALIGNED
|
||||||
|
memcpy (pQ15, &val, 4);
|
||||||
|
#else
|
||||||
|
pQ15[0] = (q15_t)(val & 0x0FFFF);
|
||||||
|
pQ15[1] = (q15_t)(val >> 16);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read 4 Q7 from Q7 pointer
|
||||||
|
@param[in] pQ7 points to input value
|
||||||
|
@return Q31 value
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q31_t read_q7x4 (
|
||||||
|
q7_t const * pQ7)
|
||||||
|
{
|
||||||
|
q31_t val;
|
||||||
|
|
||||||
|
#ifdef __ARM_FEATURE_UNALIGNED
|
||||||
|
memcpy (&val, pQ7, 4);
|
||||||
|
#else
|
||||||
|
val =((pQ7[3] & 0x0FF) << 24) | ((pQ7[2] & 0x0FF) << 16) | ((pQ7[1] & 0x0FF) << 8) | (pQ7[0] & 0x0FF);
|
||||||
|
#endif
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read 4 Q7 from Q7 pointer and increment pointer afterwards.
|
||||||
|
@param[in] pQ7 points to input value
|
||||||
|
@return Q31 value
|
||||||
|
*/
|
||||||
|
#define read_q7x4_ia(pQ7) read_q7x4((*(pQ7) += 4) - 4)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards.
|
||||||
|
@param[in] pQ7 points to input value
|
||||||
|
@return Q31 value
|
||||||
|
*/
|
||||||
|
#define read_q7x4_da(pQ7) read_q7x4((*(pQ7) -= 4) + 4)
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Write 4 Q7 to Q7 pointer and increment pointer afterwards.
|
||||||
|
@param[in] pQ7 points to input value
|
||||||
|
@param[in] value Q31 value
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void write_q7x4_ia (
|
||||||
|
q7_t ** pQ7,
|
||||||
|
q31_t value)
|
||||||
|
{
|
||||||
|
q31_t val = value;
|
||||||
|
#ifdef __ARM_FEATURE_UNALIGNED
|
||||||
|
memcpy (*pQ7, &val, 4);
|
||||||
|
#else
|
||||||
|
(*pQ7)[0] = (q7_t)(val & 0x0FF);
|
||||||
|
(*pQ7)[1] = (q7_t)((val >> 8) & 0x0FF);
|
||||||
|
(*pQ7)[2] = (q7_t)((val >> 16) & 0x0FF);
|
||||||
|
(*pQ7)[3] = (q7_t)((val >> 24) & 0x0FF);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
*pQ7 += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*ifndef _ARM_MATH_MEMORY_H_ */
|
||||||
@@ -0,0 +1,616 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_math_types.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MATH_TYPES_H_
|
||||||
|
|
||||||
|
#define _ARM_MATH_TYPES_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Compiler specific diagnostic adjustment */
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
|
||||||
|
#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )
|
||||||
|
|
||||||
|
#elif defined ( __APPLE_CC__ )
|
||||||
|
#pragma GCC diagnostic ignored "-Wold-style-cast"
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wsign-conversion"
|
||||||
|
#pragma GCC diagnostic ignored "-Wconversion"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
|
||||||
|
#elif defined ( _MSC_VER )
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown compiler
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Included for instrinsics definitions */
|
||||||
|
#if defined (_MSC_VER )
|
||||||
|
#include <stdint.h>
|
||||||
|
#define __STATIC_FORCEINLINE static __forceinline
|
||||||
|
#define __STATIC_INLINE static __inline
|
||||||
|
#define __ALIGNED(x) __declspec(align(x))
|
||||||
|
#elif defined ( __APPLE_CC__ )
|
||||||
|
#include <stdint.h>
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
#elif defined (__GNUC_PYTHON__)
|
||||||
|
#include <stdint.h>
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
|
||||||
|
#define __STATIC_INLINE static inline
|
||||||
|
|
||||||
|
#else
|
||||||
|
#include "cmsis_compiler.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
/* evaluate ARM DSP feature */
|
||||||
|
#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))
|
||||||
|
#define ARM_MATH_DSP 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON)
|
||||||
|
#if defined(_MSC_VER) && defined(_M_ARM64EC)
|
||||||
|
#include <arm64_neon.h>
|
||||||
|
#else
|
||||||
|
#include <arm_neon.h>
|
||||||
|
#endif
|
||||||
|
#if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
|
||||||
|
#if !defined(ARM_MATH_NEON_FLOAT16)
|
||||||
|
#define ARM_MATH_NEON_FLOAT16
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARM_FEATURE_MVE)
|
||||||
|
#if __ARM_FEATURE_MVE
|
||||||
|
#if !defined(ARM_MATH_MVEI)
|
||||||
|
#define ARM_MATH_MVEI
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (__ARM_FEATURE_MVE & 2)
|
||||||
|
#if !defined(ARM_MATH_MVEF)
|
||||||
|
#define ARM_MATH_MVEF
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_MATH_MVE_FLOAT16)
|
||||||
|
#define ARM_MATH_MVE_FLOAT16
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*defined(__ARM_FEATURE_MVE)*/
|
||||||
|
#endif /*!defined(ARM_MATH_AUTOVECTORIZE)*/
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (ARM_MATH_HELIUM)
|
||||||
|
#if !defined(ARM_MATH_MVEF)
|
||||||
|
#define ARM_MATH_MVEF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_MATH_MVEI)
|
||||||
|
#define ARM_MATH_MVEI
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_MATH_MVE_FLOAT16)
|
||||||
|
#define ARM_MATH_MVE_FLOAT16
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
/* Enter low optimization region - place directly above function definition */
|
||||||
|
#if defined( __ARM_ARCH_7EM__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER \
|
||||||
|
_Pragma ("push") \
|
||||||
|
_Pragma ("O1")
|
||||||
|
#else
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Exit low optimization region - place directly after end of function definition */
|
||||||
|
#if defined ( __ARM_ARCH_7EM__ )
|
||||||
|
#define LOW_OPTIMIZATION_EXIT \
|
||||||
|
_Pragma ("pop")
|
||||||
|
#else
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Enter low optimization region - place directly above function definition */
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
|
||||||
|
/* Exit low optimization region - place directly after end of function definition */
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( __APPLE_CC__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER \
|
||||||
|
__attribute__(( optimize("-O1") ))
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
/* Enter low optimization region - place directly above function definition */
|
||||||
|
#if defined ( __ARM_ARCH_7EM__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER \
|
||||||
|
_Pragma ("optimize=low")
|
||||||
|
#else
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Exit low optimization region - place directly after end of function definition */
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
/* Enter low optimization region - place directly above function definition */
|
||||||
|
#if defined ( __ARM_ARCH_7EM__ )
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER \
|
||||||
|
_Pragma ("optimize=low")
|
||||||
|
#else
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Exit low optimization region - place directly after end of function definition */
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
|
||||||
|
#elif defined ( _MSC_VER ) || defined(__GNUC_PYTHON__)
|
||||||
|
#define LOW_OPTIMIZATION_ENTER
|
||||||
|
#define LOW_OPTIMIZATION_EXIT
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
|
||||||
|
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Compiler specific diagnostic adjustment */
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
|
||||||
|
#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )
|
||||||
|
|
||||||
|
#elif defined ( __APPLE_CC__ )
|
||||||
|
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
|
||||||
|
#elif defined ( _MSC_VER )
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown compiler
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE
|
||||||
|
#include <arm_mve.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional data type in 1.7 format.
|
||||||
|
*/
|
||||||
|
typedef int8_t q7_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional data type in 1.15 format.
|
||||||
|
*/
|
||||||
|
typedef int16_t q15_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional data type in 1.31 format.
|
||||||
|
*/
|
||||||
|
typedef int32_t q31_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 64-bit fractional data type in 1.63 format.
|
||||||
|
*/
|
||||||
|
typedef int64_t q63_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point type definition.
|
||||||
|
*/
|
||||||
|
#if !defined(__ICCARM__) || !(__ARM_FEATURE_MVE & 2)
|
||||||
|
typedef float float32_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 64-bit floating-point type definition.
|
||||||
|
*/
|
||||||
|
typedef double float64_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief vector types
|
||||||
|
*/
|
||||||
|
#if defined(ARM_MATH_NEON) || (defined (ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE))
|
||||||
|
/**
|
||||||
|
* @brief 64-bit fractional 128-bit vector data type in 1.63 format
|
||||||
|
*/
|
||||||
|
typedef int64x2_t q63x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 128-bit vector data type in 1.31 format.
|
||||||
|
*/
|
||||||
|
typedef int32x4_t q31x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 128-bit vector data type with 16-bit alignment in 1.15 format.
|
||||||
|
*/
|
||||||
|
typedef __ALIGNED(2) int16x8_t q15x8_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 128-bit vector data type with 8-bit alignment in 1.7 format.
|
||||||
|
*/
|
||||||
|
typedef __ALIGNED(1) int8x16_t q7x16_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 128-bit vector pair data type in 1.31 format.
|
||||||
|
*/
|
||||||
|
typedef int32x4x2_t q31x4x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 128-bit vector quadruplet data type in 1.31 format.
|
||||||
|
*/
|
||||||
|
typedef int32x4x4_t q31x4x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 128-bit vector pair data type in 1.15 format.
|
||||||
|
*/
|
||||||
|
typedef int16x8x2_t q15x8x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 128-bit vector quadruplet data type in 1.15 format.
|
||||||
|
*/
|
||||||
|
typedef int16x8x4_t q15x8x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 128-bit vector pair data type in 1.7 format.
|
||||||
|
*/
|
||||||
|
typedef int8x16x2_t q7x16x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 128-bit vector quadruplet data type in 1.7 format.
|
||||||
|
*/
|
||||||
|
typedef int8x16x4_t q7x16x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional data type in 9.23 format.
|
||||||
|
*/
|
||||||
|
typedef int32_t q23_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 128-bit vector data type in 9.23 format.
|
||||||
|
*/
|
||||||
|
typedef int32x4_t q23x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 64-bit status 128-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int64x2_t status64x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit status 128-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int32x4_t status32x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit status 128-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int16x8_t status16x8_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit status 128-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int8x16_t status8x16_t;
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 128-bit vector type
|
||||||
|
*/
|
||||||
|
typedef float32x4_t f32x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 128-bit vector pair data type
|
||||||
|
*/
|
||||||
|
typedef float32x4x2_t f32x4x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 128-bit vector quadruplet data type
|
||||||
|
*/
|
||||||
|
typedef float32x4x4_t f32x4x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit ubiquitous 128-bit vector data type
|
||||||
|
*/
|
||||||
|
typedef union _any32x4_t
|
||||||
|
{
|
||||||
|
float32x4_t f;
|
||||||
|
int32x4_t i;
|
||||||
|
} any32x4_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON)
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 64-bit vector data type in 1.31 format.
|
||||||
|
*/
|
||||||
|
typedef int32x2_t q31x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 64-bit vector data type in 1.15 format.
|
||||||
|
*/
|
||||||
|
typedef __ALIGNED(2) int16x4_t q15x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 64-bit vector data type in 1.7 format.
|
||||||
|
*/
|
||||||
|
typedef __ALIGNED(1) int8x8_t q7x8_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit float 64-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef float32x2_t f32x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 128-bit vector triplet data type
|
||||||
|
*/
|
||||||
|
typedef float32x4x3_t f32x4x3_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format
|
||||||
|
*/
|
||||||
|
typedef int32x4x3_t q31x4x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 128-bit vector triplet data type in 1.15 format
|
||||||
|
*/
|
||||||
|
typedef int16x8x3_t q15x8x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 128-bit vector triplet data type in 1.7 format
|
||||||
|
*/
|
||||||
|
typedef int8x16x3_t q7x16x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 64-bit vector pair data type
|
||||||
|
*/
|
||||||
|
typedef float32x2x2_t f32x2x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 64-bit vector triplet data type
|
||||||
|
*/
|
||||||
|
typedef float32x2x3_t f32x2x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit floating-point 64-bit vector quadruplet data type
|
||||||
|
*/
|
||||||
|
typedef float32x2x4_t f32x2x4_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 64-bit vector pair data type in 1.31 format
|
||||||
|
*/
|
||||||
|
typedef int32x2x2_t q31x2x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 64-bit vector triplet data type in 1.31 format
|
||||||
|
*/
|
||||||
|
typedef int32x2x3_t q31x2x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit fractional 64-bit vector quadruplet data type in 1.31 format
|
||||||
|
*/
|
||||||
|
typedef int32x4x3_t q31x2x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 64-bit vector pair data type in 1.15 format
|
||||||
|
*/
|
||||||
|
typedef int16x4x2_t q15x4x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 64-bit vector triplet data type in 1.15 format
|
||||||
|
*/
|
||||||
|
typedef int16x4x2_t q15x4x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit fractional 64-bit vector quadruplet data type in 1.15 format
|
||||||
|
*/
|
||||||
|
typedef int16x4x3_t q15x4x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 64-bit vector pair data type in 1.7 format
|
||||||
|
*/
|
||||||
|
typedef int8x8x2_t q7x8x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 64-bit vector triplet data type in 1.7 format
|
||||||
|
*/
|
||||||
|
typedef int8x8x3_t q7x8x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit fractional 64-bit vector quadruplet data type in 1.7 format
|
||||||
|
*/
|
||||||
|
typedef int8x8x4_t q7x8x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit ubiquitous 64-bit vector data type
|
||||||
|
*/
|
||||||
|
typedef union _any32x2_t
|
||||||
|
{
|
||||||
|
float32x2_t f;
|
||||||
|
int32x2_t i;
|
||||||
|
} any32x2_t;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 32-bit status 64-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int32x4_t status32x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit status 64-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int16x8_t status16x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 8-bit status 64-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef int8x16_t status8x8_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define F64_MAX ((float64_t)DBL_MAX)
|
||||||
|
#define F32_MAX ((float32_t)FLT_MAX)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define F64_MIN (-DBL_MAX)
|
||||||
|
#define F32_MIN (-FLT_MAX)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define F64_ABSMAX ((float64_t)DBL_MAX)
|
||||||
|
#define F32_ABSMAX ((float32_t)FLT_MAX)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define F64_ABSMIN ((float64_t)0.0)
|
||||||
|
#define F32_ABSMIN ((float32_t)0.0)
|
||||||
|
|
||||||
|
|
||||||
|
#define Q31_MAX ((q31_t)(0x7FFFFFFFL))
|
||||||
|
#define Q15_MAX ((q15_t)(0x7FFF))
|
||||||
|
#define Q7_MAX ((q7_t)(0x7F))
|
||||||
|
#define Q31_MIN ((q31_t)(0x80000000L))
|
||||||
|
#define Q15_MIN ((q15_t)(0x8000))
|
||||||
|
#define Q7_MIN ((q7_t)(0x80))
|
||||||
|
|
||||||
|
#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL))
|
||||||
|
#define Q15_ABSMAX ((q15_t)(0x7FFF))
|
||||||
|
#define Q7_ABSMAX ((q7_t)(0x7F))
|
||||||
|
#define Q31_ABSMIN ((q31_t)0)
|
||||||
|
#define Q15_ABSMIN ((q15_t)0)
|
||||||
|
#define Q7_ABSMIN ((q7_t)0)
|
||||||
|
|
||||||
|
/* Dimension C vector space */
|
||||||
|
#define CMPLX_DIM 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Error status returned by some functions in the library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ARM_MATH_SUCCESS = 0, /**< No error */
|
||||||
|
ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */
|
||||||
|
ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */
|
||||||
|
ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */
|
||||||
|
ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */
|
||||||
|
ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */
|
||||||
|
ARM_MATH_TEST_FAILURE = -6, /**< Test Failed */
|
||||||
|
ARM_MATH_DECOMPOSITION_FAILURE = -7 /**< Decomposition Failed */
|
||||||
|
} arm_status;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*ifndef _ARM_MATH_TYPES_H_ */
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_math_types_f16.h
|
||||||
|
* @brief Public header file for f16 function of the CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MATH_TYPES_F16_H
|
||||||
|
#define _ARM_MATH_TYPES_F16_H
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined( __CC_ARM )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point type definition.
|
||||||
|
* This is already defined in arm_mve.h
|
||||||
|
*
|
||||||
|
* This is not fully supported on ARM AC5.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Check if the type __fp16 is available.
|
||||||
|
If it is not available, f16 version of the kernels
|
||||||
|
won't be built.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#if !(__ARM_FEATURE_MVE & 2)
|
||||||
|
#if !defined(DISABLEFLOAT16)
|
||||||
|
#if defined(__ARM_FP16_FORMAT_IEEE) || defined(__ARM_FP16_FORMAT_ALTERNATIVE)
|
||||||
|
typedef __fp16 float16_t;
|
||||||
|
#define ARM_FLOAT16_SUPPORTED
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/* When Vector float16, this flag is always defined and can't be disabled */
|
||||||
|
#define ARM_FLOAT16_SUPPORTED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVE_FLOAT16) || defined(ARM_MATH_NEON_FLOAT16)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 128-bit vector data type
|
||||||
|
*/
|
||||||
|
typedef __ALIGNED(2) float16x8_t f16x8_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 128-bit vector pair data type
|
||||||
|
*/
|
||||||
|
typedef float16x8x2_t f16x8x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 128-bit vector quadruplet data type
|
||||||
|
*/
|
||||||
|
typedef float16x8x4_t f16x8x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit ubiquitous 128-bit vector data type
|
||||||
|
*/
|
||||||
|
typedef union _any16x8_t
|
||||||
|
{
|
||||||
|
float16x8_t f;
|
||||||
|
int16x8_t i;
|
||||||
|
} any16x8_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON)
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON_FLOAT16)
|
||||||
|
/**
|
||||||
|
* @brief 16-bit float 64-bit vector data type.
|
||||||
|
*/
|
||||||
|
typedef __ALIGNED(2) float16x4_t f16x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 128-bit vector triplet data type
|
||||||
|
*/
|
||||||
|
typedef float16x8x3_t f16x8x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 64-bit vector pair data type
|
||||||
|
*/
|
||||||
|
typedef float16x4x2_t f16x4x2_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 64-bit vector triplet data type
|
||||||
|
*/
|
||||||
|
typedef float16x4x3_t f16x4x3_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit floating-point 64-bit vector quadruplet data type
|
||||||
|
*/
|
||||||
|
typedef float16x4x4_t f16x4x4_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 16-bit ubiquitous 64-bit vector data type
|
||||||
|
*/
|
||||||
|
typedef union _any16x4_t
|
||||||
|
{
|
||||||
|
float16x4_t f;
|
||||||
|
int16x4_t i;
|
||||||
|
} any16x4_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
#if defined(__ICCARM__)
|
||||||
|
|
||||||
|
#define F16INFINITY ((float16_t) INFINITY)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define F16INFINITY ((float16_t)__builtin_inf())
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define F16_MAX ((float16_t)__FLT16_MAX__)
|
||||||
|
#define F16_MIN (-(_Float16)__FLT16_MAX__)
|
||||||
|
|
||||||
|
#define F16_ABSMAX ((float16_t)__FLT16_MAX__)
|
||||||
|
#define F16_ABSMIN ((float16_t)0.0f16)
|
||||||
|
|
||||||
|
#endif /* ARM_FLOAT16_SUPPORTED*/
|
||||||
|
#endif /* !defined( __CC_ARM ) */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ARM_MATH_F16_H */
|
||||||
@@ -0,0 +1,231 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_mve_tables.h
|
||||||
|
* Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
|
||||||
|
* used for MVE implementation only
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 04 October 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MVE_TABLES_H
|
||||||
|
#define _ARM_MVE_TABLES_H
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) || defined(ARM_TABLE_TWIDDLECOEF_F32_32)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_16_f32[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_16_f32[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_16_f32[2];
|
||||||
|
extern float32_t rearranged_twiddle_stride1_16_f32[8];
|
||||||
|
extern float32_t rearranged_twiddle_stride2_16_f32[8];
|
||||||
|
extern float32_t rearranged_twiddle_stride3_16_f32[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) || defined(ARM_TABLE_TWIDDLECOEF_F32_128)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_64_f32[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_64_f32[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_64_f32[3];
|
||||||
|
extern float32_t rearranged_twiddle_stride1_64_f32[40];
|
||||||
|
extern float32_t rearranged_twiddle_stride2_64_f32[40];
|
||||||
|
extern float32_t rearranged_twiddle_stride3_64_f32[40];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) || defined(ARM_TABLE_TWIDDLECOEF_F32_512)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_256_f32[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_256_f32[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_256_f32[4];
|
||||||
|
extern float32_t rearranged_twiddle_stride1_256_f32[168];
|
||||||
|
extern float32_t rearranged_twiddle_stride2_256_f32[168];
|
||||||
|
extern float32_t rearranged_twiddle_stride3_256_f32[168];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_1024_f32[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_1024_f32[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_1024_f32[5];
|
||||||
|
extern float32_t rearranged_twiddle_stride1_1024_f32[680];
|
||||||
|
extern float32_t rearranged_twiddle_stride2_1024_f32[680];
|
||||||
|
extern float32_t rearranged_twiddle_stride3_1024_f32[680];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) || defined(ARM_TABLE_TWIDDLECOEF_F32_8192)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_4096_f32[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_4096_f32[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_4096_f32[6];
|
||||||
|
extern float32_t rearranged_twiddle_stride1_4096_f32[2728];
|
||||||
|
extern float32_t rearranged_twiddle_stride2_4096_f32[2728];
|
||||||
|
extern float32_t rearranged_twiddle_stride3_4096_f32[2728];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
|
||||||
|
|
||||||
|
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_16_q31[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_16_q31[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_16_q31[2];
|
||||||
|
extern q31_t rearranged_twiddle_stride1_16_q31[8];
|
||||||
|
extern q31_t rearranged_twiddle_stride2_16_q31[8];
|
||||||
|
extern q31_t rearranged_twiddle_stride3_16_q31[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_64_q31[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_64_q31[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_64_q31[3];
|
||||||
|
extern q31_t rearranged_twiddle_stride1_64_q31[40];
|
||||||
|
extern q31_t rearranged_twiddle_stride2_64_q31[40];
|
||||||
|
extern q31_t rearranged_twiddle_stride3_64_q31[40];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_256_q31[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_256_q31[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_256_q31[4];
|
||||||
|
extern q31_t rearranged_twiddle_stride1_256_q31[168];
|
||||||
|
extern q31_t rearranged_twiddle_stride2_256_q31[168];
|
||||||
|
extern q31_t rearranged_twiddle_stride3_256_q31[168];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_1024_q31[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_1024_q31[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_1024_q31[5];
|
||||||
|
extern q31_t rearranged_twiddle_stride1_1024_q31[680];
|
||||||
|
extern q31_t rearranged_twiddle_stride2_1024_q31[680];
|
||||||
|
extern q31_t rearranged_twiddle_stride3_1024_q31[680];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) || defined(ARM_TABLE_TWIDDLECOEF_Q31_8192)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_4096_q31[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_4096_q31[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_4096_q31[6];
|
||||||
|
extern q31_t rearranged_twiddle_stride1_4096_q31[2728];
|
||||||
|
extern q31_t rearranged_twiddle_stride2_4096_q31[2728];
|
||||||
|
extern q31_t rearranged_twiddle_stride3_4096_q31[2728];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
|
||||||
|
|
||||||
|
#endif /* defined(ARM_MATH_MVEI) */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_16_q15[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_16_q15[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_16_q15[2];
|
||||||
|
extern q15_t rearranged_twiddle_stride1_16_q15[8];
|
||||||
|
extern q15_t rearranged_twiddle_stride2_16_q15[8];
|
||||||
|
extern q15_t rearranged_twiddle_stride3_16_q15[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_64_q15[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_64_q15[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_64_q15[3];
|
||||||
|
extern q15_t rearranged_twiddle_stride1_64_q15[40];
|
||||||
|
extern q15_t rearranged_twiddle_stride2_64_q15[40];
|
||||||
|
extern q15_t rearranged_twiddle_stride3_64_q15[40];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_256_q15[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_256_q15[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_256_q15[4];
|
||||||
|
extern q15_t rearranged_twiddle_stride1_256_q15[168];
|
||||||
|
extern q15_t rearranged_twiddle_stride2_256_q15[168];
|
||||||
|
extern q15_t rearranged_twiddle_stride3_256_q15[168];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_1024_q15[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_1024_q15[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_1024_q15[5];
|
||||||
|
extern q15_t rearranged_twiddle_stride1_1024_q15[680];
|
||||||
|
extern q15_t rearranged_twiddle_stride2_1024_q15[680];
|
||||||
|
extern q15_t rearranged_twiddle_stride3_1024_q15[680];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) || defined(ARM_TABLE_TWIDDLECOEF_Q15_8192)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_4096_q15[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_4096_q15[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_4096_q15[6];
|
||||||
|
extern q15_t rearranged_twiddle_stride1_4096_q15[2728];
|
||||||
|
extern q15_t rearranged_twiddle_stride2_4096_q15[2728];
|
||||||
|
extern q15_t rearranged_twiddle_stride3_4096_q15[2728];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
|
||||||
|
|
||||||
|
#endif /* defined(ARM_MATH_MVEI) */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_ARM_MVE_TABLES_H*/
|
||||||
|
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_mve_tables_f16.h
|
||||||
|
* Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc
|
||||||
|
* used for MVE implementation only
|
||||||
|
*
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 04 October 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MVE_TABLES_F16_H
|
||||||
|
#define _ARM_MVE_TABLES_F16_H
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_16) || defined(ARM_TABLE_TWIDDLECOEF_F16_32)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_16_f16[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_16_f16[2];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_16_f16[2];
|
||||||
|
extern float16_t rearranged_twiddle_stride1_16_f16[8];
|
||||||
|
extern float16_t rearranged_twiddle_stride2_16_f16[8];
|
||||||
|
extern float16_t rearranged_twiddle_stride3_16_f16[8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_64) || defined(ARM_TABLE_TWIDDLECOEF_F16_128)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_64_f16[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_64_f16[3];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_64_f16[3];
|
||||||
|
extern float16_t rearranged_twiddle_stride1_64_f16[40];
|
||||||
|
extern float16_t rearranged_twiddle_stride2_64_f16[40];
|
||||||
|
extern float16_t rearranged_twiddle_stride3_64_f16[40];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_256) || defined(ARM_TABLE_TWIDDLECOEF_F16_512)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_256_f16[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_256_f16[4];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_256_f16[4];
|
||||||
|
extern float16_t rearranged_twiddle_stride1_256_f16[168];
|
||||||
|
extern float16_t rearranged_twiddle_stride2_256_f16[168];
|
||||||
|
extern float16_t rearranged_twiddle_stride3_256_f16[168];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_1024) || defined(ARM_TABLE_TWIDDLECOEF_F16_2048)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_1024_f16[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_1024_f16[5];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_1024_f16[5];
|
||||||
|
extern float16_t rearranged_twiddle_stride1_1024_f16[680];
|
||||||
|
extern float16_t rearranged_twiddle_stride2_1024_f16[680];
|
||||||
|
extern float16_t rearranged_twiddle_stride3_1024_f16[680];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_4096) || defined(ARM_TABLE_TWIDDLECOEF_F16_8192)
|
||||||
|
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride1_arr_4096_f16[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride2_arr_4096_f16[6];
|
||||||
|
extern uint32_t rearranged_twiddle_tab_stride3_arr_4096_f16[6];
|
||||||
|
extern float16_t rearranged_twiddle_stride1_4096_f16[2728];
|
||||||
|
extern float16_t rearranged_twiddle_stride2_4096_f16[2728];
|
||||||
|
extern float16_t rearranged_twiddle_stride3_4096_f16[2728];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */
|
||||||
|
|
||||||
|
#endif /* defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*_ARM_MVE_TABLES_F16_H*/
|
||||||
|
|
||||||
@@ -0,0 +1,373 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_vec_math.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_VEC_MATH_H
|
||||||
|
#define _ARM_VEC_MATH_H
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
#include "arm_helium_utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#define INV_NEWTON_INIT_F32 0x7EF127EA
|
||||||
|
|
||||||
|
static const float32_t __logf_rng_f32=0.693147180f;
|
||||||
|
|
||||||
|
|
||||||
|
/* fast inverse approximation (3x newton) */
|
||||||
|
__STATIC_INLINE f32x4_t vrecip_medprec_f32(
|
||||||
|
f32x4_t x)
|
||||||
|
{
|
||||||
|
q31x4_t m;
|
||||||
|
f32x4_t b;
|
||||||
|
any32x4_t xinv;
|
||||||
|
f32x4_t ax = vabsq(x);
|
||||||
|
|
||||||
|
xinv.f = ax;
|
||||||
|
m = 0x3F800000 - (xinv.i & 0x7F800000);
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
xinv.f = 1.41176471f - 0.47058824f * xinv.f;
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
xinv.f = vdupq_m(xinv.f, INFINITY, vcmpeqq(x, 0.0f));
|
||||||
|
/*
|
||||||
|
* restore sign
|
||||||
|
*/
|
||||||
|
xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq(x, 0.0f));
|
||||||
|
|
||||||
|
return xinv.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fast inverse approximation (4x newton) */
|
||||||
|
__STATIC_INLINE f32x4_t vrecip_hiprec_f32(
|
||||||
|
f32x4_t x)
|
||||||
|
{
|
||||||
|
q31x4_t m;
|
||||||
|
f32x4_t b;
|
||||||
|
any32x4_t xinv;
|
||||||
|
f32x4_t ax = vabsq(x);
|
||||||
|
|
||||||
|
xinv.f = ax;
|
||||||
|
|
||||||
|
m = 0x3F800000 - (xinv.i & 0x7F800000);
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
xinv.f = 1.41176471f - 0.47058824f * xinv.f;
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
xinv.f = vdupq_m(xinv.f, INFINITY, vcmpeqq(x, 0.0f));
|
||||||
|
/*
|
||||||
|
* restore sign
|
||||||
|
*/
|
||||||
|
xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq(x, 0.0f));
|
||||||
|
|
||||||
|
return xinv.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vdiv_f32(
|
||||||
|
f32x4_t num, f32x4_t den)
|
||||||
|
{
|
||||||
|
return vmulq(num, vrecip_hiprec_f32(den));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Single-precision taylor dev.
|
||||||
|
@param[in] x f32 quad vector input
|
||||||
|
@param[in] coeffs f32 quad vector coeffs
|
||||||
|
@return destination f32 quad vector
|
||||||
|
*/
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vtaylor_polyq_f32(
|
||||||
|
f32x4_t x,
|
||||||
|
const float32_t * coeffs)
|
||||||
|
{
|
||||||
|
f32x4_t A = vfmasq(vdupq_n_f32(coeffs[4]), x, coeffs[0]);
|
||||||
|
f32x4_t B = vfmasq(vdupq_n_f32(coeffs[6]), x, coeffs[2]);
|
||||||
|
f32x4_t C = vfmasq(vdupq_n_f32(coeffs[5]), x, coeffs[1]);
|
||||||
|
f32x4_t D = vfmasq(vdupq_n_f32(coeffs[7]), x, coeffs[3]);
|
||||||
|
f32x4_t x2 = vmulq(x, x);
|
||||||
|
f32x4_t x4 = vmulq(x2, x2);
|
||||||
|
f32x4_t res = vfmaq(vfmaq_f32(A, B, x2), vfmaq_f32(C, D, x2), x4);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vmant_exp_f32(
|
||||||
|
f32x4_t x,
|
||||||
|
int32x4_t * e)
|
||||||
|
{
|
||||||
|
any32x4_t r;
|
||||||
|
int32x4_t n;
|
||||||
|
|
||||||
|
r.f = x;
|
||||||
|
n = r.i >> 23;
|
||||||
|
n = n - 127;
|
||||||
|
r.i = r.i - (n << 23);
|
||||||
|
|
||||||
|
*e = n;
|
||||||
|
return r.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vlogq_f32(f32x4_t vecIn)
|
||||||
|
{
|
||||||
|
q31x4_t vecExpUnBiased;
|
||||||
|
f32x4_t vecTmpFlt0, vecTmpFlt1;
|
||||||
|
f32x4_t vecAcc0, vecAcc1, vecAcc2, vecAcc3;
|
||||||
|
f32x4_t vecExpUnBiasedFlt;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* extract exponent
|
||||||
|
*/
|
||||||
|
vecTmpFlt1 = vmant_exp_f32(vecIn, &vecExpUnBiased);
|
||||||
|
|
||||||
|
vecTmpFlt0 = vecTmpFlt1 * vecTmpFlt1;
|
||||||
|
/*
|
||||||
|
* a = (__logf_lut_f32[4] * r.f) + (__logf_lut_f32[0]);
|
||||||
|
*/
|
||||||
|
vecAcc0 = vdupq_n_f32(__logf_lut_f32[0]);
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecTmpFlt1, __logf_lut_f32[4]);
|
||||||
|
/*
|
||||||
|
* b = (__logf_lut_f32[6] * r.f) + (__logf_lut_f32[2]);
|
||||||
|
*/
|
||||||
|
vecAcc1 = vdupq_n_f32(__logf_lut_f32[2]);
|
||||||
|
vecAcc1 = vfmaq(vecAcc1, vecTmpFlt1, __logf_lut_f32[6]);
|
||||||
|
/*
|
||||||
|
* c = (__logf_lut_f32[5] * r.f) + (__logf_lut_f32[1]);
|
||||||
|
*/
|
||||||
|
vecAcc2 = vdupq_n_f32(__logf_lut_f32[1]);
|
||||||
|
vecAcc2 = vfmaq(vecAcc2, vecTmpFlt1, __logf_lut_f32[5]);
|
||||||
|
/*
|
||||||
|
* d = (__logf_lut_f32[7] * r.f) + (__logf_lut_f32[3]);
|
||||||
|
*/
|
||||||
|
vecAcc3 = vdupq_n_f32(__logf_lut_f32[3]);
|
||||||
|
vecAcc3 = vfmaq(vecAcc3, vecTmpFlt1, __logf_lut_f32[7]);
|
||||||
|
/*
|
||||||
|
* a = a + b * xx;
|
||||||
|
*/
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecAcc1, vecTmpFlt0);
|
||||||
|
/*
|
||||||
|
* c = c + d * xx;
|
||||||
|
*/
|
||||||
|
vecAcc2 = vfmaq(vecAcc2, vecAcc3, vecTmpFlt0);
|
||||||
|
/*
|
||||||
|
* xx = xx * xx;
|
||||||
|
*/
|
||||||
|
vecTmpFlt0 = vecTmpFlt0 * vecTmpFlt0;
|
||||||
|
vecExpUnBiasedFlt = vcvtq_f32_s32(vecExpUnBiased);
|
||||||
|
/*
|
||||||
|
* r.f = a + c * xx;
|
||||||
|
*/
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecAcc2, vecTmpFlt0);
|
||||||
|
/*
|
||||||
|
* add exponent
|
||||||
|
* r.f = r.f + ((float32_t) m) * __logf_rng_f32;
|
||||||
|
*/
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecExpUnBiasedFlt, __logf_rng_f32);
|
||||||
|
// set log0 down to -inf
|
||||||
|
vecAcc0 = vdupq_m(vecAcc0, -INFINITY, vcmpeqq(vecIn, 0.0f));
|
||||||
|
return vecAcc0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vexpq_f32(
|
||||||
|
f32x4_t x)
|
||||||
|
{
|
||||||
|
// Perform range reduction [-log(2),log(2)]
|
||||||
|
int32x4_t m = vcvtq_s32_f32(vmulq_n_f32(x, 1.4426950408f));
|
||||||
|
f32x4_t val = vfmsq_f32(x, vcvtq_f32_s32(m), vdupq_n_f32(0.6931471805f));
|
||||||
|
|
||||||
|
// Polynomial Approximation
|
||||||
|
f32x4_t poly = vtaylor_polyq_f32(val, exp_tab);
|
||||||
|
|
||||||
|
// Reconstruct
|
||||||
|
poly = (f32x4_t) (vqaddq_s32((q31x4_t) (poly), vqshlq_n_s32(m, 23)));
|
||||||
|
|
||||||
|
poly = vdupq_m(poly, 0.0f, vcmpltq_n_s32(m, -126));
|
||||||
|
return poly;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t arm_vec_exponent_f32(f32x4_t x, int32_t nb)
|
||||||
|
{
|
||||||
|
f32x4_t r = x;
|
||||||
|
nb--;
|
||||||
|
while (nb > 0) {
|
||||||
|
r = vmulq(r, x);
|
||||||
|
nb--;
|
||||||
|
}
|
||||||
|
return (r);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vrecip_f32(f32x4_t vecIn)
|
||||||
|
{
|
||||||
|
f32x4_t vecSx, vecW, vecTmp;
|
||||||
|
any32x4_t v;
|
||||||
|
|
||||||
|
vecSx = vabsq(vecIn);
|
||||||
|
|
||||||
|
v.f = vecIn;
|
||||||
|
v.i = vsubq(vdupq_n_s32(INV_NEWTON_INIT_F32), v.i);
|
||||||
|
|
||||||
|
vecW = vmulq(vecSx, v.f);
|
||||||
|
|
||||||
|
// v.f = v.f * (8 + w * (-28 + w * (56 + w * (-70 + w *(56 + w * (-28 + w * (8 - w)))))));
|
||||||
|
vecTmp = vsubq(vdupq_n_f32(8.0f), vecW);
|
||||||
|
vecTmp = vfmasq(vecW, vecTmp, -28.0f);
|
||||||
|
vecTmp = vfmasq(vecW, vecTmp, 56.0f);
|
||||||
|
vecTmp = vfmasq(vecW, vecTmp, -70.0f);
|
||||||
|
vecTmp = vfmasq(vecW, vecTmp, 56.0f);
|
||||||
|
vecTmp = vfmasq(vecW, vecTmp, -28.0f);
|
||||||
|
vecTmp = vfmasq(vecW, vecTmp, 8.0f);
|
||||||
|
v.f = vmulq(v.f, vecTmp);
|
||||||
|
|
||||||
|
v.f = vdupq_m(v.f, INFINITY, vcmpeqq(vecIn, 0.0f));
|
||||||
|
/*
|
||||||
|
* restore sign
|
||||||
|
*/
|
||||||
|
v.f = vnegq_m(v.f, v.f, vcmpltq(vecIn, 0.0f));
|
||||||
|
return v.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vtanhq_f32(
|
||||||
|
f32x4_t val)
|
||||||
|
{
|
||||||
|
f32x4_t x =
|
||||||
|
vminnmq_f32(vmaxnmq_f32(val, vdupq_n_f32(-10.f)), vdupq_n_f32(10.0f));
|
||||||
|
f32x4_t exp2x = vexpq_f32(vmulq_n_f32(x, 2.f));
|
||||||
|
f32x4_t num = vsubq_n_f32(exp2x, 1.f);
|
||||||
|
f32x4_t den = vaddq_n_f32(exp2x, 1.f);
|
||||||
|
f32x4_t tanh = vmulq_f32(num, vrecip_f32(den));
|
||||||
|
return tanh;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f32x4_t vpowq_f32(
|
||||||
|
f32x4_t val,
|
||||||
|
f32x4_t n)
|
||||||
|
{
|
||||||
|
return vexpq_f32(vmulq_f32(n, vlogq_f32(val)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)*/
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
#endif /* (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) */
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#include "NEMath.h"
|
||||||
|
/**
|
||||||
|
* @brief Vectorized integer exponentiation
|
||||||
|
* @param[in] x value
|
||||||
|
* @param[in] nb integer exponent >= 1
|
||||||
|
* @return x^nb
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE float32x4_t arm_vec_exponent_f32(float32x4_t x, int32_t nb)
|
||||||
|
{
|
||||||
|
float32x4_t r = x;
|
||||||
|
nb --;
|
||||||
|
while(nb > 0)
|
||||||
|
{
|
||||||
|
r = vmulq_f32(r , x);
|
||||||
|
nb--;
|
||||||
|
}
|
||||||
|
return(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
__STATIC_INLINE float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x)
|
||||||
|
{
|
||||||
|
float32x4_t x1 = vmaxq_f32(x, vdupq_n_f32(FLT_MIN));
|
||||||
|
float32x4_t e = vrsqrteq_f32(x1);
|
||||||
|
e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e);
|
||||||
|
e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e);
|
||||||
|
return vmulq_f32(x, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE int16x8_t __arm_vec_sqrt_q15_neon(int16x8_t vec)
|
||||||
|
{
|
||||||
|
float32x4_t tempF;
|
||||||
|
int32x4_t tempHI,tempLO;
|
||||||
|
|
||||||
|
tempLO = vmovl_s16(vget_low_s16(vec));
|
||||||
|
tempF = vcvtq_n_f32_s32(tempLO,15);
|
||||||
|
tempF = __arm_vec_sqrt_f32_neon(tempF);
|
||||||
|
tempLO = vcvtq_n_s32_f32(tempF,15);
|
||||||
|
|
||||||
|
tempHI = vmovl_s16(vget_high_s16(vec));
|
||||||
|
tempF = vcvtq_n_f32_s32(tempHI,15);
|
||||||
|
tempF = __arm_vec_sqrt_f32_neon(tempF);
|
||||||
|
tempHI = vcvtq_n_s32_f32(tempF,15);
|
||||||
|
|
||||||
|
return(vcombine_s16(vqmovn_s32(tempLO),vqmovn_s32(tempHI)));
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE int32x4_t __arm_vec_sqrt_q31_neon(int32x4_t vec)
|
||||||
|
{
|
||||||
|
float32x4_t temp;
|
||||||
|
|
||||||
|
temp = vcvtq_n_f32_s32(vec,31);
|
||||||
|
temp = __arm_vec_sqrt_f32_neon(temp);
|
||||||
|
return(vcvtq_n_s32_f32(temp,31));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _ARM_VEC_MATH_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* End of file.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,312 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_vec_math_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_VEC_MATH_F16_H
|
||||||
|
#define _ARM_VEC_MATH_F16_H
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_common_tables_f16.h"
|
||||||
|
#include "arm_helium_utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
|
||||||
|
static const float16_t __logf_rng_f16=0.693147180f16;
|
||||||
|
|
||||||
|
/* fast inverse approximation (3x newton) */
|
||||||
|
__STATIC_INLINE f16x8_t vrecip_medprec_f16(
|
||||||
|
f16x8_t x)
|
||||||
|
{
|
||||||
|
q15x8_t m;
|
||||||
|
f16x8_t b;
|
||||||
|
any16x8_t xinv;
|
||||||
|
f16x8_t ax = vabsq(x);
|
||||||
|
|
||||||
|
xinv.f = ax;
|
||||||
|
|
||||||
|
m = 0x03c00 - (xinv.i & 0x07c00);
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
xinv.f = 1.41176471f16 - 0.47058824f16 * xinv.f;
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
xinv.f = vdupq_m_n_f16(xinv.f, F16INFINITY, vcmpeqq_n_f16(x, 0.0f));
|
||||||
|
/*
|
||||||
|
* restore sign
|
||||||
|
*/
|
||||||
|
xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq_n_f16(x, 0.0f));
|
||||||
|
|
||||||
|
return xinv.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* fast inverse approximation (4x newton) */
|
||||||
|
__STATIC_INLINE f16x8_t vrecip_hiprec_f16(
|
||||||
|
f16x8_t x)
|
||||||
|
{
|
||||||
|
q15x8_t m;
|
||||||
|
f16x8_t b;
|
||||||
|
any16x8_t xinv;
|
||||||
|
f16x8_t ax = vabsq(x);
|
||||||
|
|
||||||
|
xinv.f = ax;
|
||||||
|
|
||||||
|
m = 0x03c00 - (xinv.i & 0x07c00);
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
xinv.f = 1.41176471f16 - 0.47058824f16 * xinv.f;
|
||||||
|
xinv.i = xinv.i + m;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
b = 2.0f16 - xinv.f * ax;
|
||||||
|
xinv.f = xinv.f * b;
|
||||||
|
|
||||||
|
xinv.f = vdupq_m_n_f16(xinv.f, F16INFINITY, vcmpeqq_n_f16(x, 0.0f));
|
||||||
|
/*
|
||||||
|
* restore sign
|
||||||
|
*/
|
||||||
|
xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq_n_f16(x, 0.0f));
|
||||||
|
|
||||||
|
return xinv.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f16x8_t vdiv_f16(
|
||||||
|
f16x8_t num, f16x8_t den)
|
||||||
|
{
|
||||||
|
return vmulq(num, vrecip_hiprec_f16(den));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Single-precision taylor dev.
|
||||||
|
@param[in] x f16 vector input
|
||||||
|
@param[in] coeffs f16 vector coeffs
|
||||||
|
@return destination f16 vector
|
||||||
|
*/
|
||||||
|
|
||||||
|
__STATIC_INLINE float16x8_t vtaylor_polyq_f16(
|
||||||
|
float16x8_t x,
|
||||||
|
const float16_t * coeffs)
|
||||||
|
{
|
||||||
|
float16x8_t A = vfmasq(vdupq_n_f16(coeffs[4]), x, coeffs[0]);
|
||||||
|
float16x8_t B = vfmasq(vdupq_n_f16(coeffs[6]), x, coeffs[2]);
|
||||||
|
float16x8_t C = vfmasq(vdupq_n_f16(coeffs[5]), x, coeffs[1]);
|
||||||
|
float16x8_t D = vfmasq(vdupq_n_f16(coeffs[7]), x, coeffs[3]);
|
||||||
|
float16x8_t x2 = vmulq(x, x);
|
||||||
|
float16x8_t x4 = vmulq(x2, x2);
|
||||||
|
float16x8_t res = vfmaq(vfmaq_f16(A, B, x2), vfmaq_f16(C, D, x2), x4);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define VMANT_EXP_F16(x) \
|
||||||
|
any16x8_t r; \
|
||||||
|
int16x8_t n; \
|
||||||
|
\
|
||||||
|
r.f = x; \
|
||||||
|
n = r.i >> 10; \
|
||||||
|
n = n - 15; \
|
||||||
|
r.i = r.i - (n << 10);\
|
||||||
|
\
|
||||||
|
vecExpUnBiased = n; \
|
||||||
|
vecTmpFlt1 = r.f;
|
||||||
|
|
||||||
|
__STATIC_INLINE float16x8_t vlogq_f16(float16x8_t vecIn)
|
||||||
|
{
|
||||||
|
q15x8_t vecExpUnBiased;
|
||||||
|
float16x8_t vecTmpFlt0, vecTmpFlt1;
|
||||||
|
float16x8_t vecAcc0, vecAcc1, vecAcc2, vecAcc3;
|
||||||
|
float16x8_t vecExpUnBiasedFlt;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* extract exponent
|
||||||
|
*/
|
||||||
|
VMANT_EXP_F16(vecIn);
|
||||||
|
|
||||||
|
vecTmpFlt0 = vecTmpFlt1 * vecTmpFlt1;
|
||||||
|
/*
|
||||||
|
* a = (__logf_lut_f16[4] * r.f) + (__logf_lut_f16[0]);
|
||||||
|
*/
|
||||||
|
vecAcc0 = vdupq_n_f16(__logf_lut_f16[0]);
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecTmpFlt1, __logf_lut_f16[4]);
|
||||||
|
/*
|
||||||
|
* b = (__logf_lut_f16[6] * r.f) + (__logf_lut_f16[2]);
|
||||||
|
*/
|
||||||
|
vecAcc1 = vdupq_n_f16(__logf_lut_f16[2]);
|
||||||
|
vecAcc1 = vfmaq(vecAcc1, vecTmpFlt1, __logf_lut_f16[6]);
|
||||||
|
/*
|
||||||
|
* c = (__logf_lut_f16[5] * r.f) + (__logf_lut_f16[1]);
|
||||||
|
*/
|
||||||
|
vecAcc2 = vdupq_n_f16(__logf_lut_f16[1]);
|
||||||
|
vecAcc2 = vfmaq(vecAcc2, vecTmpFlt1, __logf_lut_f16[5]);
|
||||||
|
/*
|
||||||
|
* d = (__logf_lut_f16[7] * r.f) + (__logf_lut_f16[3]);
|
||||||
|
*/
|
||||||
|
vecAcc3 = vdupq_n_f16(__logf_lut_f16[3]);
|
||||||
|
vecAcc3 = vfmaq(vecAcc3, vecTmpFlt1, __logf_lut_f16[7]);
|
||||||
|
/*
|
||||||
|
* a = a + b * xx;
|
||||||
|
*/
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecAcc1, vecTmpFlt0);
|
||||||
|
/*
|
||||||
|
* c = c + d * xx;
|
||||||
|
*/
|
||||||
|
vecAcc2 = vfmaq(vecAcc2, vecAcc3, vecTmpFlt0);
|
||||||
|
/*
|
||||||
|
* xx = xx * xx;
|
||||||
|
*/
|
||||||
|
vecTmpFlt0 = vecTmpFlt0 * vecTmpFlt0;
|
||||||
|
vecExpUnBiasedFlt = vcvtq_f16_s16(vecExpUnBiased);
|
||||||
|
/*
|
||||||
|
* r.f = a + c * xx;
|
||||||
|
*/
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecAcc2, vecTmpFlt0);
|
||||||
|
/*
|
||||||
|
* add exponent
|
||||||
|
* r.f = r.f + ((float32_t) m) * __logf_rng_f16;
|
||||||
|
*/
|
||||||
|
vecAcc0 = vfmaq(vecAcc0, vecExpUnBiasedFlt, __logf_rng_f16);
|
||||||
|
// set log0 down to -inf
|
||||||
|
vecAcc0 = vdupq_m_n_f16(vecAcc0, -(_Float16)F16INFINITY, vcmpeqq_n_f16(vecIn, 0.0f));
|
||||||
|
return vecAcc0;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE float16x8_t vexpq_f16(
|
||||||
|
float16x8_t x)
|
||||||
|
{
|
||||||
|
// Perform range reduction [-log(2),log(2)]
|
||||||
|
int16x8_t m = vcvtq_s16_f16(vmulq_n_f16(x, 1.4426950408f16));
|
||||||
|
float16x8_t val = vfmsq_f16(x, vcvtq_f16_s16(m), vdupq_n_f16(0.6931471805f16));
|
||||||
|
|
||||||
|
// Polynomial Approximation
|
||||||
|
float16x8_t poly = vtaylor_polyq_f16(val, exp_tab_f16);
|
||||||
|
|
||||||
|
// Reconstruct
|
||||||
|
poly = (float16x8_t) (vqaddq_s16((int16x8_t) (poly), vqshlq_n_s16(m, 10)));
|
||||||
|
|
||||||
|
poly = vdupq_m_n_f16(poly, 0.0f16, vcmpltq_n_s16(m, -14));
|
||||||
|
return poly;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE float16x8_t arm_vec_exponent_f16(float16x8_t x, int16_t nb)
|
||||||
|
{
|
||||||
|
float16x8_t r = x;
|
||||||
|
nb--;
|
||||||
|
while (nb > 0) {
|
||||||
|
r = vmulq(r, x);
|
||||||
|
nb--;
|
||||||
|
}
|
||||||
|
return (r);
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f16x8_t vpowq_f16(
|
||||||
|
f16x8_t val,
|
||||||
|
f16x8_t n)
|
||||||
|
{
|
||||||
|
return vexpq_f16(vmulq_f16(n, vlogq_f16(val)));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define INV_NEWTON_INIT_F16 0x7773
|
||||||
|
|
||||||
|
__STATIC_INLINE f16x8_t vrecip_f16(f16x8_t vecIn)
|
||||||
|
{
|
||||||
|
f16x8_t vecSx, vecW, vecTmp;
|
||||||
|
any16x8_t v;
|
||||||
|
|
||||||
|
vecSx = vabsq(vecIn);
|
||||||
|
|
||||||
|
v.f = vecIn;
|
||||||
|
v.i = vsubq(vdupq_n_s16(INV_NEWTON_INIT_F16), v.i);
|
||||||
|
|
||||||
|
vecW = vmulq(vecSx, v.f);
|
||||||
|
|
||||||
|
// v.f = v.f * (8 + w * (-28 + w * (56 + w * (-70 + w *(56 + w * (-28 + w * (8 - w)))))));
|
||||||
|
vecTmp = vsubq(vdupq_n_f16(8.0f16), vecW);
|
||||||
|
vecTmp = vfmasq_n_f16(vecW, vecTmp, -28.0f16);
|
||||||
|
vecTmp = vfmasq_n_f16(vecW, vecTmp, 56.0f16);
|
||||||
|
vecTmp = vfmasq_n_f16(vecW, vecTmp, -70.0f16);
|
||||||
|
vecTmp = vfmasq_n_f16(vecW, vecTmp, 56.0f16);
|
||||||
|
vecTmp = vfmasq_n_f16(vecW, vecTmp, -28.0f16);
|
||||||
|
vecTmp = vfmasq_n_f16(vecW, vecTmp, 8.0f16);
|
||||||
|
v.f = vmulq(v.f, vecTmp);
|
||||||
|
|
||||||
|
v.f = vdupq_m_n_f16(v.f, F16INFINITY, vcmpeqq_n_f16(vecIn, 0.0f));
|
||||||
|
/*
|
||||||
|
* restore sign
|
||||||
|
*/
|
||||||
|
v.f = vnegq_m(v.f, v.f, vcmpltq_n_f16(vecIn, 0.0f));
|
||||||
|
return v.f;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE f16x8_t vtanhq_f16(
|
||||||
|
f16x8_t val)
|
||||||
|
{
|
||||||
|
f16x8_t x =
|
||||||
|
vminnmq_f16(vmaxnmq_f16(val, vdupq_n_f16(-10.f16)), vdupq_n_f16(10.0f16));
|
||||||
|
f16x8_t exp2x = vexpq_f16(vmulq_n_f16(x, 2.f16));
|
||||||
|
f16x8_t num = vsubq_n_f16(exp2x, 1.f16);
|
||||||
|
f16x8_t den = vaddq_n_f16(exp2x, 1.f16);
|
||||||
|
f16x8_t tanh = vmulq_f16(num, vrecip_f16(den));
|
||||||
|
return tanh;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARM FLOAT16 SUPPORTED */
|
||||||
|
|
||||||
|
#endif /* _ARM_VEC_MATH_F16_H */
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* End of file.
|
||||||
|
*/
|
||||||
@@ -0,0 +1,880 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file basic_math_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _BASIC_MATH_FUNCTIONS_H_
|
||||||
|
#define _BASIC_MATH_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupMath Basic Math Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 vector multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_mult_q7(
|
||||||
|
const q7_t * pSrcA,
|
||||||
|
const q7_t * pSrcB,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 vector multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_mult_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 vector multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_mult_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_mult_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_mult_f64(
|
||||||
|
const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector addition.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_add_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector addition.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_add_f64(
|
||||||
|
const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 vector addition.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_add_q7(
|
||||||
|
const q7_t * pSrcA,
|
||||||
|
const q7_t * pSrcB,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 vector addition.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_add_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 vector addition.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_add_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector subtraction.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_sub_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector subtraction.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_sub_f64(
|
||||||
|
const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 vector subtraction.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_sub_q7(
|
||||||
|
const q7_t * pSrcA,
|
||||||
|
const q7_t * pSrcB,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 vector subtraction.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_sub_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 vector subtraction.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_sub_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies a floating-point vector by a scalar.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] scale scale factor to be applied
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_scale_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t scale,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies a floating-point vector by a scalar.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] scale scale factor to be applied
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_scale_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t scale,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies a Q7 vector by a scalar.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] scaleFract fractional portion of the scale value
|
||||||
|
* @param[in] shift number of bits to shift the result by
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_scale_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q7_t scaleFract,
|
||||||
|
int8_t shift,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies a Q15 vector by a scalar.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] scaleFract fractional portion of the scale value
|
||||||
|
* @param[in] shift number of bits to shift the result by
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_scale_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t scaleFract,
|
||||||
|
int8_t shift,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies a Q31 vector by a scalar.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] scaleFract fractional portion of the scale value
|
||||||
|
* @param[in] shift number of bits to shift the result by
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_scale_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t scaleFract,
|
||||||
|
int8_t shift,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 vector absolute value.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[out] pDst points to the output buffer
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_abs_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector absolute value.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[out] pDst points to the output buffer
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_abs_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector absolute value.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[out] pDst points to the output buffer
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_abs_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 vector absolute value.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[out] pDst points to the output buffer
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_abs_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 vector absolute value.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[out] pDst points to the output buffer
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_abs_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product of floating-point vectors.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[out] result output result returned here
|
||||||
|
*/
|
||||||
|
void arm_dot_prod_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * result);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product of floating-point vectors.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[out] result output result returned here
|
||||||
|
*/
|
||||||
|
void arm_dot_prod_f64(
|
||||||
|
const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * result);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product of Q7 vectors.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[out] result output result returned here
|
||||||
|
*/
|
||||||
|
void arm_dot_prod_q7(
|
||||||
|
const q7_t * pSrcA,
|
||||||
|
const q7_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * result);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product of Q15 vectors.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[out] result output result returned here
|
||||||
|
*/
|
||||||
|
void arm_dot_prod_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q63_t * result);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product of Q31 vectors.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[out] result output result returned here
|
||||||
|
*/
|
||||||
|
void arm_dot_prod_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q63_t * result);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shifts the elements of a Q7 vector a specified number of bits.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_shift_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
int8_t shiftBits,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shifts the elements of a Q15 vector a specified number of bits.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_shift_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
int8_t shiftBits,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Shifts the elements of a Q31 vector a specified number of bits.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_shift_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
int8_t shiftBits,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a constant offset to a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] offset is the offset to be added
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_offset_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t offset,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a constant offset to a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] offset is the offset to be added
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_offset_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t offset,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a constant offset to a Q7 vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] offset is the offset to be added
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_offset_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q7_t offset,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a constant offset to a Q15 vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] offset is the offset to be added
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_offset_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t offset,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a constant offset to a Q31 vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] offset is the offset to be added
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_offset_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t offset,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Negates the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_negate_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Negates the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_negate_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Negates the elements of a Q7 vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_negate_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Negates the elements of a Q15 vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_negate_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Negates the elements of a Q31 vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_negate_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise AND of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_and_u16(
|
||||||
|
const uint16_t * pSrcA,
|
||||||
|
const uint16_t * pSrcB,
|
||||||
|
uint16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise AND of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_and_u32(
|
||||||
|
const uint32_t * pSrcA,
|
||||||
|
const uint32_t * pSrcB,
|
||||||
|
uint32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise AND of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_and_u8(
|
||||||
|
const uint8_t * pSrcA,
|
||||||
|
const uint8_t * pSrcB,
|
||||||
|
uint8_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise OR of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_or_u16(
|
||||||
|
const uint16_t * pSrcA,
|
||||||
|
const uint16_t * pSrcB,
|
||||||
|
uint16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise OR of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_or_u32(
|
||||||
|
const uint32_t * pSrcA,
|
||||||
|
const uint32_t * pSrcB,
|
||||||
|
uint32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise OR of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_or_u8(
|
||||||
|
const uint8_t * pSrcA,
|
||||||
|
const uint8_t * pSrcB,
|
||||||
|
uint8_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise NOT of a fixed-point vector.
|
||||||
|
* @param[in] pSrc points to input vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_not_u16(
|
||||||
|
const uint16_t * pSrc,
|
||||||
|
uint16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise NOT of a fixed-point vector.
|
||||||
|
* @param[in] pSrc points to input vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_not_u32(
|
||||||
|
const uint32_t * pSrc,
|
||||||
|
uint32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise NOT of a fixed-point vector.
|
||||||
|
* @param[in] pSrc points to input vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_not_u8(
|
||||||
|
const uint8_t * pSrc,
|
||||||
|
uint8_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise XOR of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_xor_u16(
|
||||||
|
const uint16_t * pSrcA,
|
||||||
|
const uint16_t * pSrcB,
|
||||||
|
uint16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise XOR of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_xor_u32(
|
||||||
|
const uint32_t * pSrcA,
|
||||||
|
const uint32_t * pSrcB,
|
||||||
|
uint32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compute the logical bitwise XOR of two fixed-point vectors.
|
||||||
|
* @param[in] pSrcA points to input vector A
|
||||||
|
* @param[in] pSrcB points to input vector B
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_xor_u8(
|
||||||
|
const uint8_t * pSrcA,
|
||||||
|
const uint8_t * pSrcB,
|
||||||
|
uint8_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Elementwise floating-point clipping
|
||||||
|
@param[in] pSrc points to input values
|
||||||
|
@param[out] pDst points to output clipped values
|
||||||
|
@param[in] low lower bound
|
||||||
|
@param[in] high higher bound
|
||||||
|
@param[in] numSamples number of samples to clip
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_clip_f32(const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
float32_t low,
|
||||||
|
float32_t high,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Elementwise fixed-point clipping
|
||||||
|
@param[in] pSrc points to input values
|
||||||
|
@param[out] pDst points to output clipped values
|
||||||
|
@param[in] low lower bound
|
||||||
|
@param[in] high higher bound
|
||||||
|
@param[in] numSamples number of samples to clip
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_clip_q31(const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
q31_t low,
|
||||||
|
q31_t high,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Elementwise fixed-point clipping
|
||||||
|
@param[in] pSrc points to input values
|
||||||
|
@param[out] pDst points to output clipped values
|
||||||
|
@param[in] low lower bound
|
||||||
|
@param[in] high higher bound
|
||||||
|
@param[in] numSamples number of samples to clip
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_clip_q15(const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
q15_t low,
|
||||||
|
q15_t high,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Elementwise fixed-point clipping
|
||||||
|
@param[in] pSrc points to input values
|
||||||
|
@param[out] pDst points to output clipped values
|
||||||
|
@param[in] low lower bound
|
||||||
|
@param[in] high higher bound
|
||||||
|
@param[in] numSamples number of samples to clip
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_clip_q7(const q7_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
q7_t low,
|
||||||
|
q7_t high,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _BASIC_MATH_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file basic_math_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _BASIC_MATH_FUNCTIONS_F16_H_
|
||||||
|
#define _BASIC_MATH_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector addition.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_add_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector subtraction.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_sub_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies a floating-point vector by a scalar.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] scale scale factor to be applied
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_scale_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t scale,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector absolute value.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[out] pDst points to the output buffer
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_abs_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adds a constant offset to a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[in] offset is the offset to be added
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_offset_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t offset,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product of floating-point vectors.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[out] result output result returned here
|
||||||
|
*/
|
||||||
|
void arm_dot_prod_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * result);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_mult_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Negates the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] blockSize number of samples in the vector
|
||||||
|
*/
|
||||||
|
void arm_negate_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Elementwise floating-point clipping
|
||||||
|
@param[in] pSrc points to input values
|
||||||
|
@param[out] pDst points to output clipped values
|
||||||
|
@param[in] low lower bound
|
||||||
|
@param[in] high higher bound
|
||||||
|
@param[in] numSamples number of samples to clip
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_clip_f16(const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
float16_t low,
|
||||||
|
float16_t high,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
#endif /* defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _BASIC_MATH_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file bayes_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _BAYES_FUNCTIONS_H_
|
||||||
|
#define _BAYES_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/statistics_functions.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupBayes Bayesian estimators
|
||||||
|
*
|
||||||
|
* Implement the naive gaussian Bayes estimator.
|
||||||
|
* The training must be done from scikit-learn.
|
||||||
|
*
|
||||||
|
* The parameters can be easily
|
||||||
|
* generated from the scikit-learn object. Some examples are given in
|
||||||
|
* DSP/Testing/PatternGeneration/Bayes.py
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for Naive Gaussian Bayesian estimator.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
uint32_t numberOfClasses; /**< Number of different classes */
|
||||||
|
const float32_t *theta; /**< Mean values for the Gaussians */
|
||||||
|
const float32_t *sigma; /**< Variances for the Gaussians */
|
||||||
|
const float32_t *classPriors; /**< Class prior probabilities */
|
||||||
|
float32_t epsilon; /**< Additive value to variances */
|
||||||
|
} arm_gaussian_naive_bayes_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Naive Gaussian Bayesian Estimator
|
||||||
|
*
|
||||||
|
* @param[in] S points to a naive bayes instance structure
|
||||||
|
* @param[in] in points to the elements of the input vector.
|
||||||
|
* @param[out] *pOutputProbabilities points to a buffer of length numberOfClasses containing estimated probabilities
|
||||||
|
* @param[out] *pBufferB points to a temporary buffer of length numberOfClasses
|
||||||
|
* @return The predicted class
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S,
|
||||||
|
const float32_t * in,
|
||||||
|
float32_t *pOutputProbabilities,
|
||||||
|
float32_t *pBufferB);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _BAYES_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file bayes_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _BAYES_FUNCTIONS_F16_H_
|
||||||
|
#define _BAYES_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/statistics_functions_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for Naive Gaussian Bayesian estimator.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
uint32_t numberOfClasses; /**< Number of different classes */
|
||||||
|
const float16_t *theta; /**< Mean values for the Gaussians */
|
||||||
|
const float16_t *sigma; /**< Variances for the Gaussians */
|
||||||
|
const float16_t *classPriors; /**< Class prior probabilities */
|
||||||
|
float16_t epsilon; /**< Additive value to variances */
|
||||||
|
} arm_gaussian_naive_bayes_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Naive Gaussian Bayesian Estimator
|
||||||
|
*
|
||||||
|
* @param[in] S points to a naive bayes instance structure
|
||||||
|
* @param[in] in points to the elements of the input vector.
|
||||||
|
* @param[out] *pOutputProbabilities points to a buffer of length numberOfClasses containing estimated probabilities
|
||||||
|
* @param[out] *pBufferB points to a temporary buffer of length numberOfClasses
|
||||||
|
* @return The predicted class
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
uint32_t arm_gaussian_naive_bayes_predict_f16(const arm_gaussian_naive_bayes_instance_f16 *S,
|
||||||
|
const float16_t * in,
|
||||||
|
float16_t *pOutputProbabilities,
|
||||||
|
float16_t *pBufferB);
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _BAYES_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,345 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file complex_math_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _COMPLEX_MATH_FUNCTIONS_H_
|
||||||
|
#define _COMPLEX_MATH_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
#include "dsp/fast_math_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupCmplxMath Complex Math Functions
|
||||||
|
* This set of functions operates on complex data vectors.
|
||||||
|
* The data in the complex arrays is stored in an interleaved fashion
|
||||||
|
* (real, imag, real, imag, ...).
|
||||||
|
* In the API functions, the number of samples in a complex array refers
|
||||||
|
* to the number of complex values; the array contains twice this number of
|
||||||
|
* real values.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex conjugate.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_conj_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex conjugate.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_conj_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex conjugate.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_conj_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex magnitude squared
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_squared_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex magnitude squared
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_squared_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex magnitude squared
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_squared_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex magnitude squared
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_squared_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex magnitude
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex magnitude
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex magnitude
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex magnitude
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex magnitude
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_fast_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex dot product
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
* @param[out] realResult real part of the result returned here
|
||||||
|
* @param[out] imagResult imaginary part of the result returned here
|
||||||
|
*/
|
||||||
|
void arm_cmplx_dot_prod_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
uint32_t numSamples,
|
||||||
|
q31_t * realResult,
|
||||||
|
q31_t * imagResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex dot product
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
* @param[out] realResult real part of the result returned here
|
||||||
|
* @param[out] imagResult imaginary part of the result returned here
|
||||||
|
*/
|
||||||
|
void arm_cmplx_dot_prod_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
uint32_t numSamples,
|
||||||
|
q63_t * realResult,
|
||||||
|
q63_t * imagResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex dot product
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
* @param[out] realResult real part of the result returned here
|
||||||
|
* @param[out] imagResult imaginary part of the result returned here
|
||||||
|
*/
|
||||||
|
void arm_cmplx_dot_prod_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
uint32_t numSamples,
|
||||||
|
float32_t * realResult,
|
||||||
|
float32_t * imagResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex-by-real multiplication
|
||||||
|
* @param[in] pSrcCmplx points to the complex input vector
|
||||||
|
* @param[in] pSrcReal points to the real input vector
|
||||||
|
* @param[out] pCmplxDst points to the complex output vector
|
||||||
|
* @param[in] numSamples number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_real_q15(
|
||||||
|
const q15_t * pSrcCmplx,
|
||||||
|
const q15_t * pSrcReal,
|
||||||
|
q15_t * pCmplxDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex-by-real multiplication
|
||||||
|
* @param[in] pSrcCmplx points to the complex input vector
|
||||||
|
* @param[in] pSrcReal points to the real input vector
|
||||||
|
* @param[out] pCmplxDst points to the complex output vector
|
||||||
|
* @param[in] numSamples number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_real_q31(
|
||||||
|
const q31_t * pSrcCmplx,
|
||||||
|
const q31_t * pSrcReal,
|
||||||
|
q31_t * pCmplxDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex-by-real multiplication
|
||||||
|
* @param[in] pSrcCmplx points to the complex input vector
|
||||||
|
* @param[in] pSrcReal points to the real input vector
|
||||||
|
* @param[out] pCmplxDst points to the complex output vector
|
||||||
|
* @param[in] numSamples number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_real_f32(
|
||||||
|
const float32_t * pSrcCmplx,
|
||||||
|
const float32_t * pSrcReal,
|
||||||
|
float32_t * pCmplxDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex-by-complex multiplication
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_cmplx_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex-by-complex multiplication
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_cmplx_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex-by-complex multiplication
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_cmplx_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex-by-complex multiplication
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_cmplx_f64(
|
||||||
|
const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _COMPLEX_MATH_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file complex_math_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _COMPLEX_MATH_FUNCTIONS_F16_H_
|
||||||
|
#define _COMPLEX_MATH_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
#include "dsp/fast_math_functions_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex conjugate.
|
||||||
|
* @param[in] pSrc points to the input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_conj_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex magnitude squared
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_squared_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex magnitude
|
||||||
|
* @param[in] pSrc points to the complex input vector
|
||||||
|
* @param[out] pDst points to the real output vector
|
||||||
|
* @param[in] numSamples number of complex samples in the input vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mag_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex dot product
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
* @param[out] realResult real part of the result returned here
|
||||||
|
* @param[out] imagResult imaginary part of the result returned here
|
||||||
|
*/
|
||||||
|
void arm_cmplx_dot_prod_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
uint32_t numSamples,
|
||||||
|
float16_t * realResult,
|
||||||
|
float16_t * imagResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex-by-real multiplication
|
||||||
|
* @param[in] pSrcCmplx points to the complex input vector
|
||||||
|
* @param[in] pSrcReal points to the real input vector
|
||||||
|
* @param[out] pCmplxDst points to the complex output vector
|
||||||
|
* @param[in] numSamples number of samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_real_f16(
|
||||||
|
const float16_t * pSrcCmplx,
|
||||||
|
const float16_t * pSrcReal,
|
||||||
|
float16_t * pCmplxDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex-by-complex multiplication
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[out] pDst points to the output vector
|
||||||
|
* @param[in] numSamples number of complex samples in each vector
|
||||||
|
*/
|
||||||
|
void arm_cmplx_mult_cmplx_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t numSamples);
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _COMPLEX_MATH_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,791 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file controller_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _CONTROLLER_FUNCTIONS_H_
|
||||||
|
#define _CONTROLLER_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macros required for SINE and COSINE Controller functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CONTROLLER_Q31_SHIFT (32 - 9)
|
||||||
|
/* 1.31(q31) Fixed value of 2/360 */
|
||||||
|
/* -1 to +1 is divided into 360 values so total spacing is (2/360) */
|
||||||
|
#define INPUT_SPACING 0xB60B61
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupController Controller Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupController
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup SinCos
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point sin_cos function.
|
||||||
|
* @param[in] theta input value in degrees
|
||||||
|
* @param[out] pSinVal points to the processed sine output.
|
||||||
|
* @param[out] pCosVal points to the processed cos output.
|
||||||
|
*/
|
||||||
|
void arm_sin_cos_f32(
|
||||||
|
float32_t theta,
|
||||||
|
float32_t * pSinVal,
|
||||||
|
float32_t * pCosVal);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 sin_cos function.
|
||||||
|
* @param[in] theta scaled input value in degrees
|
||||||
|
* @param[out] pSinVal points to the processed sine output.
|
||||||
|
* @param[out] pCosVal points to the processed cosine output.
|
||||||
|
*/
|
||||||
|
void arm_sin_cos_q31(
|
||||||
|
q31_t theta,
|
||||||
|
q31_t * pSinVal,
|
||||||
|
q31_t * pCosVal);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of SinCos group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupController
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup PID PID Motor Control
|
||||||
|
*
|
||||||
|
* A Proportional Integral Derivative (PID) controller is a generic feedback control
|
||||||
|
* loop mechanism widely used in industrial control systems.
|
||||||
|
* A PID controller is the most commonly used type of feedback controller.
|
||||||
|
*
|
||||||
|
* This set of functions implements (PID) controllers
|
||||||
|
* for Q15, Q31, and floating-point data types. The functions operate on a single sample
|
||||||
|
* of data and each call to the function returns a single processed value.
|
||||||
|
* <code>S</code> points to an instance of the PID control data structure. <code>in</code>
|
||||||
|
* is the input sample value. The functions return the output value.
|
||||||
|
*
|
||||||
|
* \par Algorithm:
|
||||||
|
* <pre>
|
||||||
|
* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
|
||||||
|
* A0 = Kp + Ki + Kd
|
||||||
|
* A1 = (-Kp ) - (2 * Kd )
|
||||||
|
* A2 = Kd
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* \image html PID.gif "Proportional Integral Derivative Controller"
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* The PID controller calculates an "error" value as the difference between
|
||||||
|
* the measured output and the reference input.
|
||||||
|
* The controller attempts to minimize the error by adjusting the process control inputs.
|
||||||
|
* The proportional value determines the reaction to the current error,
|
||||||
|
* the integral value determines the reaction based on the sum of recent errors,
|
||||||
|
* and the derivative value determines the reaction based on the rate at which the error has been changing.
|
||||||
|
*
|
||||||
|
* \par Instance Structure
|
||||||
|
* The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
|
||||||
|
* A separate instance structure must be defined for each PID Controller.
|
||||||
|
* There are separate instance structure declarations for each of the 3 supported data types.
|
||||||
|
*
|
||||||
|
* \par Reset Functions
|
||||||
|
* There is also an associated reset function for each data type which clears the state array.
|
||||||
|
*
|
||||||
|
* \par Initialization Functions
|
||||||
|
* There is also an associated initialization function for each data type.
|
||||||
|
* The initialization function performs the following operations:
|
||||||
|
* - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.
|
||||||
|
* - Zeros out the values in the state buffer.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
|
||||||
|
*
|
||||||
|
* \par Fixed-Point Behavior
|
||||||
|
* Care must be taken when using the fixed-point versions of the PID Controller functions.
|
||||||
|
* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
|
||||||
|
* Refer to the function specific documentation below for usage guidelines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 PID Control.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
|
||||||
|
#if !defined (ARM_MATH_DSP)
|
||||||
|
q15_t A1; /**< The derived gain A1 = -Kp - 2Kd */
|
||||||
|
q15_t A2; /**< The derived gain A1 = Kd. */
|
||||||
|
#else
|
||||||
|
q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/
|
||||||
|
#endif
|
||||||
|
q15_t state[3]; /**< The state array of length 3. */
|
||||||
|
q15_t Kp; /**< The proportional gain. */
|
||||||
|
q15_t Ki; /**< The integral gain. */
|
||||||
|
q15_t Kd; /**< The derivative gain. */
|
||||||
|
} arm_pid_instance_q15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q31 PID Control.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
|
||||||
|
q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
|
||||||
|
q31_t A2; /**< The derived gain, A2 = Kd . */
|
||||||
|
q31_t state[3]; /**< The state array of length 3. */
|
||||||
|
q31_t Kp; /**< The proportional gain. */
|
||||||
|
q31_t Ki; /**< The integral gain. */
|
||||||
|
q31_t Kd; /**< The derivative gain. */
|
||||||
|
} arm_pid_instance_q31;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point PID Control.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
|
||||||
|
float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
|
||||||
|
float32_t A2; /**< The derived gain, A2 = Kd . */
|
||||||
|
float32_t state[3]; /**< The state array of length 3. */
|
||||||
|
float32_t Kp; /**< The proportional gain. */
|
||||||
|
float32_t Ki; /**< The integral gain. */
|
||||||
|
float32_t Kd; /**< The derivative gain. */
|
||||||
|
} arm_pid_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the floating-point PID Control.
|
||||||
|
* @param[in,out] S points to an instance of the PID structure.
|
||||||
|
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
||||||
|
*/
|
||||||
|
void arm_pid_init_f32(
|
||||||
|
arm_pid_instance_f32 * S,
|
||||||
|
int32_t resetStateFlag);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset function for the floating-point PID Control.
|
||||||
|
* @param[in,out] S is an instance of the floating-point PID Control structure
|
||||||
|
*/
|
||||||
|
void arm_pid_reset_f32(
|
||||||
|
arm_pid_instance_f32 * S);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the Q31 PID Control.
|
||||||
|
* @param[in,out] S points to an instance of the Q15 PID structure.
|
||||||
|
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
||||||
|
*/
|
||||||
|
void arm_pid_init_q31(
|
||||||
|
arm_pid_instance_q31 * S,
|
||||||
|
int32_t resetStateFlag);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset function for the Q31 PID Control.
|
||||||
|
* @param[in,out] S points to an instance of the Q31 PID Control structure
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_pid_reset_q31(
|
||||||
|
arm_pid_instance_q31 * S);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the Q15 PID Control.
|
||||||
|
* @param[in,out] S points to an instance of the Q15 PID structure.
|
||||||
|
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
|
||||||
|
*/
|
||||||
|
void arm_pid_init_q15(
|
||||||
|
arm_pid_instance_q15 * S,
|
||||||
|
int32_t resetStateFlag);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reset function for the Q15 PID Control.
|
||||||
|
* @param[in,out] S points to an instance of the q15 PID Control structure
|
||||||
|
*/
|
||||||
|
void arm_pid_reset_q15(
|
||||||
|
arm_pid_instance_q15 * S);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup PID
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process function for the floating-point PID Control.
|
||||||
|
* @param[in,out] S is an instance of the floating-point PID Control structure
|
||||||
|
* @param[in] in input sample to process
|
||||||
|
* @return processed output sample.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE float32_t arm_pid_f32(
|
||||||
|
arm_pid_instance_f32 * S,
|
||||||
|
float32_t in)
|
||||||
|
{
|
||||||
|
float32_t out;
|
||||||
|
|
||||||
|
/* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */
|
||||||
|
out = (S->A0 * in) +
|
||||||
|
(S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]);
|
||||||
|
|
||||||
|
/* Update state */
|
||||||
|
S->state[1] = S->state[0];
|
||||||
|
S->state[0] = in;
|
||||||
|
S->state[2] = out;
|
||||||
|
|
||||||
|
/* return to application */
|
||||||
|
return (out);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Process function for the Q31 PID Control.
|
||||||
|
@param[in,out] S points to an instance of the Q31 PID Control structure
|
||||||
|
@param[in] in input sample to process
|
||||||
|
@return processed output sample.
|
||||||
|
|
||||||
|
\par Scaling and Overflow Behavior
|
||||||
|
The function is implemented using an internal 64-bit accumulator.
|
||||||
|
The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.
|
||||||
|
Thus, if the accumulator result overflows it wraps around rather than clip.
|
||||||
|
In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.
|
||||||
|
After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q31_t arm_pid_q31(
|
||||||
|
arm_pid_instance_q31 * S,
|
||||||
|
q31_t in)
|
||||||
|
{
|
||||||
|
q63_t acc;
|
||||||
|
q31_t out;
|
||||||
|
|
||||||
|
/* acc = A0 * x[n] */
|
||||||
|
acc = (q63_t) S->A0 * in;
|
||||||
|
|
||||||
|
/* acc += A1 * x[n-1] */
|
||||||
|
acc += (q63_t) S->A1 * S->state[0];
|
||||||
|
|
||||||
|
/* acc += A2 * x[n-2] */
|
||||||
|
acc += (q63_t) S->A2 * S->state[1];
|
||||||
|
|
||||||
|
/* convert output to 1.31 format to add y[n-1] */
|
||||||
|
out = (q31_t) (acc >> 31U);
|
||||||
|
|
||||||
|
/* out += y[n-1] */
|
||||||
|
out += S->state[2];
|
||||||
|
|
||||||
|
/* Update state */
|
||||||
|
S->state[1] = S->state[0];
|
||||||
|
S->state[0] = in;
|
||||||
|
S->state[2] = out;
|
||||||
|
|
||||||
|
/* return to application */
|
||||||
|
return (out);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Process function for the Q15 PID Control.
|
||||||
|
@param[in,out] S points to an instance of the Q15 PID Control structure
|
||||||
|
@param[in] in input sample to process
|
||||||
|
@return processed output sample.
|
||||||
|
|
||||||
|
\par Scaling and Overflow Behavior
|
||||||
|
The function is implemented using a 64-bit internal accumulator.
|
||||||
|
Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.
|
||||||
|
The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.
|
||||||
|
There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.
|
||||||
|
After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.
|
||||||
|
Lastly, the accumulator is saturated to yield a result in 1.15 format.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q15_t arm_pid_q15(
|
||||||
|
arm_pid_instance_q15 * S,
|
||||||
|
q15_t in)
|
||||||
|
{
|
||||||
|
q63_t acc;
|
||||||
|
q15_t out;
|
||||||
|
|
||||||
|
#if defined (ARM_MATH_DSP)
|
||||||
|
/* Implementation of PID controller */
|
||||||
|
|
||||||
|
/* acc = A0 * x[n] */
|
||||||
|
acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in);
|
||||||
|
|
||||||
|
/* acc += A1 * x[n-1] + A2 * x[n-2] */
|
||||||
|
acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc);
|
||||||
|
#else
|
||||||
|
/* acc = A0 * x[n] */
|
||||||
|
acc = ((q31_t) S->A0) * in;
|
||||||
|
|
||||||
|
/* acc += A1 * x[n-1] + A2 * x[n-2] */
|
||||||
|
acc += (q31_t) S->A1 * S->state[0];
|
||||||
|
acc += (q31_t) S->A2 * S->state[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* acc += y[n-1] */
|
||||||
|
acc += (q31_t) S->state[2] << 15;
|
||||||
|
|
||||||
|
/* saturate the output */
|
||||||
|
out = (q15_t) (__SSAT((q31_t)(acc >> 15), 16));
|
||||||
|
|
||||||
|
/* Update state */
|
||||||
|
S->state[1] = S->state[0];
|
||||||
|
S->state[0] = in;
|
||||||
|
S->state[2] = out;
|
||||||
|
|
||||||
|
/* return to application */
|
||||||
|
return (out);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of PID group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupController
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup park Vector Park Transform
|
||||||
|
*
|
||||||
|
* Forward Park transform converts the input two-coordinate vector to flux and torque components.
|
||||||
|
* The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents
|
||||||
|
* from the stationary to the moving reference frame and control the spatial relationship between
|
||||||
|
* the stator vector current and rotor flux vector.
|
||||||
|
* If we consider the d axis aligned with the rotor flux, the diagram below shows the
|
||||||
|
* current vector and the relationship from the two reference frames:
|
||||||
|
* \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame"
|
||||||
|
*
|
||||||
|
* The function operates on a single sample of data and each call to the function returns the processed output.
|
||||||
|
* The library provides separate functions for Q31 and floating-point data types.
|
||||||
|
* \par Algorithm
|
||||||
|
* \image html parkFormula.gif
|
||||||
|
* where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components,
|
||||||
|
* <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
|
||||||
|
* cosine and sine values of theta (rotor flux position).
|
||||||
|
* \par Fixed-Point Behavior
|
||||||
|
* Care must be taken when using the Q31 version of the Park transform.
|
||||||
|
* In particular, the overflow and saturation behavior of the accumulator used must be considered.
|
||||||
|
* Refer to the function specific documentation below for usage guidelines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup park
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point Park transform
|
||||||
|
* @param[in] Ialpha input two-phase vector coordinate alpha
|
||||||
|
* @param[in] Ibeta input two-phase vector coordinate beta
|
||||||
|
* @param[out] pId points to output rotor reference frame d
|
||||||
|
* @param[out] pIq points to output rotor reference frame q
|
||||||
|
* @param[in] sinVal sine value of rotation angle theta
|
||||||
|
* @param[in] cosVal cosine value of rotation angle theta
|
||||||
|
* @return none
|
||||||
|
*
|
||||||
|
* The function implements the forward Park transform.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_park_f32(
|
||||||
|
float32_t Ialpha,
|
||||||
|
float32_t Ibeta,
|
||||||
|
float32_t * pId,
|
||||||
|
float32_t * pIq,
|
||||||
|
float32_t sinVal,
|
||||||
|
float32_t cosVal)
|
||||||
|
{
|
||||||
|
/* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */
|
||||||
|
*pId = Ialpha * cosVal + Ibeta * sinVal;
|
||||||
|
|
||||||
|
/* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */
|
||||||
|
*pIq = -Ialpha * sinVal + Ibeta * cosVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Park transform for Q31 version
|
||||||
|
@param[in] Ialpha input two-phase vector coordinate alpha
|
||||||
|
@param[in] Ibeta input two-phase vector coordinate beta
|
||||||
|
@param[out] pId points to output rotor reference frame d
|
||||||
|
@param[out] pIq points to output rotor reference frame q
|
||||||
|
@param[in] sinVal sine value of rotation angle theta
|
||||||
|
@param[in] cosVal cosine value of rotation angle theta
|
||||||
|
@return none
|
||||||
|
|
||||||
|
\par Scaling and Overflow Behavior
|
||||||
|
The function is implemented using an internal 32-bit accumulator.
|
||||||
|
The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
|
||||||
|
There is saturation on the addition and subtraction, hence there is no risk of overflow.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_park_q31(
|
||||||
|
q31_t Ialpha,
|
||||||
|
q31_t Ibeta,
|
||||||
|
q31_t * pId,
|
||||||
|
q31_t * pIq,
|
||||||
|
q31_t sinVal,
|
||||||
|
q31_t cosVal)
|
||||||
|
{
|
||||||
|
q31_t product1, product2; /* Temporary variables used to store intermediate results */
|
||||||
|
q31_t product3, product4; /* Temporary variables used to store intermediate results */
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Ialpha * cosVal) */
|
||||||
|
product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31);
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Ibeta * sinVal) */
|
||||||
|
product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31);
|
||||||
|
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Ialpha * sinVal) */
|
||||||
|
product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31);
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Ibeta * cosVal) */
|
||||||
|
product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31);
|
||||||
|
|
||||||
|
/* Calculate pId by adding the two intermediate products 1 and 2 */
|
||||||
|
*pId = __QADD(product1, product2);
|
||||||
|
|
||||||
|
/* Calculate pIq by subtracting the two intermediate products 3 from 4 */
|
||||||
|
*pIq = __QSUB(product4, product3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of park group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupController
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup inv_park Vector Inverse Park transform
|
||||||
|
* Inverse Park transform converts the input flux and torque components to two-coordinate vector.
|
||||||
|
*
|
||||||
|
* The function operates on a single sample of data and each call to the function returns the processed output.
|
||||||
|
* The library provides separate functions for Q31 and floating-point data types.
|
||||||
|
* \par Algorithm
|
||||||
|
* \image html parkInvFormula.gif
|
||||||
|
* where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components,
|
||||||
|
* <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
|
||||||
|
* cosine and sine values of theta (rotor flux position).
|
||||||
|
* \par Fixed-Point Behavior
|
||||||
|
* Care must be taken when using the Q31 version of the Park transform.
|
||||||
|
* In particular, the overflow and saturation behavior of the accumulator used must be considered.
|
||||||
|
* Refer to the function specific documentation below for usage guidelines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup inv_park
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point Inverse Park transform
|
||||||
|
* @param[in] Id input coordinate of rotor reference frame d
|
||||||
|
* @param[in] Iq input coordinate of rotor reference frame q
|
||||||
|
* @param[out] pIalpha points to output two-phase orthogonal vector axis alpha
|
||||||
|
* @param[out] pIbeta points to output two-phase orthogonal vector axis beta
|
||||||
|
* @param[in] sinVal sine value of rotation angle theta
|
||||||
|
* @param[in] cosVal cosine value of rotation angle theta
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_inv_park_f32(
|
||||||
|
float32_t Id,
|
||||||
|
float32_t Iq,
|
||||||
|
float32_t * pIalpha,
|
||||||
|
float32_t * pIbeta,
|
||||||
|
float32_t sinVal,
|
||||||
|
float32_t cosVal)
|
||||||
|
{
|
||||||
|
/* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */
|
||||||
|
*pIalpha = Id * cosVal - Iq * sinVal;
|
||||||
|
|
||||||
|
/* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */
|
||||||
|
*pIbeta = Id * sinVal + Iq * cosVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Inverse Park transform for Q31 version
|
||||||
|
@param[in] Id input coordinate of rotor reference frame d
|
||||||
|
@param[in] Iq input coordinate of rotor reference frame q
|
||||||
|
@param[out] pIalpha points to output two-phase orthogonal vector axis alpha
|
||||||
|
@param[out] pIbeta points to output two-phase orthogonal vector axis beta
|
||||||
|
@param[in] sinVal sine value of rotation angle theta
|
||||||
|
@param[in] cosVal cosine value of rotation angle theta
|
||||||
|
@return none
|
||||||
|
|
||||||
|
@par Scaling and Overflow Behavior
|
||||||
|
The function is implemented using an internal 32-bit accumulator.
|
||||||
|
The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
|
||||||
|
There is saturation on the addition, hence there is no risk of overflow.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_inv_park_q31(
|
||||||
|
q31_t Id,
|
||||||
|
q31_t Iq,
|
||||||
|
q31_t * pIalpha,
|
||||||
|
q31_t * pIbeta,
|
||||||
|
q31_t sinVal,
|
||||||
|
q31_t cosVal)
|
||||||
|
{
|
||||||
|
q31_t product1, product2; /* Temporary variables used to store intermediate results */
|
||||||
|
q31_t product3, product4; /* Temporary variables used to store intermediate results */
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Id * cosVal) */
|
||||||
|
product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31);
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Iq * sinVal) */
|
||||||
|
product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31);
|
||||||
|
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Id * sinVal) */
|
||||||
|
product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31);
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (Iq * cosVal) */
|
||||||
|
product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31);
|
||||||
|
|
||||||
|
/* Calculate pIalpha by using the two intermediate products 1 and 2 */
|
||||||
|
*pIalpha = __QSUB(product1, product2);
|
||||||
|
|
||||||
|
/* Calculate pIbeta by using the two intermediate products 3 and 4 */
|
||||||
|
*pIbeta = __QADD(product4, product3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of Inverse park group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupController
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup clarke Vector Clarke Transform
|
||||||
|
* Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector.
|
||||||
|
* Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents
|
||||||
|
* in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>.
|
||||||
|
* When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below
|
||||||
|
* \image html clarke.gif Stator current space vector and its components in (a,b).
|
||||||
|
* and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code>
|
||||||
|
* can be calculated using only <code>Ia</code> and <code>Ib</code>.
|
||||||
|
*
|
||||||
|
* The function operates on a single sample of data and each call to the function returns the processed output.
|
||||||
|
* The library provides separate functions for Q31 and floating-point data types.
|
||||||
|
* \par Algorithm
|
||||||
|
* \image html clarkeFormula.gif
|
||||||
|
* where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and
|
||||||
|
* <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector.
|
||||||
|
* \par Fixed-Point Behavior
|
||||||
|
* Care must be taken when using the Q31 version of the Clarke transform.
|
||||||
|
* In particular, the overflow and saturation behavior of the accumulator used must be considered.
|
||||||
|
* Refer to the function specific documentation below for usage guidelines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup clarke
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @brief Floating-point Clarke transform
|
||||||
|
* @param[in] Ia input three-phase coordinate <code>a</code>
|
||||||
|
* @param[in] Ib input three-phase coordinate <code>b</code>
|
||||||
|
* @param[out] pIalpha points to output two-phase orthogonal vector axis alpha
|
||||||
|
* @param[out] pIbeta points to output two-phase orthogonal vector axis beta
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_clarke_f32(
|
||||||
|
float32_t Ia,
|
||||||
|
float32_t Ib,
|
||||||
|
float32_t * pIalpha,
|
||||||
|
float32_t * pIbeta)
|
||||||
|
{
|
||||||
|
/* Calculate pIalpha using the equation, pIalpha = Ia */
|
||||||
|
*pIalpha = Ia;
|
||||||
|
|
||||||
|
/* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */
|
||||||
|
*pIbeta = (0.57735026919f * Ia + 1.15470053838f * Ib);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Clarke transform for Q31 version
|
||||||
|
@param[in] Ia input three-phase coordinate <code>a</code>
|
||||||
|
@param[in] Ib input three-phase coordinate <code>b</code>
|
||||||
|
@param[out] pIalpha points to output two-phase orthogonal vector axis alpha
|
||||||
|
@param[out] pIbeta points to output two-phase orthogonal vector axis beta
|
||||||
|
@return none
|
||||||
|
|
||||||
|
\par Scaling and Overflow Behavior
|
||||||
|
The function is implemented using an internal 32-bit accumulator.
|
||||||
|
The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
|
||||||
|
There is saturation on the addition, hence there is no risk of overflow.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_clarke_q31(
|
||||||
|
q31_t Ia,
|
||||||
|
q31_t Ib,
|
||||||
|
q31_t * pIalpha,
|
||||||
|
q31_t * pIbeta)
|
||||||
|
{
|
||||||
|
q31_t product1, product2; /* Temporary variables used to store intermediate results */
|
||||||
|
|
||||||
|
/* Calculating pIalpha from Ia by equation pIalpha = Ia */
|
||||||
|
*pIalpha = Ia;
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */
|
||||||
|
product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30);
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (2/sqrt(3) * Ib) */
|
||||||
|
product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30);
|
||||||
|
|
||||||
|
/* pIbeta is calculated by adding the intermediate products */
|
||||||
|
*pIbeta = __QADD(product1, product2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of clarke group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupController
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup inv_clarke Vector Inverse Clarke Transform
|
||||||
|
* Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases.
|
||||||
|
*
|
||||||
|
* The function operates on a single sample of data and each call to the function returns the processed output.
|
||||||
|
* The library provides separate functions for Q31 and floating-point data types.
|
||||||
|
* \par Algorithm
|
||||||
|
* \image html clarkeInvFormula.gif
|
||||||
|
* where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and
|
||||||
|
* <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector.
|
||||||
|
* \par Fixed-Point Behavior
|
||||||
|
* Care must be taken when using the Q31 version of the Clarke transform.
|
||||||
|
* In particular, the overflow and saturation behavior of the accumulator used must be considered.
|
||||||
|
* Refer to the function specific documentation below for usage guidelines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup inv_clarke
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point Inverse Clarke transform
|
||||||
|
* @param[in] Ialpha input two-phase orthogonal vector axis alpha
|
||||||
|
* @param[in] Ibeta input two-phase orthogonal vector axis beta
|
||||||
|
* @param[out] pIa points to output three-phase coordinate <code>a</code>
|
||||||
|
* @param[out] pIb points to output three-phase coordinate <code>b</code>
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_inv_clarke_f32(
|
||||||
|
float32_t Ialpha,
|
||||||
|
float32_t Ibeta,
|
||||||
|
float32_t * pIa,
|
||||||
|
float32_t * pIb)
|
||||||
|
{
|
||||||
|
/* Calculating pIa from Ialpha by equation pIa = Ialpha */
|
||||||
|
*pIa = Ialpha;
|
||||||
|
|
||||||
|
/* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */
|
||||||
|
*pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Inverse Clarke transform for Q31 version
|
||||||
|
@param[in] Ialpha input two-phase orthogonal vector axis alpha
|
||||||
|
@param[in] Ibeta input two-phase orthogonal vector axis beta
|
||||||
|
@param[out] pIa points to output three-phase coordinate <code>a</code>
|
||||||
|
@param[out] pIb points to output three-phase coordinate <code>b</code>
|
||||||
|
@return none
|
||||||
|
|
||||||
|
\par Scaling and Overflow Behavior
|
||||||
|
The function is implemented using an internal 32-bit accumulator.
|
||||||
|
The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
|
||||||
|
There is saturation on the subtraction, hence there is no risk of overflow.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE void arm_inv_clarke_q31(
|
||||||
|
q31_t Ialpha,
|
||||||
|
q31_t Ibeta,
|
||||||
|
q31_t * pIa,
|
||||||
|
q31_t * pIb)
|
||||||
|
{
|
||||||
|
q31_t product1, product2; /* Temporary variables used to store intermediate results */
|
||||||
|
|
||||||
|
/* Calculating pIa from Ialpha by equation pIa = Ialpha */
|
||||||
|
*pIa = Ialpha;
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */
|
||||||
|
product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31);
|
||||||
|
|
||||||
|
/* Intermediate product is calculated by (1/sqrt(3) * pIb) */
|
||||||
|
product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31);
|
||||||
|
|
||||||
|
/* pIb is calculated by subtracting the products */
|
||||||
|
*pIb = __QSUB(product2, product1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of inv_clarke group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _CONTROLLER_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file controller_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _CONTROLLER_FUNCTIONS_F16_H_
|
||||||
|
#define _CONTROLLER_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _CONTROLLER_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,341 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file distance_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _DISTANCE_FUNCTIONS_H_
|
||||||
|
#define _DISTANCE_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/statistics_functions.h"
|
||||||
|
#include "dsp/basic_math_functions.h"
|
||||||
|
#include "dsp/fast_math_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupDistance Distance functions
|
||||||
|
*
|
||||||
|
* Distance functions for use with clustering algorithms.
|
||||||
|
* There are distance functions for float vectors and boolean vectors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* 6.14 bug */
|
||||||
|
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001)
|
||||||
|
|
||||||
|
__attribute__((weak)) float __powisf2(float a, int b);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Euclidean distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Euclidean distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float64_t arm_euclidean_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Bray-Curtis distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Canberra distance between two vectors
|
||||||
|
*
|
||||||
|
* This function may divide by zero when samples pA[i] and pB[i] are both zero.
|
||||||
|
* The result of the computation will be correct. So the division per zero may be
|
||||||
|
* ignored.
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Chebyshev distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Chebyshev distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float64_t arm_chebyshev_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cityblock (Manhattan) distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cityblock (Manhattan) distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float64_t arm_cityblock_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Correlation distance between two vectors
|
||||||
|
*
|
||||||
|
* The input vectors are modified in place !
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cosine distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cosine distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float64_t arm_cosine_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Jensen-Shannon distance between two vectors
|
||||||
|
*
|
||||||
|
* This function is assuming that elements of second vector are > 0
|
||||||
|
* and 0 only when the corresponding element of first vector is 0.
|
||||||
|
* Otherwise the result of the computation does not make sense
|
||||||
|
* and for speed reasons, the cases returning NaN or Infinity are not
|
||||||
|
* managed.
|
||||||
|
*
|
||||||
|
* When the function is computing x log (x / y) with x 0 and y 0,
|
||||||
|
* it will compute the right value (0) but a division per zero will occur
|
||||||
|
* and shoudl be ignored in client code.
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB,uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minkowski distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] n Norm order (>= 2)
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
float32_t arm_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, int32_t order, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dice distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] order Distance order
|
||||||
|
* @param[in] blockSize Number of samples
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float32_t arm_dice_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Hamming distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_hamming_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Jaccard distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_jaccard_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Kulsinski distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_kulsinski_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Roger Stanimoto distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Russell-Rao distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_russellrao_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sokal-Michener distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sokal-Sneath distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_sokalsneath_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Yule distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector of packed booleans
|
||||||
|
* @param[in] pB Second vector of packed booleans
|
||||||
|
* @param[in] numberOfBools Number of booleans
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float32_t arm_yule_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _DISTANCE_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,180 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file distance_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _DISTANCE_FUNCTIONS_F16_H_
|
||||||
|
#define _DISTANCE_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
/* 6.14 bug */
|
||||||
|
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001)
|
||||||
|
/* Defined in minkowski_f32 */
|
||||||
|
__attribute__((weak)) float __powisf2(float a, int b);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "dsp/statistics_functions_f16.h"
|
||||||
|
#include "dsp/basic_math_functions_f16.h"
|
||||||
|
|
||||||
|
#include "dsp/fast_math_functions_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Euclidean distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float16_t arm_euclidean_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Bray-Curtis distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_braycurtis_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Canberra distance between two vectors
|
||||||
|
*
|
||||||
|
* This function may divide by zero when samples pA[i] and pB[i] are both zero.
|
||||||
|
* The result of the computation will be correct. So the division per zero may be
|
||||||
|
* ignored.
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_canberra_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Chebyshev distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_chebyshev_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cityblock (Manhattan) distance between two vectors
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_cityblock_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Correlation distance between two vectors
|
||||||
|
*
|
||||||
|
* The input vectors are modified in place !
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_correlation_distance_f16(float16_t *pA,float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Cosine distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float16_t arm_cosine_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Jensen-Shannon distance between two vectors
|
||||||
|
*
|
||||||
|
* This function is assuming that elements of second vector are > 0
|
||||||
|
* and 0 only when the corresponding element of first vector is 0.
|
||||||
|
* Otherwise the result of the computation does not make sense
|
||||||
|
* and for speed reasons, the cases returning NaN or Infinity are not
|
||||||
|
* managed.
|
||||||
|
*
|
||||||
|
* When the function is computing x log (x / y) with x 0 and y 0,
|
||||||
|
* it will compute the right value (0) but a division per zero will occur
|
||||||
|
* and shoudl be ignored in client code.
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
float16_t arm_jensenshannon_distance_f16(const float16_t *pA,const float16_t *pB,uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minkowski distance between two vectors
|
||||||
|
*
|
||||||
|
* @param[in] pA First vector
|
||||||
|
* @param[in] pB Second vector
|
||||||
|
* @param[in] n Norm order (>= 2)
|
||||||
|
* @param[in] blockSize vector length
|
||||||
|
* @return distance
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
float16_t arm_minkowski_distance_f16(const float16_t *pA,const float16_t *pB, int32_t order, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _DISTANCE_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,389 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file fast_math_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _FAST_MATH_FUNCTIONS_H_
|
||||||
|
#define _FAST_MATH_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/basic_math_functions.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macros required for SINE and COSINE Fast math approximations
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FAST_MATH_TABLE_SIZE 512
|
||||||
|
#define FAST_MATH_Q31_SHIFT (32 - 10)
|
||||||
|
#define FAST_MATH_Q15_SHIFT (16 - 10)
|
||||||
|
|
||||||
|
#ifndef PI
|
||||||
|
#define PI 3.14159265358979f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupFastMath Fast Math Functions
|
||||||
|
* This set of functions provides a fast approximation to sine, cosine, and square root.
|
||||||
|
* As compared to most of the other functions in the CMSIS math library, the fast math functions
|
||||||
|
* operate on individual values and not arrays.
|
||||||
|
* There are separate functions for Q15, Q31, and floating-point data.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupFastMath
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@addtogroup sin
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fast approximation to the trigonometric sine function for floating-point data.
|
||||||
|
* @param[in] x input value in radians.
|
||||||
|
* @return sin(x).
|
||||||
|
*/
|
||||||
|
float32_t arm_sin_f32(
|
||||||
|
float32_t x);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fast approximation to the trigonometric sine function for Q31 data.
|
||||||
|
* @param[in] x Scaled input value in radians.
|
||||||
|
* @return sin(x).
|
||||||
|
*/
|
||||||
|
q31_t arm_sin_q31(
|
||||||
|
q31_t x);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fast approximation to the trigonometric sine function for Q15 data.
|
||||||
|
* @param[in] x Scaled input value in radians.
|
||||||
|
* @return sin(x).
|
||||||
|
*/
|
||||||
|
q15_t arm_sin_q15(
|
||||||
|
q15_t x);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@} end of sin group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@addtogroup cos
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fast approximation to the trigonometric cosine function for floating-point data.
|
||||||
|
* @param[in] x input value in radians.
|
||||||
|
* @return cos(x).
|
||||||
|
*/
|
||||||
|
float32_t arm_cos_f32(
|
||||||
|
float32_t x);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fast approximation to the trigonometric cosine function for Q31 data.
|
||||||
|
* @param[in] x Scaled input value in radians.
|
||||||
|
* @return cos(x).
|
||||||
|
*/
|
||||||
|
q31_t arm_cos_q31(
|
||||||
|
q31_t x);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fast approximation to the trigonometric cosine function for Q15 data.
|
||||||
|
* @param[in] x Scaled input value in radians.
|
||||||
|
* @return cos(x).
|
||||||
|
*/
|
||||||
|
q15_t arm_cos_q15(
|
||||||
|
q15_t x);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@} end of cos group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of log values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vlog_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of log values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vlog_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief q31 vector of log values.
|
||||||
|
* @param[in] pSrc points to the input vector in q31
|
||||||
|
* @param[out] pDst points to the output vector in q5.26
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_vlog_q31(const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief q15 vector of log values.
|
||||||
|
* @param[in] pSrc points to the input vector in q15
|
||||||
|
* @param[out] pDst points to the output vector in q4.11
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @return none
|
||||||
|
*/
|
||||||
|
void arm_vlog_q15(const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of exp values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vexp_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of exp values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vexp_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup SQRT Square Root
|
||||||
|
*
|
||||||
|
* Computes the square root of a number.
|
||||||
|
* There are separate functions for Q15, Q31, and floating-point data types.
|
||||||
|
* The square root function is computed using the Newton-Raphson algorithm.
|
||||||
|
* This is an iterative algorithm of the form:
|
||||||
|
* <pre>
|
||||||
|
* x1 = x0 - f(x0)/f'(x0)
|
||||||
|
* </pre>
|
||||||
|
* where <code>x1</code> is the current estimate,
|
||||||
|
* <code>x0</code> is the previous estimate, and
|
||||||
|
* <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>.
|
||||||
|
* For the square root function, the algorithm reduces to:
|
||||||
|
* <pre>
|
||||||
|
* x0 = in/2 [initial guess]
|
||||||
|
* x1 = 1/2 * ( x0 + in / x0) [each iteration]
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup SQRT
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point square root function.
|
||||||
|
@param[in] in input value
|
||||||
|
@param[out] pOut square root of input value
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : input value is positive
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE arm_status arm_sqrt_f32(
|
||||||
|
const float32_t in,
|
||||||
|
float32_t * pOut)
|
||||||
|
{
|
||||||
|
if (in >= 0.0f)
|
||||||
|
{
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#if defined __TARGET_FPU_VFP
|
||||||
|
*pOut = __sqrtf(in);
|
||||||
|
#else
|
||||||
|
*pOut = sqrtf(in);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#if defined __ARMVFP__
|
||||||
|
__ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in));
|
||||||
|
#else
|
||||||
|
*pOut = sqrtf(in);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
*pOut = sqrtf(in);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (ARM_MATH_SUCCESS);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*pOut = 0.0f;
|
||||||
|
return (ARM_MATH_ARGUMENT_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Q31 square root function.
|
||||||
|
@param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF
|
||||||
|
@param[out] pOut points to square root of input value
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : input value is positive
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0
|
||||||
|
*/
|
||||||
|
arm_status arm_sqrt_q31(
|
||||||
|
q31_t in,
|
||||||
|
q31_t * pOut);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Q15 square root function.
|
||||||
|
@param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF
|
||||||
|
@param[out] pOut points to square root of input value
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : input value is positive
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0
|
||||||
|
*/
|
||||||
|
arm_status arm_sqrt_q15(
|
||||||
|
q15_t in,
|
||||||
|
q15_t * pOut);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of SQRT group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Fixed point division
|
||||||
|
@param[in] numerator Numerator
|
||||||
|
@param[in] denominator Denominator
|
||||||
|
@param[out] quotient Quotient value normalized between -1.0 and 1.0
|
||||||
|
@param[out] shift Shift left value to get the unnormalized quotient
|
||||||
|
@return error status
|
||||||
|
|
||||||
|
When dividing by 0, an error ARM_MATH_NANINF is returned. And the quotient is forced
|
||||||
|
to the saturated negative or positive value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
arm_status arm_divide_q15(q15_t numerator,
|
||||||
|
q15_t denominator,
|
||||||
|
q15_t *quotient,
|
||||||
|
int16_t *shift);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Fixed point division
|
||||||
|
@param[in] numerator Numerator
|
||||||
|
@param[in] denominator Denominator
|
||||||
|
@param[out] quotient Quotient value normalized between -1.0 and 1.0
|
||||||
|
@param[out] shift Shift left value to get the unnormalized quotient
|
||||||
|
@return error status
|
||||||
|
|
||||||
|
When dividing by 0, an error ARM_MATH_NANINF is returned. And the quotient is forced
|
||||||
|
to the saturated negative or positive value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
arm_status arm_divide_q31(q31_t numerator,
|
||||||
|
q31_t denominator,
|
||||||
|
q31_t *quotient,
|
||||||
|
int16_t *shift);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant.
|
||||||
|
@param[in] y y coordinate
|
||||||
|
@param[in] x x coordinate
|
||||||
|
@param[out] result Result
|
||||||
|
@return error status.
|
||||||
|
*/
|
||||||
|
arm_status arm_atan2_f32(float32_t y,float32_t x,float32_t *result);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant.
|
||||||
|
@param[in] y y coordinate
|
||||||
|
@param[in] x x coordinate
|
||||||
|
@param[out] result Result in Q2.29
|
||||||
|
@return error status.
|
||||||
|
*/
|
||||||
|
arm_status arm_atan2_q31(q31_t y,q31_t x,q31_t *result);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant.
|
||||||
|
@param[in] y y coordinate
|
||||||
|
@param[in] x x coordinate
|
||||||
|
@param[out] result Result in Q2.13
|
||||||
|
@return error status.
|
||||||
|
*/
|
||||||
|
arm_status arm_atan2_q15(q15_t y,q15_t x,q15_t *result);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _FAST_MATH_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file fast_math_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _FAST_MATH_FUNCTIONS_F16_H_
|
||||||
|
#define _FAST_MATH_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
/* For sqrt_f32 */
|
||||||
|
#include "dsp/fast_math_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup SQRT
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point square root function.
|
||||||
|
@param[in] in input value
|
||||||
|
@param[out] pOut square root of input value
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : input value is positive
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE arm_status arm_sqrt_f16(
|
||||||
|
float16_t in,
|
||||||
|
float16_t * pOut)
|
||||||
|
{
|
||||||
|
float32_t r;
|
||||||
|
arm_status status;
|
||||||
|
status=arm_sqrt_f32((float32_t)in,&r);
|
||||||
|
*pOut=(float16_t)r;
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@} end of SQRT group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of log values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vlog_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of exp values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vexp_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point vector of inverse values.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[out] pDst points to the output vector
|
||||||
|
@param[in] blockSize number of samples in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_vinverse_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant.
|
||||||
|
@param[in] y y coordinate
|
||||||
|
@param[in] x x coordinate
|
||||||
|
@param[out] result Result
|
||||||
|
@return error status.
|
||||||
|
*/
|
||||||
|
arm_status arm_atan2_f16(float16_t y,float16_t x,float16_t *result);
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _FAST_MATH_FUNCTIONS_F16_H_ */
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,237 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file filtering_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _FILTERING_FUNCTIONS_F16_H_
|
||||||
|
#define _FILTERING_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point FIR filter.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numTaps; /**< number of filter coefficients in the filter. */
|
||||||
|
float16_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
|
||||||
|
const float16_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
|
||||||
|
} arm_fir_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the floating-point FIR filter.
|
||||||
|
* @param[in,out] S points to an instance of the floating-point FIR filter structure.
|
||||||
|
* @param[in] numTaps Number of filter coefficients in the filter.
|
||||||
|
* @param[in] pCoeffs points to the filter coefficients.
|
||||||
|
* @param[in] pState points to the state buffer.
|
||||||
|
* @param[in] blockSize number of samples that are processed at a time.
|
||||||
|
*/
|
||||||
|
void arm_fir_init_f16(
|
||||||
|
arm_fir_instance_f16 * S,
|
||||||
|
uint16_t numTaps,
|
||||||
|
const float16_t * pCoeffs,
|
||||||
|
float16_t * pState,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the floating-point FIR filter.
|
||||||
|
* @param[in] S points to an instance of the floating-point FIR structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_fir_f16(
|
||||||
|
const arm_fir_instance_f16 * S,
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point Biquad cascade filter.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
|
||||||
|
float16_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
|
||||||
|
const float16_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
|
||||||
|
} arm_biquad_casd_df1_inst_f16;
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the modified Biquad coefs required by vectorized code.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
float16_t coeffs[12][8]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */
|
||||||
|
} arm_biquad_mod_coef_f16;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the floating-point Biquad cascade filter.
|
||||||
|
* @param[in] S points to an instance of the floating-point Biquad cascade structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_biquad_cascade_df1_f16(
|
||||||
|
const arm_biquad_casd_df1_inst_f16 * S,
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
void arm_biquad_cascade_df1_mve_init_f16(
|
||||||
|
arm_biquad_casd_df1_inst_f16 * S,
|
||||||
|
uint8_t numStages,
|
||||||
|
const float16_t * pCoeffs,
|
||||||
|
arm_biquad_mod_coef_f16 * pCoeffsMod,
|
||||||
|
float16_t * pState);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void arm_biquad_cascade_df1_init_f16(
|
||||||
|
arm_biquad_casd_df1_inst_f16 * S,
|
||||||
|
uint8_t numStages,
|
||||||
|
const float16_t * pCoeffs,
|
||||||
|
float16_t * pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
|
||||||
|
float16_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */
|
||||||
|
const float16_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */
|
||||||
|
} arm_biquad_cascade_df2T_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
|
||||||
|
float16_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */
|
||||||
|
const float16_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */
|
||||||
|
} arm_biquad_cascade_stereo_df2T_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.
|
||||||
|
* @param[in] S points to an instance of the filter data structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_biquad_cascade_df2T_f16(
|
||||||
|
const arm_biquad_cascade_df2T_instance_f16 * S,
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels
|
||||||
|
* @param[in] S points to an instance of the filter data structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_biquad_cascade_stereo_df2T_f16(
|
||||||
|
const arm_biquad_cascade_stereo_df2T_instance_f16 * S,
|
||||||
|
const float16_t * pSrc,
|
||||||
|
float16_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter.
|
||||||
|
* @param[in,out] S points to an instance of the filter data structure.
|
||||||
|
* @param[in] numStages number of 2nd order stages in the filter.
|
||||||
|
* @param[in] pCoeffs points to the filter coefficients.
|
||||||
|
* @param[in] pState points to the state buffer.
|
||||||
|
*/
|
||||||
|
void arm_biquad_cascade_df2T_init_f16(
|
||||||
|
arm_biquad_cascade_df2T_instance_f16 * S,
|
||||||
|
uint8_t numStages,
|
||||||
|
const float16_t * pCoeffs,
|
||||||
|
float16_t * pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter.
|
||||||
|
* @param[in,out] S points to an instance of the filter data structure.
|
||||||
|
* @param[in] numStages number of 2nd order stages in the filter.
|
||||||
|
* @param[in] pCoeffs points to the filter coefficients.
|
||||||
|
* @param[in] pState points to the state buffer.
|
||||||
|
*/
|
||||||
|
void arm_biquad_cascade_stereo_df2T_init_f16(
|
||||||
|
arm_biquad_cascade_stereo_df2T_instance_f16 * S,
|
||||||
|
uint8_t numStages,
|
||||||
|
const float16_t * pCoeffs,
|
||||||
|
float16_t * pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Correlation of floating-point sequences.
|
||||||
|
* @param[in] pSrcA points to the first input sequence.
|
||||||
|
* @param[in] srcALen length of the first input sequence.
|
||||||
|
* @param[in] pSrcB points to the second input sequence.
|
||||||
|
* @param[in] srcBLen length of the second input sequence.
|
||||||
|
* @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1.
|
||||||
|
*/
|
||||||
|
void arm_correlate_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
uint32_t srcALen,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
uint32_t srcBLen,
|
||||||
|
float16_t * pDst);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Levinson Durbin
|
||||||
|
@param[in] phi autocovariance vector starting with lag 0 (length is nbCoefs + 1)
|
||||||
|
@param[out] a autoregressive coefficients
|
||||||
|
@param[out] err prediction error (variance)
|
||||||
|
@param[in] nbCoefs number of autoregressive coefficients
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_levinson_durbin_f16(const float16_t *phi,
|
||||||
|
float16_t *a,
|
||||||
|
float16_t *err,
|
||||||
|
int nbCoefs);
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _FILTERING_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,319 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file interpolation_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _INTERPOLATION_FUNCTIONS_H_
|
||||||
|
#define _INTERPOLATION_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupInterpolation Interpolation Functions
|
||||||
|
* These functions perform 1- and 2-dimensional interpolation of data.
|
||||||
|
* Linear interpolation is used for 1-dimensional data and
|
||||||
|
* bilinear interpolation is used for 2-dimensional data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point Linear Interpolate function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nValues; /**< nValues */
|
||||||
|
float32_t x1; /**< x1 */
|
||||||
|
float32_t xSpacing; /**< xSpacing */
|
||||||
|
float32_t *pYData; /**< pointer to the table of Y values */
|
||||||
|
} arm_linear_interp_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point bilinear interpolation function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows in the data table. */
|
||||||
|
uint16_t numCols; /**< number of columns in the data table. */
|
||||||
|
float32_t *pData; /**< points to the data table. */
|
||||||
|
} arm_bilinear_interp_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q31 bilinear interpolation function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows in the data table. */
|
||||||
|
uint16_t numCols; /**< number of columns in the data table. */
|
||||||
|
q31_t *pData; /**< points to the data table. */
|
||||||
|
} arm_bilinear_interp_instance_q31;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 bilinear interpolation function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows in the data table. */
|
||||||
|
uint16_t numCols; /**< number of columns in the data table. */
|
||||||
|
q15_t *pData; /**< points to the data table. */
|
||||||
|
} arm_bilinear_interp_instance_q15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 bilinear interpolation function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows in the data table. */
|
||||||
|
uint16_t numCols; /**< number of columns in the data table. */
|
||||||
|
q7_t *pData; /**< points to the data table. */
|
||||||
|
} arm_bilinear_interp_instance_q7;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Struct for specifying cubic spline type
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ARM_SPLINE_NATURAL = 0, /**< Natural spline */
|
||||||
|
ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */
|
||||||
|
} arm_spline_type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point cubic spline interpolation.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arm_spline_type type; /**< Type (boundary conditions) */
|
||||||
|
const float32_t * x; /**< x values */
|
||||||
|
const float32_t * y; /**< y values */
|
||||||
|
uint32_t n_x; /**< Number of known data points */
|
||||||
|
float32_t * coeffs; /**< Coefficients buffer (b,c, and d) */
|
||||||
|
} arm_spline_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupInterpolation
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup SplineInterpolate
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the floating-point cubic spline interpolation.
|
||||||
|
* @param[in] S points to an instance of the floating-point spline structure.
|
||||||
|
* @param[in] xq points to the x values ot the interpolated data points.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples of output data.
|
||||||
|
*/
|
||||||
|
void arm_spline_f32(
|
||||||
|
arm_spline_instance_f32 * S,
|
||||||
|
const float32_t * xq,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the floating-point cubic spline interpolation.
|
||||||
|
* @param[in,out] S points to an instance of the floating-point spline structure.
|
||||||
|
* @param[in] type type of cubic spline interpolation (boundary conditions)
|
||||||
|
* @param[in] x points to the x values of the known data points.
|
||||||
|
* @param[in] y points to the y values of the known data points.
|
||||||
|
* @param[in] n number of known data points.
|
||||||
|
* @param[in] coeffs coefficients array for b, c, and d
|
||||||
|
* @param[in] tempBuffer buffer array for internal computations
|
||||||
|
*/
|
||||||
|
void arm_spline_init_f32(
|
||||||
|
arm_spline_instance_f32 * S,
|
||||||
|
arm_spline_type type,
|
||||||
|
const float32_t * x,
|
||||||
|
const float32_t * y,
|
||||||
|
uint32_t n,
|
||||||
|
float32_t * coeffs,
|
||||||
|
float32_t * tempBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of SplineInterpolate group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup LinearInterpolate
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process function for the floating-point Linear Interpolation Function.
|
||||||
|
* @param[in,out] S is an instance of the floating-point Linear Interpolation structure
|
||||||
|
* @param[in] x input sample to process
|
||||||
|
* @return y processed output sample.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_linear_interp_f32(
|
||||||
|
arm_linear_interp_instance_f32 * S,
|
||||||
|
float32_t x);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @brief Process function for the Q31 Linear Interpolation Function.
|
||||||
|
* @param[in] pYData pointer to Q31 Linear Interpolation table
|
||||||
|
* @param[in] x input sample to process
|
||||||
|
* @param[in] nValues number of table values
|
||||||
|
* @return y processed output sample.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
|
||||||
|
* This function can support maximum of table size 2^12.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
q31_t arm_linear_interp_q31(
|
||||||
|
const q31_t * pYData,
|
||||||
|
q31_t x,
|
||||||
|
uint32_t nValues);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @brief Process function for the Q15 Linear Interpolation Function.
|
||||||
|
* @param[in] pYData pointer to Q15 Linear Interpolation table
|
||||||
|
* @param[in] x input sample to process
|
||||||
|
* @param[in] nValues number of table values
|
||||||
|
* @return y processed output sample.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
|
||||||
|
* This function can support maximum of table size 2^12.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
q15_t arm_linear_interp_q15(
|
||||||
|
const q15_t * pYData,
|
||||||
|
q31_t x,
|
||||||
|
uint32_t nValues);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @brief Process function for the Q7 Linear Interpolation Function.
|
||||||
|
* @param[in] pYData pointer to Q7 Linear Interpolation table
|
||||||
|
* @param[in] x input sample to process
|
||||||
|
* @param[in] nValues number of table values
|
||||||
|
* @return y processed output sample.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
|
||||||
|
* This function can support maximum of table size 2^12.
|
||||||
|
*/
|
||||||
|
q7_t arm_linear_interp_q7(
|
||||||
|
const q7_t * pYData,
|
||||||
|
q31_t x,
|
||||||
|
uint32_t nValues);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of LinearInterpolate group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ingroup groupInterpolation
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup BilinearInterpolate
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point bilinear interpolation.
|
||||||
|
* @param[in,out] S points to an instance of the interpolation structure.
|
||||||
|
* @param[in] X interpolation coordinate.
|
||||||
|
* @param[in] Y interpolation coordinate.
|
||||||
|
* @return out interpolated value.
|
||||||
|
*/
|
||||||
|
float32_t arm_bilinear_interp_f32(
|
||||||
|
const arm_bilinear_interp_instance_f32 * S,
|
||||||
|
float32_t X,
|
||||||
|
float32_t Y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 bilinear interpolation.
|
||||||
|
* @param[in,out] S points to an instance of the interpolation structure.
|
||||||
|
* @param[in] X interpolation coordinate in 12.20 format.
|
||||||
|
* @param[in] Y interpolation coordinate in 12.20 format.
|
||||||
|
* @return out interpolated value.
|
||||||
|
*/
|
||||||
|
q31_t arm_bilinear_interp_q31(
|
||||||
|
arm_bilinear_interp_instance_q31 * S,
|
||||||
|
q31_t X,
|
||||||
|
q31_t Y);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 bilinear interpolation.
|
||||||
|
* @param[in,out] S points to an instance of the interpolation structure.
|
||||||
|
* @param[in] X interpolation coordinate in 12.20 format.
|
||||||
|
* @param[in] Y interpolation coordinate in 12.20 format.
|
||||||
|
* @return out interpolated value.
|
||||||
|
*/
|
||||||
|
q15_t arm_bilinear_interp_q15(
|
||||||
|
arm_bilinear_interp_instance_q15 * S,
|
||||||
|
q31_t X,
|
||||||
|
q31_t Y);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 bilinear interpolation.
|
||||||
|
* @param[in,out] S points to an instance of the interpolation structure.
|
||||||
|
* @param[in] X interpolation coordinate in 12.20 format.
|
||||||
|
* @param[in] Y interpolation coordinate in 12.20 format.
|
||||||
|
* @return out interpolated value.
|
||||||
|
*/
|
||||||
|
q7_t arm_bilinear_interp_q7(
|
||||||
|
arm_bilinear_interp_instance_q7 * S,
|
||||||
|
q31_t X,
|
||||||
|
q31_t Y);
|
||||||
|
/**
|
||||||
|
* @} end of BilinearInterpolate group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _INTERPOLATION_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file interpolation_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _INTERPOLATION_FUNCTIONS_F16_H_
|
||||||
|
#define _INTERPOLATION_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nValues; /**< nValues */
|
||||||
|
float16_t x1; /**< x1 */
|
||||||
|
float16_t xSpacing; /**< xSpacing */
|
||||||
|
float16_t *pYData; /**< pointer to the table of Y values */
|
||||||
|
} arm_linear_interp_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point bilinear interpolation function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows;/**< number of rows in the data table. */
|
||||||
|
uint16_t numCols;/**< number of columns in the data table. */
|
||||||
|
float16_t *pData; /**< points to the data table. */
|
||||||
|
} arm_bilinear_interp_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup LinearInterpolate
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Process function for the floating-point Linear Interpolation Function.
|
||||||
|
* @param[in,out] S is an instance of the floating-point Linear Interpolation structure
|
||||||
|
* @param[in] x input sample to process
|
||||||
|
* @return y processed output sample.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_linear_interp_f16(
|
||||||
|
arm_linear_interp_instance_f16 * S,
|
||||||
|
float16_t x);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of LinearInterpolate group
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @addtogroup BilinearInterpolate
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point bilinear interpolation.
|
||||||
|
* @param[in,out] S points to an instance of the interpolation structure.
|
||||||
|
* @param[in] X interpolation coordinate.
|
||||||
|
* @param[in] Y interpolation coordinate.
|
||||||
|
* @return out interpolated value.
|
||||||
|
*/
|
||||||
|
float16_t arm_bilinear_interp_f16(
|
||||||
|
const arm_bilinear_interp_instance_f16 * S,
|
||||||
|
float16_t X,
|
||||||
|
float16_t Y);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of BilinearInterpolate group
|
||||||
|
*/
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _INTERPOLATION_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,757 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file matrix_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _MATRIX_FUNCTIONS_H_
|
||||||
|
#define _MATRIX_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupMatrix Matrix Functions
|
||||||
|
*
|
||||||
|
* This set of functions provides basic matrix math operations.
|
||||||
|
* The functions operate on matrix data structures. For example,
|
||||||
|
* the type
|
||||||
|
* definition for the floating-point matrix structure is shown
|
||||||
|
* below:
|
||||||
|
* <pre>
|
||||||
|
* typedef struct
|
||||||
|
* {
|
||||||
|
* uint16_t numRows; // number of rows of the matrix.
|
||||||
|
* uint16_t numCols; // number of columns of the matrix.
|
||||||
|
* float32_t *pData; // points to the data of the matrix.
|
||||||
|
* } arm_matrix_instance_f32;
|
||||||
|
* </pre>
|
||||||
|
* There are similar definitions for Q15 and Q31 data types.
|
||||||
|
*
|
||||||
|
* The structure specifies the size of the matrix and then points to
|
||||||
|
* an array of data. The array is of size <code>numRows X numCols</code>
|
||||||
|
* and the values are arranged in row order. That is, the
|
||||||
|
* matrix element (i, j) is stored at:
|
||||||
|
* <pre>
|
||||||
|
* pData[i*numCols + j]
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* \par Init Functions
|
||||||
|
* There is an associated initialization function for each type of matrix
|
||||||
|
* data structure.
|
||||||
|
* The initialization function sets the values of the internal structure fields.
|
||||||
|
* Refer to \ref arm_mat_init_f32(), \ref arm_mat_init_q31() and \ref arm_mat_init_q15()
|
||||||
|
* for floating-point, Q31 and Q15 types, respectively.
|
||||||
|
*
|
||||||
|
* \par
|
||||||
|
* Use of the initialization function is optional. However, if initialization function is used
|
||||||
|
* then the instance structure cannot be placed into a const data section.
|
||||||
|
* To place the instance structure in a const data
|
||||||
|
* section, manually initialize the data structure. For example:
|
||||||
|
* <pre>
|
||||||
|
* <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code>
|
||||||
|
* <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code>
|
||||||
|
* <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code>
|
||||||
|
* </pre>
|
||||||
|
* where <code>nRows</code> specifies the number of rows, <code>nColumns</code>
|
||||||
|
* specifies the number of columns, and <code>pData</code> points to the
|
||||||
|
* data array.
|
||||||
|
*
|
||||||
|
* \par Size Checking
|
||||||
|
* By default all of the matrix functions perform size checking on the input and
|
||||||
|
* output matrices. For example, the matrix addition function verifies that the
|
||||||
|
* two input matrices and the output matrix all have the same number of rows and
|
||||||
|
* columns. If the size check fails the functions return:
|
||||||
|
* <pre>
|
||||||
|
* ARM_MATH_SIZE_MISMATCH
|
||||||
|
* </pre>
|
||||||
|
* Otherwise the functions return
|
||||||
|
* <pre>
|
||||||
|
* ARM_MATH_SUCCESS
|
||||||
|
* </pre>
|
||||||
|
* There is some overhead associated with this matrix size checking.
|
||||||
|
* The matrix size checking is enabled via the \#define
|
||||||
|
* <pre>
|
||||||
|
* ARM_MATH_MATRIX_CHECK
|
||||||
|
* </pre>
|
||||||
|
* within the library project settings. By default this macro is defined
|
||||||
|
* and size checking is enabled. By changing the project settings and
|
||||||
|
* undefining this macro size checking is eliminated and the functions
|
||||||
|
* run a bit faster. With size checking disabled the functions always
|
||||||
|
* return <code>ARM_MATH_SUCCESS</code>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point matrix structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows of the matrix. */
|
||||||
|
uint16_t numCols; /**< number of columns of the matrix. */
|
||||||
|
float32_t *pData; /**< points to the data of the matrix. */
|
||||||
|
} arm_matrix_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point matrix structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows of the matrix. */
|
||||||
|
uint16_t numCols; /**< number of columns of the matrix. */
|
||||||
|
float64_t *pData; /**< points to the data of the matrix. */
|
||||||
|
} arm_matrix_instance_f64;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q7 matrix structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows of the matrix. */
|
||||||
|
uint16_t numCols; /**< number of columns of the matrix. */
|
||||||
|
q7_t *pData; /**< points to the data of the matrix. */
|
||||||
|
} arm_matrix_instance_q7;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 matrix structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows of the matrix. */
|
||||||
|
uint16_t numCols; /**< number of columns of the matrix. */
|
||||||
|
q15_t *pData; /**< points to the data of the matrix. */
|
||||||
|
} arm_matrix_instance_q15;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q31 matrix structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows of the matrix. */
|
||||||
|
uint16_t numCols; /**< number of columns of the matrix. */
|
||||||
|
q31_t *pData; /**< points to the data of the matrix. */
|
||||||
|
} arm_matrix_instance_q31;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix addition.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_add_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrcA,
|
||||||
|
const arm_matrix_instance_f32 * pSrcB,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix addition.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_add_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrcA,
|
||||||
|
const arm_matrix_instance_q15 * pSrcB,
|
||||||
|
arm_matrix_instance_q15 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix addition.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_add_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrcA,
|
||||||
|
const arm_matrix_instance_q31 * pSrcB,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point, complex, matrix multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_mult_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrcA,
|
||||||
|
const arm_matrix_instance_f32 * pSrcB,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15, complex, matrix multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_mult_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrcA,
|
||||||
|
const arm_matrix_instance_q15 * pSrcB,
|
||||||
|
arm_matrix_instance_q15 * pDst,
|
||||||
|
q15_t * pScratch);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31, complex, matrix multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_mult_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrcA,
|
||||||
|
const arm_matrix_instance_q31 * pSrcB,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_trans_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrc,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_trans_f64(
|
||||||
|
const arm_matrix_instance_f64 * pSrc,
|
||||||
|
arm_matrix_instance_f64 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_trans_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrc,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_trans_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrc,
|
||||||
|
arm_matrix_instance_q15 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 complex matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_trans_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrc,
|
||||||
|
arm_matrix_instance_q15 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_trans_q7(
|
||||||
|
const arm_matrix_instance_q7 * pSrc,
|
||||||
|
arm_matrix_instance_q7 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_trans_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrc,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 complex matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_trans_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrc,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrcA,
|
||||||
|
const arm_matrix_instance_f32 * pSrcB,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_f64(
|
||||||
|
const arm_matrix_instance_f64 * pSrcA,
|
||||||
|
const arm_matrix_instance_f64 * pSrcB,
|
||||||
|
arm_matrix_instance_f64 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix and vector multiplication
|
||||||
|
* @param[in] pSrcMat points to the input matrix structure
|
||||||
|
* @param[in] pVec points to vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
*/
|
||||||
|
void arm_mat_vec_mult_f32(
|
||||||
|
const arm_matrix_instance_f32 *pSrcMat,
|
||||||
|
const float32_t *pVec,
|
||||||
|
float32_t *pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @param[in] pState points to the array for storing intermediate results
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_q7(
|
||||||
|
const arm_matrix_instance_q7 * pSrcA,
|
||||||
|
const arm_matrix_instance_q7 * pSrcB,
|
||||||
|
arm_matrix_instance_q7 * pDst,
|
||||||
|
q7_t * pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q7 matrix and vector multiplication
|
||||||
|
* @param[in] pSrcMat points to the input matrix structure
|
||||||
|
* @param[in] pVec points to vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
*/
|
||||||
|
void arm_mat_vec_mult_q7(
|
||||||
|
const arm_matrix_instance_q7 *pSrcMat,
|
||||||
|
const q7_t *pVec,
|
||||||
|
q7_t *pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @param[in] pState points to the array for storing intermediate results
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrcA,
|
||||||
|
const arm_matrix_instance_q15 * pSrcB,
|
||||||
|
arm_matrix_instance_q15 * pDst,
|
||||||
|
q15_t * pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix and vector multiplication
|
||||||
|
* @param[in] pSrcMat points to the input matrix structure
|
||||||
|
* @param[in] pVec points to vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
*/
|
||||||
|
void arm_mat_vec_mult_q15(
|
||||||
|
const arm_matrix_instance_q15 *pSrcMat,
|
||||||
|
const q15_t *pVec,
|
||||||
|
q15_t *pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @param[in] pState points to the array for storing intermediate results
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_fast_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrcA,
|
||||||
|
const arm_matrix_instance_q15 * pSrcB,
|
||||||
|
arm_matrix_instance_q15 * pDst,
|
||||||
|
q15_t * pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrcA,
|
||||||
|
const arm_matrix_instance_q31 * pSrcB,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @param[in] pState points to the array for storing intermediate results
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_opt_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrcA,
|
||||||
|
const arm_matrix_instance_q31 * pSrcB,
|
||||||
|
arm_matrix_instance_q31 * pDst,
|
||||||
|
q31_t *pState);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix and vector multiplication
|
||||||
|
* @param[in] pSrcMat points to the input matrix structure
|
||||||
|
* @param[in] pVec points to vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
*/
|
||||||
|
void arm_mat_vec_mult_q31(
|
||||||
|
const arm_matrix_instance_q31 *pSrcMat,
|
||||||
|
const q31_t *pVec,
|
||||||
|
q31_t *pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_fast_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrcA,
|
||||||
|
const arm_matrix_instance_q31 * pSrcB,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix subtraction
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_sub_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrcA,
|
||||||
|
const arm_matrix_instance_f32 * pSrcB,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix subtraction
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_sub_f64(
|
||||||
|
const arm_matrix_instance_f64 * pSrcA,
|
||||||
|
const arm_matrix_instance_f64 * pSrcB,
|
||||||
|
arm_matrix_instance_f64 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix subtraction
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_sub_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrcA,
|
||||||
|
const arm_matrix_instance_q15 * pSrcB,
|
||||||
|
arm_matrix_instance_q15 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix subtraction
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_sub_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrcA,
|
||||||
|
const arm_matrix_instance_q31 * pSrcB,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix scaling.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[in] scale scale factor
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_scale_f32(
|
||||||
|
const arm_matrix_instance_f32 * pSrc,
|
||||||
|
float32_t scale,
|
||||||
|
arm_matrix_instance_f32 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix scaling.
|
||||||
|
* @param[in] pSrc points to input matrix
|
||||||
|
* @param[in] scaleFract fractional portion of the scale factor
|
||||||
|
* @param[in] shift number of bits to shift the result by
|
||||||
|
* @param[out] pDst points to output matrix
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_scale_q15(
|
||||||
|
const arm_matrix_instance_q15 * pSrc,
|
||||||
|
q15_t scaleFract,
|
||||||
|
int32_t shift,
|
||||||
|
arm_matrix_instance_q15 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix scaling.
|
||||||
|
* @param[in] pSrc points to input matrix
|
||||||
|
* @param[in] scaleFract fractional portion of the scale factor
|
||||||
|
* @param[in] shift number of bits to shift the result by
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_scale_q31(
|
||||||
|
const arm_matrix_instance_q31 * pSrc,
|
||||||
|
q31_t scaleFract,
|
||||||
|
int32_t shift,
|
||||||
|
arm_matrix_instance_q31 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q31 matrix initialization.
|
||||||
|
* @param[in,out] S points to an instance of the floating-point matrix structure.
|
||||||
|
* @param[in] nRows number of rows in the matrix.
|
||||||
|
* @param[in] nColumns number of columns in the matrix.
|
||||||
|
* @param[in] pData points to the matrix data array.
|
||||||
|
*/
|
||||||
|
void arm_mat_init_q31(
|
||||||
|
arm_matrix_instance_q31 * S,
|
||||||
|
uint16_t nRows,
|
||||||
|
uint16_t nColumns,
|
||||||
|
q31_t * pData);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Q15 matrix initialization.
|
||||||
|
* @param[in,out] S points to an instance of the floating-point matrix structure.
|
||||||
|
* @param[in] nRows number of rows in the matrix.
|
||||||
|
* @param[in] nColumns number of columns in the matrix.
|
||||||
|
* @param[in] pData points to the matrix data array.
|
||||||
|
*/
|
||||||
|
void arm_mat_init_q15(
|
||||||
|
arm_matrix_instance_q15 * S,
|
||||||
|
uint16_t nRows,
|
||||||
|
uint16_t nColumns,
|
||||||
|
q15_t * pData);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix initialization.
|
||||||
|
* @param[in,out] S points to an instance of the floating-point matrix structure.
|
||||||
|
* @param[in] nRows number of rows in the matrix.
|
||||||
|
* @param[in] nColumns number of columns in the matrix.
|
||||||
|
* @param[in] pData points to the matrix data array.
|
||||||
|
*/
|
||||||
|
void arm_mat_init_f32(
|
||||||
|
arm_matrix_instance_f32 * S,
|
||||||
|
uint16_t nRows,
|
||||||
|
uint16_t nColumns,
|
||||||
|
float32_t * pData);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix inverse.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] dst points to the instance of the output floating-point matrix structure.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_inverse_f32(
|
||||||
|
const arm_matrix_instance_f32 * src,
|
||||||
|
arm_matrix_instance_f32 * dst);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix inverse.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] dst points to the instance of the output floating-point matrix structure.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_inverse_f64(
|
||||||
|
const arm_matrix_instance_f64 * src,
|
||||||
|
arm_matrix_instance_f64 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] dst points to the instance of the output floating-point matrix structure.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE.
|
||||||
|
* If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition.
|
||||||
|
* The decomposition is returning a lower triangular matrix.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cholesky_f64(
|
||||||
|
const arm_matrix_instance_f64 * src,
|
||||||
|
arm_matrix_instance_f64 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] dst points to the instance of the output floating-point matrix structure.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE.
|
||||||
|
* If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition.
|
||||||
|
* The decomposition is returning a lower triangular matrix.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cholesky_f32(
|
||||||
|
const arm_matrix_instance_f32 * src,
|
||||||
|
arm_matrix_instance_f32 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Solve UT . X = A where UT is an upper triangular matrix
|
||||||
|
* @param[in] ut The upper triangular matrix
|
||||||
|
* @param[in] a The matrix a
|
||||||
|
* @param[out] dst The solution X of UT . X = A
|
||||||
|
* @return The function returns ARM_MATH_SINGULAR, if the system can't be solved.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_solve_upper_triangular_f32(
|
||||||
|
const arm_matrix_instance_f32 * ut,
|
||||||
|
const arm_matrix_instance_f32 * a,
|
||||||
|
arm_matrix_instance_f32 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Solve LT . X = A where LT is a lower triangular matrix
|
||||||
|
* @param[in] lt The lower triangular matrix
|
||||||
|
* @param[in] a The matrix a
|
||||||
|
* @param[out] dst The solution X of LT . X = A
|
||||||
|
* @return The function returns ARM_MATH_SINGULAR, if the system can't be solved.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_solve_lower_triangular_f32(
|
||||||
|
const arm_matrix_instance_f32 * lt,
|
||||||
|
const arm_matrix_instance_f32 * a,
|
||||||
|
arm_matrix_instance_f32 * dst);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Solve UT . X = A where UT is an upper triangular matrix
|
||||||
|
* @param[in] ut The upper triangular matrix
|
||||||
|
* @param[in] a The matrix a
|
||||||
|
* @param[out] dst The solution X of UT . X = A
|
||||||
|
* @return The function returns ARM_MATH_SINGULAR, if the system can't be solved.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_solve_upper_triangular_f64(
|
||||||
|
const arm_matrix_instance_f64 * ut,
|
||||||
|
const arm_matrix_instance_f64 * a,
|
||||||
|
arm_matrix_instance_f64 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Solve LT . X = A where LT is a lower triangular matrix
|
||||||
|
* @param[in] lt The lower triangular matrix
|
||||||
|
* @param[in] a The matrix a
|
||||||
|
* @param[out] dst The solution X of LT . X = A
|
||||||
|
* @return The function returns ARM_MATH_SINGULAR, if the system can't be solved.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_solve_lower_triangular_f64(
|
||||||
|
const arm_matrix_instance_f64 * lt,
|
||||||
|
const arm_matrix_instance_f64 * a,
|
||||||
|
arm_matrix_instance_f64 * dst);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point LDL decomposition of Symmetric Positive Semi-Definite Matrix.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] l points to the instance of the output floating-point triangular matrix structure.
|
||||||
|
* @param[out] d points to the instance of the output floating-point diagonal matrix structure.
|
||||||
|
* @param[out] p points to the instance of the output floating-point permutation vector.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE.
|
||||||
|
* The decomposition is returning a lower triangular matrix.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_ldlt_f32(
|
||||||
|
const arm_matrix_instance_f32 * src,
|
||||||
|
arm_matrix_instance_f32 * l,
|
||||||
|
arm_matrix_instance_f32 * d,
|
||||||
|
uint16_t * pp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point LDL decomposition of Symmetric Positive Semi-Definite Matrix.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] l points to the instance of the output floating-point triangular matrix structure.
|
||||||
|
* @param[out] d points to the instance of the output floating-point diagonal matrix structure.
|
||||||
|
* @param[out] p points to the instance of the output floating-point permutation vector.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE.
|
||||||
|
* The decomposition is returning a lower triangular matrix.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_ldlt_f64(
|
||||||
|
const arm_matrix_instance_f64 * src,
|
||||||
|
arm_matrix_instance_f64 * l,
|
||||||
|
arm_matrix_instance_f64 * d,
|
||||||
|
uint16_t * pp);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _MATRIX_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,221 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file matrix_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _MATRIX_FUNCTIONS_F16_H_
|
||||||
|
#define _MATRIX_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point matrix structure.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t numRows; /**< number of rows of the matrix. */
|
||||||
|
uint16_t numCols; /**< number of columns of the matrix. */
|
||||||
|
float16_t *pData; /**< points to the data of the matrix. */
|
||||||
|
} arm_matrix_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix addition.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_add_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrcA,
|
||||||
|
const arm_matrix_instance_f16 * pSrcB,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point, complex, matrix multiplication.
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_mult_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrcA,
|
||||||
|
const arm_matrix_instance_f16 * pSrcB,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_trans_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrc,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point complex matrix transpose.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
|
||||||
|
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cmplx_trans_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrc,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix multiplication
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_mult_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrcA,
|
||||||
|
const arm_matrix_instance_f16 * pSrcB,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix and vector multiplication
|
||||||
|
* @param[in] pSrcMat points to the input matrix structure
|
||||||
|
* @param[in] pVec points to vector
|
||||||
|
* @param[out] pDst points to output vector
|
||||||
|
*/
|
||||||
|
void arm_mat_vec_mult_f16(
|
||||||
|
const arm_matrix_instance_f16 *pSrcMat,
|
||||||
|
const float16_t *pVec,
|
||||||
|
float16_t *pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix subtraction
|
||||||
|
* @param[in] pSrcA points to the first input matrix structure
|
||||||
|
* @param[in] pSrcB points to the second input matrix structure
|
||||||
|
* @param[out] pDst points to output matrix structure
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_sub_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrcA,
|
||||||
|
const arm_matrix_instance_f16 * pSrcB,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix scaling.
|
||||||
|
* @param[in] pSrc points to the input matrix
|
||||||
|
* @param[in] scale scale factor
|
||||||
|
* @param[out] pDst points to the output matrix
|
||||||
|
* @return The function returns either
|
||||||
|
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_scale_f16(
|
||||||
|
const arm_matrix_instance_f16 * pSrc,
|
||||||
|
float16_t scale,
|
||||||
|
arm_matrix_instance_f16 * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix initialization.
|
||||||
|
* @param[in,out] S points to an instance of the floating-point matrix structure.
|
||||||
|
* @param[in] nRows number of rows in the matrix.
|
||||||
|
* @param[in] nColumns number of columns in the matrix.
|
||||||
|
* @param[in] pData points to the matrix data array.
|
||||||
|
*/
|
||||||
|
void arm_mat_init_f16(
|
||||||
|
arm_matrix_instance_f16 * S,
|
||||||
|
uint16_t nRows,
|
||||||
|
uint16_t nColumns,
|
||||||
|
float16_t * pData);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point matrix inverse.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] dst points to the instance of the output floating-point matrix structure.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_inverse_f16(
|
||||||
|
const arm_matrix_instance_f16 * src,
|
||||||
|
arm_matrix_instance_f16 * dst);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix.
|
||||||
|
* @param[in] src points to the instance of the input floating-point matrix structure.
|
||||||
|
* @param[out] dst points to the instance of the output floating-point matrix structure.
|
||||||
|
* @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
|
||||||
|
* If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE.
|
||||||
|
* If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition.
|
||||||
|
* The decomposition is returning a lower triangular matrix.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_cholesky_f16(
|
||||||
|
const arm_matrix_instance_f16 * src,
|
||||||
|
arm_matrix_instance_f16 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Solve UT . X = A where UT is an upper triangular matrix
|
||||||
|
* @param[in] ut The upper triangular matrix
|
||||||
|
* @param[in] a The matrix a
|
||||||
|
* @param[out] dst The solution X of UT . X = A
|
||||||
|
* @return The function returns ARM_MATH_SINGULAR, if the system can't be solved.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_solve_upper_triangular_f16(
|
||||||
|
const arm_matrix_instance_f16 * ut,
|
||||||
|
const arm_matrix_instance_f16 * a,
|
||||||
|
arm_matrix_instance_f16 * dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Solve LT . X = A where LT is a lower triangular matrix
|
||||||
|
* @param[in] lt The lower triangular matrix
|
||||||
|
* @param[in] a The matrix a
|
||||||
|
* @param[out] dst The solution X of LT . X = A
|
||||||
|
* @return The function returns ARM_MATH_SINGULAR, if the system can't be solved.
|
||||||
|
*/
|
||||||
|
arm_status arm_mat_solve_lower_triangular_f16(
|
||||||
|
const arm_matrix_instance_f16 * lt,
|
||||||
|
const arm_matrix_instance_f16 * a,
|
||||||
|
arm_matrix_instance_f16 * dst);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _MATRIX_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,576 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file none.h
|
||||||
|
* @brief Intrinsincs when no DSP extension available
|
||||||
|
* @version V1.9.0
|
||||||
|
* @date 20. July 2020
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Definitions in this file are allowing to reuse some versions of the
|
||||||
|
CMSIS-DSP to build on a core (M0 for instance) or a host where
|
||||||
|
DSP extension are not available.
|
||||||
|
|
||||||
|
Ideally a pure C version should have been used instead.
|
||||||
|
But those are not always available or use a restricted set
|
||||||
|
of intrinsics.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _NONE_H_
|
||||||
|
#define _NONE_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Normally those kind of definitions are in a compiler file
|
||||||
|
in Core or Core_A.
|
||||||
|
|
||||||
|
But for MSVC compiler it is a bit special. The goal is very specific
|
||||||
|
to CMSIS-DSP and only to allow the use of this library from other
|
||||||
|
systems like Python or Matlab.
|
||||||
|
|
||||||
|
MSVC is not going to be used to cross-compile to ARM. So, having a MSVC
|
||||||
|
compiler file in Core or Core_A would not make sense.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#if defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) || defined(__APPLE_CC__)
|
||||||
|
__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data)
|
||||||
|
{
|
||||||
|
if (data == 0U) { return 32U; }
|
||||||
|
|
||||||
|
uint32_t count = 0U;
|
||||||
|
uint32_t mask = 0x80000000U;
|
||||||
|
|
||||||
|
while ((data & mask) == 0U)
|
||||||
|
{
|
||||||
|
count += 1U;
|
||||||
|
mask = mask >> 1U;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if ((sat >= 1U) && (sat <= 32U))
|
||||||
|
{
|
||||||
|
const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);
|
||||||
|
const int32_t min = -1 - max ;
|
||||||
|
if (val > max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < min)
|
||||||
|
{
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat)
|
||||||
|
{
|
||||||
|
if (sat <= 31U)
|
||||||
|
{
|
||||||
|
const uint32_t max = ((1U << sat) - 1U);
|
||||||
|
if (val > (int32_t)max)
|
||||||
|
{
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
else if (val < 0)
|
||||||
|
{
|
||||||
|
return 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (uint32_t)val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Rotate Right in unsigned value (32 bit)
|
||||||
|
\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
|
||||||
|
\param [in] op1 Value to rotate
|
||||||
|
\param [in] op2 Number of Bits to rotate
|
||||||
|
\return Rotated value
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
|
||||||
|
{
|
||||||
|
op2 %= 32U;
|
||||||
|
if (op2 == 0U)
|
||||||
|
{
|
||||||
|
return op1;
|
||||||
|
}
|
||||||
|
return (op1 >> op2) | (op1 << (32U - op2));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clips Q63 to Q31 values.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q31_t clip_q63_to_q31(
|
||||||
|
q63_t x)
|
||||||
|
{
|
||||||
|
return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
|
||||||
|
((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clips Q63 to Q15 values.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q15_t clip_q63_to_q15(
|
||||||
|
q63_t x)
|
||||||
|
{
|
||||||
|
return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
|
||||||
|
((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clips Q31 to Q7 values.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q7_t clip_q31_to_q7(
|
||||||
|
q31_t x)
|
||||||
|
{
|
||||||
|
return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ?
|
||||||
|
((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Clips Q31 to Q15 values.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q15_t clip_q31_to_q15(
|
||||||
|
q31_t x)
|
||||||
|
{
|
||||||
|
return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ?
|
||||||
|
((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE q63_t mult32x64(
|
||||||
|
q63_t x,
|
||||||
|
q31_t y)
|
||||||
|
{
|
||||||
|
return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) +
|
||||||
|
(((q63_t) (x >> 32) * y) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* SMMLAR */
|
||||||
|
#define multAcc_32x32_keep32_R(a, x, y) \
|
||||||
|
a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)
|
||||||
|
|
||||||
|
/* SMMLSR */
|
||||||
|
#define multSub_32x32_keep32_R(a, x, y) \
|
||||||
|
a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32)
|
||||||
|
|
||||||
|
/* SMMULR */
|
||||||
|
#define mult_32x32_keep32_R(a, x, y) \
|
||||||
|
a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32)
|
||||||
|
|
||||||
|
/* SMMLA */
|
||||||
|
#define multAcc_32x32_keep32(a, x, y) \
|
||||||
|
a += (q31_t) (((q63_t) x * y) >> 32)
|
||||||
|
|
||||||
|
/* SMMLS */
|
||||||
|
#define multSub_32x32_keep32(a, x, y) \
|
||||||
|
a -= (q31_t) (((q63_t) x * y) >> 32)
|
||||||
|
|
||||||
|
/* SMMUL */
|
||||||
|
#define mult_32x32_keep32(a, x, y) \
|
||||||
|
a = (q31_t) (((q63_t) x * y ) >> 32)
|
||||||
|
|
||||||
|
#ifndef ARM_MATH_DSP
|
||||||
|
/**
|
||||||
|
* @brief definition to pack two 16 bit values.
|
||||||
|
*/
|
||||||
|
#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \
|
||||||
|
(((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) )
|
||||||
|
#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \
|
||||||
|
(((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief definition to pack four 8 bit values.
|
||||||
|
*/
|
||||||
|
#ifndef ARM_MATH_BIG_ENDIAN
|
||||||
|
#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \
|
||||||
|
(((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \
|
||||||
|
(((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \
|
||||||
|
(((int32_t)(v3) << 24) & (int32_t)0xFF000000) )
|
||||||
|
#else
|
||||||
|
#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \
|
||||||
|
(((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \
|
||||||
|
(((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \
|
||||||
|
(((int32_t)(v0) << 24) & (int32_t)0xFF000000) )
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined intrinsic functions
|
||||||
|
*/
|
||||||
|
#if !defined (ARM_MATH_DSP)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QADD8
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __QADD8(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s, t, u;
|
||||||
|
|
||||||
|
r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
|
||||||
|
return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QSUB8
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __QSUB8(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s, t, u;
|
||||||
|
|
||||||
|
r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF;
|
||||||
|
|
||||||
|
return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QADD16
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __QADD16(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */
|
||||||
|
q31_t r = 0, s = 0;
|
||||||
|
|
||||||
|
r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SHADD16
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SHADD16(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QSUB16
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __QSUB16(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SHSUB16
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SHSUB16(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QASX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __QASX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SHASX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SHASX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QSAX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __QSAX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SHSAX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SHSAX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
q31_t r, s;
|
||||||
|
|
||||||
|
r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
|
||||||
|
|
||||||
|
return ((uint32_t)((s << 16) | (r )));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMUSDX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMUSDX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) -
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMUADX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMUADX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) +
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QADD
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE int32_t __QADD(
|
||||||
|
int32_t x,
|
||||||
|
int32_t y)
|
||||||
|
{
|
||||||
|
return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined QSUB
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE int32_t __QSUB(
|
||||||
|
int32_t x,
|
||||||
|
int32_t y)
|
||||||
|
{
|
||||||
|
return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMLAD
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMLAD(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y,
|
||||||
|
uint32_t sum)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) +
|
||||||
|
( ((q31_t)sum ) ) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMLADX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMLADX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y,
|
||||||
|
uint32_t sum)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) +
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) +
|
||||||
|
( ((q31_t)sum ) ) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMLSDX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMLSDX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y,
|
||||||
|
uint32_t sum)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) -
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) +
|
||||||
|
( ((q31_t)sum ) ) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMLALD
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint64_t __SMLALD(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y,
|
||||||
|
uint64_t sum)
|
||||||
|
{
|
||||||
|
/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */
|
||||||
|
return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) +
|
||||||
|
( ((q63_t)sum ) ) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMLALDX
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint64_t __SMLALDX(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y,
|
||||||
|
uint64_t sum)
|
||||||
|
{
|
||||||
|
/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */
|
||||||
|
return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) +
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) +
|
||||||
|
( ((q63_t)sum ) ) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMUAD
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMUAD(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMUSD
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SMUSD(
|
||||||
|
uint32_t x,
|
||||||
|
uint32_t y)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) -
|
||||||
|
((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SXTB16
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t __SXTB16(
|
||||||
|
uint32_t x)
|
||||||
|
{
|
||||||
|
return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) |
|
||||||
|
((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) ));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief C custom defined SMMLA
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE int32_t __SMMLA(
|
||||||
|
int32_t x,
|
||||||
|
int32_t y,
|
||||||
|
int32_t sum)
|
||||||
|
{
|
||||||
|
return (sum + (int32_t) (((int64_t) x * y) >> 32));
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !defined (ARM_MATH_DSP) */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _TRANSFORM_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file quaternion_math_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _QUATERNION_MATH_FUNCTIONS_H_
|
||||||
|
#define _QUATERNION_MATH_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupQuaternionMath Quaternion Math Functions
|
||||||
|
* Functions to operates on quaternions and convert between a
|
||||||
|
* rotation and quaternion representation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point quaternion Norm.
|
||||||
|
@param[in] pInputQuaternions points to the input vector of quaternions
|
||||||
|
@param[out] pNorms points to the output vector of norms
|
||||||
|
@param[in] nbQuaternions number of quaternions in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void arm_quaternion_norm_f32(const float32_t *pInputQuaternions,
|
||||||
|
float32_t *pNorms,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point quaternion inverse.
|
||||||
|
@param[in] pInputQuaternions points to the input vector of quaternions
|
||||||
|
@param[out] pInverseQuaternions points to the output vector of inverse quaternions
|
||||||
|
@param[in] nbQuaternions number of quaternions in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_quaternion_inverse_f32(const float32_t *pInputQuaternions,
|
||||||
|
float32_t *pInverseQuaternions,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point quaternion conjugates.
|
||||||
|
@param[in] pInputQuaternions points to the input vector of quaternions
|
||||||
|
@param[out] pConjugateQuaternions points to the output vector of conjugate quaternions
|
||||||
|
@param[in] nbQuaternions number of quaternions in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_quaternion_conjugate_f32(const float32_t *inputQuaternions,
|
||||||
|
float32_t *pConjugateQuaternions,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point normalization of quaternions.
|
||||||
|
@param[in] pInputQuaternions points to the input vector of quaternions
|
||||||
|
@param[out] pNormalizedQuaternions points to the output vector of normalized quaternions
|
||||||
|
@param[in] nbQuaternions number of quaternions in each vector
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_quaternion_normalize_f32(const float32_t *inputQuaternions,
|
||||||
|
float32_t *pNormalizedQuaternions,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point product of two quaternions.
|
||||||
|
@param[in] qa First quaternion
|
||||||
|
@param[in] qb Second quaternion
|
||||||
|
@param[out] r Product of two quaternions
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_quaternion_product_single_f32(const float32_t *qa,
|
||||||
|
const float32_t *qb,
|
||||||
|
float32_t *r);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Floating-point elementwise product two quaternions.
|
||||||
|
@param[in] qa First array of quaternions
|
||||||
|
@param[in] qb Second array of quaternions
|
||||||
|
@param[out] r Elementwise product of quaternions
|
||||||
|
@param[in] nbQuaternions Number of quaternions in the array
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_quaternion_product_f32(const float32_t *qa,
|
||||||
|
const float32_t *qb,
|
||||||
|
float32_t *r,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Conversion of quaternion to equivalent rotation matrix.
|
||||||
|
* @param[in] pInputQuaternions points to an array of normalized quaternions
|
||||||
|
* @param[out] pOutputRotations points to an array of 3x3 rotations (in row order)
|
||||||
|
* @param[in] nbQuaternions in the array
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
* <b>Format of rotation matrix</b>
|
||||||
|
* \par
|
||||||
|
* The quaternion a + ib + jc + kd is converted into rotation matrix:
|
||||||
|
* a^2 + b^2 - c^2 - d^2 2bc - 2ad 2bd + 2ac
|
||||||
|
* 2bc + 2ad a^2 - b^2 + c^2 - d^2 2cd - 2ab
|
||||||
|
* 2bd - 2ac 2cd + 2ab a^2 - b^2 - c^2 + d^2
|
||||||
|
*
|
||||||
|
* Rotation matrix is saved in row order : R00 R01 R02 R10 R11 R12 R20 R21 R22
|
||||||
|
*/
|
||||||
|
void arm_quaternion2rotation_f32(const float32_t *pInputQuaternions,
|
||||||
|
float32_t *pOutputRotations,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Conversion of a rotation matrix to equivalent quaternion.
|
||||||
|
* @param[in] pInputRotations points to an array 3x3 rotation matrix (in row order)
|
||||||
|
* @param[out] pOutputQuaternions points to an array of quaternions
|
||||||
|
* @param[in] nbQuaternions in the array
|
||||||
|
* @return none.
|
||||||
|
*/
|
||||||
|
void arm_rotation2quaternion_f32(const float32_t *pInputRotations,
|
||||||
|
float32_t *pOutputQuaternions,
|
||||||
|
uint32_t nbQuaternions);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _QUATERNION_MATH_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,977 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file statistics_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _STATISTICS_FUNCTIONS_H_
|
||||||
|
#define _STATISTICS_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/basic_math_functions.h"
|
||||||
|
#include "dsp/fast_math_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupStats Statistics Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Computation of the LogSumExp
|
||||||
|
*
|
||||||
|
* In probabilistic computations, the dynamic of the probability values can be very
|
||||||
|
* wide because they come from gaussian functions.
|
||||||
|
* To avoid underflow and overflow issues, the values are represented by their log.
|
||||||
|
* In this representation, multiplying the original exp values is easy : their logs are added.
|
||||||
|
* But adding the original exp values is requiring some special handling and it is the
|
||||||
|
* goal of the LogSumExp function.
|
||||||
|
*
|
||||||
|
* If the values are x1...xn, the function is computing:
|
||||||
|
*
|
||||||
|
* ln(exp(x1) + ... + exp(xn)) and the computation is done in such a way that
|
||||||
|
* rounding issues are minimised.
|
||||||
|
*
|
||||||
|
* The max xm of the values is extracted and the function is computing:
|
||||||
|
* xm + ln(exp(x1 - xm) + ... + exp(xn - xm))
|
||||||
|
*
|
||||||
|
* @param[in] *in Pointer to an array of input values.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return LogSumExp
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product with log arithmetic
|
||||||
|
*
|
||||||
|
* Vectors are containing the log of the samples
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[in] pTmpBuffer temporary buffer of length blockSize
|
||||||
|
* @return The log of the dot product .
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t *pTmpBuffer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Entropy
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA Array of input values.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Entropy -Sum(p ln p)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Entropy
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA Array of input values.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Entropy -Sum(p ln p)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Kullback-Leibler
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA Pointer to an array of input values for probability distribution A.
|
||||||
|
* @param[in] pSrcB Pointer to an array of input values for probability distribution B.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Kullback-Leibler Divergence D(A || B)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_kullback_leibler_f32(const float32_t * pSrcA
|
||||||
|
,const float32_t * pSrcB
|
||||||
|
,uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Kullback-Leibler
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA Pointer to an array of input values for probability distribution A.
|
||||||
|
* @param[in] pSrcB Pointer to an array of input values for probability distribution B.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Kullback-Leibler Divergence D(A || B)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float64_t arm_kullback_leibler_f64(const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sum of the squares of the elements of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_power_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q63_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sum of the squares of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_power_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sum of the squares of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_power_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sum of the squares of the elements of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_power_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q63_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sum of the squares of the elements of a Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_power_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mean value of a Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_mean_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mean value of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_mean_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mean value of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_mean_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mean value of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_mean_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mean value of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_mean_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Variance of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_var_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Variance of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_var_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Variance of the elements of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_var_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Variance of the elements of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_var_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Root Mean Square of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_rms_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Root Mean Square of the elements of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_rms_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Root Mean Square of the elements of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_rms_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Standard deviation of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_std_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Standard deviation of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_std_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Standard deviation of the elements of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_std_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Standard deviation of the elements of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_std_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of a Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] result is output pointer
|
||||||
|
* @param[in] index is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_min_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * result,
|
||||||
|
uint32_t * index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] result is output pointer
|
||||||
|
* @param[in] index is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_absmin_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * result,
|
||||||
|
uint32_t * index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] result is output pointer
|
||||||
|
*/
|
||||||
|
void arm_absmin_no_idx_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * result);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[in] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_min_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[in] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_absmin_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
*/
|
||||||
|
void arm_absmin_no_idx_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_min_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_absmin_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
*/
|
||||||
|
void arm_absmin_no_idx_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_min_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_absmin_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
*/
|
||||||
|
void arm_absmin_no_idx_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_min_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_absmin_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
*/
|
||||||
|
void arm_absmin_no_idx_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a Q7 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_max_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a Q7 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a Q7 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_no_idx_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a Q15 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_max_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a Q15 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a Q15 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_no_idx_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a Q31 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_max_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a Q31 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a Q31 vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_no_idx_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_max_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_no_idx_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_max_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_no_idx_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Maximum value of a floating-point vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult maximum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_max_no_idx_f32(
|
||||||
|
const float32_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Minimum value of a floating-point vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult minimum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_min_no_idx_f32(
|
||||||
|
const float32_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Maximum value of a floating-point vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult maximum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_max_no_idx_f64(
|
||||||
|
const float64_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Maximum value of a q31 vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult maximum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_max_no_idx_q31(
|
||||||
|
const q31_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Maximum value of a q15 vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult maximum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_max_no_idx_q15(
|
||||||
|
const q15_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Maximum value of a q7 vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult maximum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_max_no_idx_q7(
|
||||||
|
const q7_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Minimum value of a floating-point vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult minimum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_min_no_idx_f64(
|
||||||
|
const float64_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Minimum value of a q31 vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult minimum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_min_no_idx_q31(
|
||||||
|
const q31_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Minimum value of a q15 vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult minimum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_min_no_idx_q15(
|
||||||
|
const q15_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Minimum value of a q7 vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult minimum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_min_no_idx_q7(
|
||||||
|
const q7_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Mean square error between two Q7 vectors.
|
||||||
|
@param[in] pSrcA points to the first input vector
|
||||||
|
@param[in] pSrcB points to the second input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult mean square error
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_mse_q7(
|
||||||
|
const q7_t * pSrcA,
|
||||||
|
const q7_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q7_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Mean square error between two Q15 vectors.
|
||||||
|
@param[in] pSrcA points to the first input vector
|
||||||
|
@param[in] pSrcB points to the second input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult mean square error
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_mse_q15(
|
||||||
|
const q15_t * pSrcA,
|
||||||
|
const q15_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q15_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Mean square error between two Q31 vectors.
|
||||||
|
@param[in] pSrcA points to the first input vector
|
||||||
|
@param[in] pSrcB points to the second input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult mean square error
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_mse_q31(
|
||||||
|
const q31_t * pSrcA,
|
||||||
|
const q31_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
q31_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Mean square error between two single precision float vectors.
|
||||||
|
@param[in] pSrcA points to the first input vector
|
||||||
|
@param[in] pSrcB points to the second input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult mean square error
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_mse_f32(
|
||||||
|
const float32_t * pSrcA,
|
||||||
|
const float32_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float32_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Mean square error between two double precision float vectors.
|
||||||
|
@param[in] pSrcA points to the first input vector
|
||||||
|
@param[in] pSrcB points to the second input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult mean square error
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_mse_f64(
|
||||||
|
const float64_t * pSrcA,
|
||||||
|
const float64_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float64_t * pResult);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _STATISTICS_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file statistics_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _STATISTICS_FUNCTIONS_F16_H_
|
||||||
|
#define _STATISTICS_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/basic_math_functions_f16.h"
|
||||||
|
#include "dsp/fast_math_functions_f16.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sum of the squares of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_power_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Mean value of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_mean_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Variance of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_var_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Root Mean Square of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_rms_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Standard deviation of the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output value.
|
||||||
|
*/
|
||||||
|
void arm_std_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_min_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
* @param[out] pIndex is the array index of the minimum value in the input buffer.
|
||||||
|
*/
|
||||||
|
void arm_absmin_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_max_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
* @param[out] pIndex index of maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult,
|
||||||
|
uint32_t * pIndex);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Minimum value of absolute values of a floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
* @param[out] pResult is output pointer
|
||||||
|
*/
|
||||||
|
void arm_absmin_no_idx_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Maximum value of a floating-point vector.
|
||||||
|
* @param[in] pSrc points to the input buffer
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
* @param[out] pResult maximum value returned here
|
||||||
|
*/
|
||||||
|
void arm_absmax_no_idx_f16(
|
||||||
|
const float16_t * pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Entropy
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA Array of input values.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Entropy -Sum(p ln p)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float16_t arm_entropy_f16(const float16_t * pSrcA,uint32_t blockSize);
|
||||||
|
|
||||||
|
float16_t arm_logsumexp_f16(const float16_t *in, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Dot product with log arithmetic
|
||||||
|
*
|
||||||
|
* Vectors are containing the log of the samples
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA points to the first input vector
|
||||||
|
* @param[in] pSrcB points to the second input vector
|
||||||
|
* @param[in] blockSize number of samples in each vector
|
||||||
|
* @param[in] pTmpBuffer temporary buffer of length blockSize
|
||||||
|
* @return The log of the dot product .
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
float16_t arm_logsumexp_dot_prod_f16(const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t *pTmpBuffer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Kullback-Leibler
|
||||||
|
*
|
||||||
|
* @param[in] pSrcA Pointer to an array of input values for probability distribution A.
|
||||||
|
* @param[in] pSrcB Pointer to an array of input values for probability distribution B.
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Kullback-Leibler Divergence D(A || B)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_kullback_leibler_f16(const float16_t * pSrcA
|
||||||
|
,const float16_t * pSrcB
|
||||||
|
,uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Maximum value of a floating-point vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult maximum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_max_no_idx_f16(
|
||||||
|
const float16_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Minimum value of a floating-point vector.
|
||||||
|
@param[in] pSrc points to the input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult minimum value returned here
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_min_no_idx_f16(
|
||||||
|
const float16_t *pSrc,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t *pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Mean square error between two half precision float vectors.
|
||||||
|
@param[in] pSrcA points to the first input vector
|
||||||
|
@param[in] pSrcB points to the second input vector
|
||||||
|
@param[in] blockSize number of samples in input vector
|
||||||
|
@param[out] pResult mean square error
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_mse_f16(
|
||||||
|
const float16_t * pSrcA,
|
||||||
|
const float16_t * pSrcB,
|
||||||
|
uint32_t blockSize,
|
||||||
|
float16_t * pResult);
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _STATISTICS_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,453 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file support_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SUPPORT_FUNCTIONS_H_
|
||||||
|
#define _SUPPORT_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupSupport Support Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q31 vector.
|
||||||
|
* @param[in] pSrc points to the floating-point input vector
|
||||||
|
* @param[out] pDst points to the Q31 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_float_to_q31(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q15 vector.
|
||||||
|
* @param[in] pSrc points to the floating-point input vector
|
||||||
|
* @param[out] pDst points to the Q15 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_float_to_q15(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q7 vector.
|
||||||
|
* @param[in] pSrc points to the floating-point input vector
|
||||||
|
* @param[out] pDst points to the Q7 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_float_to_q7(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q31 vector to floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q31_to_float(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q31 vector to Q15 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q31_to_q15(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q31 vector to Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q31_to_q7(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q15 vector to floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q15_to_float(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q15 vector to Q31 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q15_to_q31(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q15 vector to Q7 vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q15_to_q7(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q7 vector to floating-point vector.
|
||||||
|
* @param[in] pSrc is input pointer
|
||||||
|
* @param[out] pDst is output pointer
|
||||||
|
* @param[in] blockSize is the number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q7_to_float(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q7 vector to Q31 vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q7_to_q31(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the Q7 vector to Q15 vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_q7_to_q15(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Struct for specifying sorting algorithm
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ARM_SORT_BITONIC = 0,
|
||||||
|
/**< Bitonic sort */
|
||||||
|
ARM_SORT_BUBBLE = 1,
|
||||||
|
/**< Bubble sort */
|
||||||
|
ARM_SORT_HEAP = 2,
|
||||||
|
/**< Heap sort */
|
||||||
|
ARM_SORT_INSERTION = 3,
|
||||||
|
/**< Insertion sort */
|
||||||
|
ARM_SORT_QUICK = 4,
|
||||||
|
/**< Quick sort */
|
||||||
|
ARM_SORT_SELECTION = 5
|
||||||
|
/**< Selection sort */
|
||||||
|
} arm_sort_alg;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Struct for specifying sorting algorithm
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ARM_SORT_DESCENDING = 0,
|
||||||
|
/**< Descending order (9 to 0) */
|
||||||
|
ARM_SORT_ASCENDING = 1
|
||||||
|
/**< Ascending order (0 to 9) */
|
||||||
|
} arm_sort_dir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the sorting algorithms.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arm_sort_alg alg; /**< Sorting algorithm selected */
|
||||||
|
arm_sort_dir dir; /**< Sorting order (direction) */
|
||||||
|
} arm_sort_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in,out] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] alg Selected algorithm.
|
||||||
|
* @param[in] dir Sorting order.
|
||||||
|
*/
|
||||||
|
void arm_sort_init_f32(
|
||||||
|
arm_sort_instance_f32 * S,
|
||||||
|
arm_sort_alg alg,
|
||||||
|
arm_sort_dir dir);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the sorting algorithms.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arm_sort_dir dir; /**< Sorting order (direction) */
|
||||||
|
float32_t * buffer; /**< Working buffer */
|
||||||
|
} arm_merge_sort_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in,out] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_merge_sort_f32(
|
||||||
|
const arm_merge_sort_instance_f32 * S,
|
||||||
|
float32_t *pSrc,
|
||||||
|
float32_t *pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in,out] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] dir Sorting order.
|
||||||
|
* @param[in] buffer Working buffer.
|
||||||
|
*/
|
||||||
|
void arm_merge_sort_init_f32(
|
||||||
|
arm_merge_sort_instance_f32 * S,
|
||||||
|
arm_sort_dir dir,
|
||||||
|
float32_t * buffer);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_copy_f32(
|
||||||
|
const float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_copy_f64(
|
||||||
|
const float64_t * pSrc,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies the elements of a Q7 vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_copy_q7(
|
||||||
|
const q7_t * pSrc,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies the elements of a Q15 vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_copy_q15(
|
||||||
|
const q15_t * pSrc,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies the elements of a Q31 vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_copy_q31(
|
||||||
|
const q31_t * pSrc,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fills a constant value into a floating-point vector.
|
||||||
|
* @param[in] value input value to be filled
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_fill_f32(
|
||||||
|
float32_t value,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fills a constant value into a floating-point vector.
|
||||||
|
* @param[in] value input value to be filled
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_fill_f64(
|
||||||
|
float64_t value,
|
||||||
|
float64_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fills a constant value into a Q7 vector.
|
||||||
|
* @param[in] value input value to be filled
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_fill_q7(
|
||||||
|
q7_t value,
|
||||||
|
q7_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fills a constant value into a Q15 vector.
|
||||||
|
* @param[in] value input value to be filled
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_fill_q15(
|
||||||
|
q15_t value,
|
||||||
|
q15_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fills a constant value into a Q31 vector.
|
||||||
|
* @param[in] value input value to be filled
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_fill_q31(
|
||||||
|
q31_t value,
|
||||||
|
q31_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Weighted sum
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param[in] *in Array of input values.
|
||||||
|
* @param[in] *weigths Weights
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Weighted sum
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float32_t arm_weighted_sum_f32(const float32_t *in
|
||||||
|
, const float32_t *weigths
|
||||||
|
, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barycenter
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param[in] in List of vectors
|
||||||
|
* @param[in] weights Weights of the vectors
|
||||||
|
* @param[out] out Barycenter
|
||||||
|
* @param[in] nbVectors Number of vectors
|
||||||
|
* @param[in] vecDim Dimension of space (vector dimension)
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_barycenter_f32(const float32_t *in
|
||||||
|
, const float32_t *weights
|
||||||
|
, float32_t *out
|
||||||
|
, uint32_t nbVectors
|
||||||
|
, uint32_t vecDim);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _SUPPORT_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,187 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file support_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SUPPORT_FUNCTIONS_F16_H_
|
||||||
|
#define _SUPPORT_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Copies the elements of a floating-point vector.
|
||||||
|
* @param[in] pSrc input pointer
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_copy_f16(const float16_t * pSrc, float16_t * pDst, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Fills a constant value into a floating-point vector.
|
||||||
|
* @param[in] value input value to be filled
|
||||||
|
* @param[out] pDst output pointer
|
||||||
|
* @param[in] blockSize number of samples to process
|
||||||
|
*/
|
||||||
|
void arm_fill_f16(float16_t value, float16_t * pDst, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q31 vector.
|
||||||
|
* @param[in] pSrc points to the f16 input vector
|
||||||
|
* @param[out] pDst points to the q15 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_f16_to_q15(const float16_t * pSrc, q15_t * pDst, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q31 vector.
|
||||||
|
* @param[in] pSrc points to the q15 input vector
|
||||||
|
* @param[out] pDst points to the f16 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_q15_to_f16(const q15_t * pSrc, float16_t * pDst, uint32_t blockSize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q31 vector.
|
||||||
|
* @param[in] pSrc points to the f32 input vector
|
||||||
|
* @param[out] pDst points to the f16 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_float_to_f16(const float32_t * pSrc, float16_t * pDst, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Converts the elements of the floating-point vector to Q31 vector.
|
||||||
|
* @param[in] pSrc points to the f16 input vector
|
||||||
|
* @param[out] pDst points to the f32 output vector
|
||||||
|
* @param[in] blockSize length of the input vector
|
||||||
|
*/
|
||||||
|
void arm_f16_to_float(const float16_t * pSrc, float32_t * pDst, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Weighted sum
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param[in] *in Array of input values.
|
||||||
|
* @param[in] *weigths Weights
|
||||||
|
* @param[in] blockSize Number of samples in the input array.
|
||||||
|
* @return Weighted sum
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
float16_t arm_weighted_sum_f16(const float16_t *in
|
||||||
|
, const float16_t *weigths
|
||||||
|
, uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Barycenter
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @param[in] in List of vectors
|
||||||
|
* @param[in] weights Weights of the vectors
|
||||||
|
* @param[out] out Barycenter
|
||||||
|
* @param[in] nbVectors Number of vectors
|
||||||
|
* @param[in] vecDim Dimension of space (vector dimension)
|
||||||
|
* @return None
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_barycenter_f16(const float16_t *in
|
||||||
|
, const float16_t *weights
|
||||||
|
, float16_t *out
|
||||||
|
, uint32_t nbVectors
|
||||||
|
, uint32_t vecDim);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@ingroup groupSupport
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup typecast Typecasting
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@addtogroup typecast
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Interpret a f16 as an s16 value
|
||||||
|
* @param[in] x input value.
|
||||||
|
* @return return value.
|
||||||
|
*
|
||||||
|
* @par Description
|
||||||
|
* It is a typecast. No conversion of the float to int is done.
|
||||||
|
* The memcpy will be optimized out by the compiler.
|
||||||
|
* memcpy is used to prevent type punning issues.
|
||||||
|
* With gcc, -fno-builtins MUST not be used or the
|
||||||
|
* memcpy will not be optimized out.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE int16_t arm_typecast_s16_f16(float16_t x)
|
||||||
|
{
|
||||||
|
int16_t res;
|
||||||
|
res=*(int16_t*)memcpy((char*)&res,(char*)&x,sizeof(float16_t));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Interpret an s16 as an f16 value
|
||||||
|
* @param[in] x input value.
|
||||||
|
* @return return value.
|
||||||
|
*
|
||||||
|
* @par Description
|
||||||
|
* It is a typecast. No conversion of the int to float is done.
|
||||||
|
* The memcpy will be optimized out by the compiler.
|
||||||
|
* memcpy is used to prevent type punning issues.
|
||||||
|
* With gcc, -fno-builtins MUST not be used or the
|
||||||
|
* memcpy will not be optimized out.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE float16_t arm_typecast_f16_s16(int16_t x)
|
||||||
|
{
|
||||||
|
float16_t res;
|
||||||
|
res=*(float16_t*)memcpy((char*)&res,(char*)&x,sizeof(int16_t));
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@} end of typecast group
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _SUPPORT_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file svm_defines.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SVM_DEFINES_H_
|
||||||
|
#define _SVM_DEFINES_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Struct for specifying SVM Kernel
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
ARM_ML_KERNEL_LINEAR = 0,
|
||||||
|
/**< Linear kernel */
|
||||||
|
ARM_ML_KERNEL_POLYNOMIAL = 1,
|
||||||
|
/**< Polynomial kernel */
|
||||||
|
ARM_ML_KERNEL_RBF = 2,
|
||||||
|
/**< Radial Basis Function kernel */
|
||||||
|
ARM_ML_KERNEL_SIGMOID = 3
|
||||||
|
/**< Sigmoid kernel */
|
||||||
|
} arm_ml_kernel_type;
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,299 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file svm_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SVM_FUNCTIONS_H_
|
||||||
|
#define _SVM_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
#include "dsp/svm_defines.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define STEP(x) (x) <= 0 ? 0 : 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupSVM SVM Functions
|
||||||
|
* This set of functions is implementing SVM classification on 2 classes.
|
||||||
|
* The training must be done from scikit-learn. The parameters can be easily
|
||||||
|
* generated from the scikit-learn object. Some examples are given in
|
||||||
|
* DSP/Testing/PatternGeneration/SVM.py
|
||||||
|
*
|
||||||
|
* If more than 2 classes are needed, the functions in this folder
|
||||||
|
* will have to be used, as building blocks, to do multi-class classification.
|
||||||
|
*
|
||||||
|
* No multi-class classification is provided in this SVM folder.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Integer exponentiation
|
||||||
|
* @param[in] x value
|
||||||
|
* @param[in] nb integer exponent >= 1
|
||||||
|
* @return x^nb
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE float32_t arm_exponent_f32(float32_t x, int32_t nb)
|
||||||
|
{
|
||||||
|
float32_t r = x;
|
||||||
|
nb --;
|
||||||
|
while(nb > 0)
|
||||||
|
{
|
||||||
|
r = r * x;
|
||||||
|
nb--;
|
||||||
|
}
|
||||||
|
return(r);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for linear SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float32_t intercept; /**< Intercept */
|
||||||
|
const float32_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float32_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
} arm_svm_linear_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for polynomial SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float32_t intercept; /**< Intercept */
|
||||||
|
const float32_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float32_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
int32_t degree; /**< Polynomial degree */
|
||||||
|
float32_t coef0; /**< Polynomial constant */
|
||||||
|
float32_t gamma; /**< Gamma factor */
|
||||||
|
} arm_svm_polynomial_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for rbf SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float32_t intercept; /**< Intercept */
|
||||||
|
const float32_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float32_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
float32_t gamma; /**< Gamma factor */
|
||||||
|
} arm_svm_rbf_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for sigmoid SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float32_t intercept; /**< Intercept */
|
||||||
|
const float32_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float32_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
float32_t coef0; /**< Independent constant */
|
||||||
|
float32_t gamma; /**< Gamma factor */
|
||||||
|
} arm_svm_sigmoid_instance_f32;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM linear instance init function
|
||||||
|
* @param[in] S Parameters for SVM functions
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float32_t intercept,
|
||||||
|
const float32_t *dualCoefficients,
|
||||||
|
const float32_t *supportVectors,
|
||||||
|
const int32_t *classes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM linear prediction
|
||||||
|
* @param[in] S Pointer to an instance of the linear SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult Decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S,
|
||||||
|
const float32_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM polynomial instance init function
|
||||||
|
* @param[in] S points to an instance of the polynomial SVM structure.
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @param[in] degree Polynomial degree
|
||||||
|
* @param[in] coef0 coeff0 (scikit-learn terminology)
|
||||||
|
* @param[in] gamma gamma (scikit-learn terminology)
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float32_t intercept,
|
||||||
|
const float32_t *dualCoefficients,
|
||||||
|
const float32_t *supportVectors,
|
||||||
|
const int32_t *classes,
|
||||||
|
int32_t degree,
|
||||||
|
float32_t coef0,
|
||||||
|
float32_t gamma
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM polynomial prediction
|
||||||
|
* @param[in] S Pointer to an instance of the polynomial SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult Decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S,
|
||||||
|
const float32_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM radial basis function instance init function
|
||||||
|
* @param[in] S points to an instance of the polynomial SVM structure.
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @param[in] gamma gamma (scikit-learn terminology)
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float32_t intercept,
|
||||||
|
const float32_t *dualCoefficients,
|
||||||
|
const float32_t *supportVectors,
|
||||||
|
const int32_t *classes,
|
||||||
|
float32_t gamma
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM rbf prediction
|
||||||
|
* @param[in] S Pointer to an instance of the rbf SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S,
|
||||||
|
const float32_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM sigmoid instance init function
|
||||||
|
* @param[in] S points to an instance of the rbf SVM structure.
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @param[in] coef0 coeff0 (scikit-learn terminology)
|
||||||
|
* @param[in] gamma gamma (scikit-learn terminology)
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float32_t intercept,
|
||||||
|
const float32_t *dualCoefficients,
|
||||||
|
const float32_t *supportVectors,
|
||||||
|
const int32_t *classes,
|
||||||
|
float32_t coef0,
|
||||||
|
float32_t gamma
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM sigmoid prediction
|
||||||
|
* @param[in] S Pointer to an instance of the rbf SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult Decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_svm_sigmoid_predict_f32(const arm_svm_sigmoid_instance_f32 *S,
|
||||||
|
const float32_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _SVM_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,281 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file svm_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SVM_FUNCTIONS_F16_H_
|
||||||
|
#define _SVM_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
#include "dsp/svm_defines.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
#define STEP(x) (x) <= 0 ? 0 : 1
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupSVM SVM Functions
|
||||||
|
* This set of functions is implementing SVM classification on 2 classes.
|
||||||
|
* The training must be done from scikit-learn. The parameters can be easily
|
||||||
|
* generated from the scikit-learn object. Some examples are given in
|
||||||
|
* DSP/Testing/PatternGeneration/SVM.py
|
||||||
|
*
|
||||||
|
* If more than 2 classes are needed, the functions in this folder
|
||||||
|
* will have to be used, as building blocks, to do multi-class classification.
|
||||||
|
*
|
||||||
|
* No multi-class classification is provided in this SVM folder.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for linear SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float16_t intercept; /**< Intercept */
|
||||||
|
const float16_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float16_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
} arm_svm_linear_instance_f16;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for polynomial SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float16_t intercept; /**< Intercept */
|
||||||
|
const float16_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float16_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
int32_t degree; /**< Polynomial degree */
|
||||||
|
float16_t coef0; /**< Polynomial constant */
|
||||||
|
float16_t gamma; /**< Gamma factor */
|
||||||
|
} arm_svm_polynomial_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for rbf SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float16_t intercept; /**< Intercept */
|
||||||
|
const float16_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float16_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
float16_t gamma; /**< Gamma factor */
|
||||||
|
} arm_svm_rbf_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for sigmoid SVM prediction function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t nbOfSupportVectors; /**< Number of support vectors */
|
||||||
|
uint32_t vectorDimension; /**< Dimension of vector space */
|
||||||
|
float16_t intercept; /**< Intercept */
|
||||||
|
const float16_t *dualCoefficients; /**< Dual coefficients */
|
||||||
|
const float16_t *supportVectors; /**< Support vectors */
|
||||||
|
const int32_t *classes; /**< The two SVM classes */
|
||||||
|
float16_t coef0; /**< Independent constant */
|
||||||
|
float16_t gamma; /**< Gamma factor */
|
||||||
|
} arm_svm_sigmoid_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM linear instance init function
|
||||||
|
* @param[in] S Parameters for SVM functions
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void arm_svm_linear_init_f16(arm_svm_linear_instance_f16 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float16_t intercept,
|
||||||
|
const float16_t *dualCoefficients,
|
||||||
|
const float16_t *supportVectors,
|
||||||
|
const int32_t *classes);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM linear prediction
|
||||||
|
* @param[in] S Pointer to an instance of the linear SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult Decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_svm_linear_predict_f16(const arm_svm_linear_instance_f16 *S,
|
||||||
|
const float16_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM polynomial instance init function
|
||||||
|
* @param[in] S points to an instance of the polynomial SVM structure.
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @param[in] degree Polynomial degree
|
||||||
|
* @param[in] coef0 coeff0 (scikit-learn terminology)
|
||||||
|
* @param[in] gamma gamma (scikit-learn terminology)
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
void arm_svm_polynomial_init_f16(arm_svm_polynomial_instance_f16 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float16_t intercept,
|
||||||
|
const float16_t *dualCoefficients,
|
||||||
|
const float16_t *supportVectors,
|
||||||
|
const int32_t *classes,
|
||||||
|
int32_t degree,
|
||||||
|
float16_t coef0,
|
||||||
|
float16_t gamma
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM polynomial prediction
|
||||||
|
* @param[in] S Pointer to an instance of the polynomial SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult Decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_svm_polynomial_predict_f16(const arm_svm_polynomial_instance_f16 *S,
|
||||||
|
const float16_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM radial basis function instance init function
|
||||||
|
* @param[in] S points to an instance of the polynomial SVM structure.
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @param[in] gamma gamma (scikit-learn terminology)
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_svm_rbf_init_f16(arm_svm_rbf_instance_f16 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float16_t intercept,
|
||||||
|
const float16_t *dualCoefficients,
|
||||||
|
const float16_t *supportVectors,
|
||||||
|
const int32_t *classes,
|
||||||
|
float16_t gamma
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM rbf prediction
|
||||||
|
* @param[in] S Pointer to an instance of the rbf SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_svm_rbf_predict_f16(const arm_svm_rbf_instance_f16 *S,
|
||||||
|
const float16_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM sigmoid instance init function
|
||||||
|
* @param[in] S points to an instance of the rbf SVM structure.
|
||||||
|
* @param[in] nbOfSupportVectors Number of support vectors
|
||||||
|
* @param[in] vectorDimension Dimension of vector space
|
||||||
|
* @param[in] intercept Intercept
|
||||||
|
* @param[in] dualCoefficients Array of dual coefficients
|
||||||
|
* @param[in] supportVectors Array of support vectors
|
||||||
|
* @param[in] classes Array of 2 classes ID
|
||||||
|
* @param[in] coef0 coeff0 (scikit-learn terminology)
|
||||||
|
* @param[in] gamma gamma (scikit-learn terminology)
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_svm_sigmoid_init_f16(arm_svm_sigmoid_instance_f16 *S,
|
||||||
|
uint32_t nbOfSupportVectors,
|
||||||
|
uint32_t vectorDimension,
|
||||||
|
float16_t intercept,
|
||||||
|
const float16_t *dualCoefficients,
|
||||||
|
const float16_t *supportVectors,
|
||||||
|
const int32_t *classes,
|
||||||
|
float16_t coef0,
|
||||||
|
float16_t gamma
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SVM sigmoid prediction
|
||||||
|
* @param[in] S Pointer to an instance of the rbf SVM structure.
|
||||||
|
* @param[in] in Pointer to input vector
|
||||||
|
* @param[out] pResult Decision value
|
||||||
|
* @return none.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void arm_svm_sigmoid_predict_f16(const arm_svm_sigmoid_instance_f16 *S,
|
||||||
|
const float16_t * in,
|
||||||
|
int32_t * pResult);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /*defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _SVM_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,735 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file transform_functions.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _TRANSFORM_FUNCTIONS_H_
|
||||||
|
#define _TRANSFORM_FUNCTIONS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#include "dsp/basic_math_functions.h"
|
||||||
|
#include "dsp/complex_math_functions.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @defgroup groupTransforms Transform Functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
} arm_cfft_radix2_instance_q15;
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix2_init_q15(
|
||||||
|
arm_cfft_radix2_instance_q15 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix2_q15(
|
||||||
|
const arm_cfft_radix2_instance_q15 * S,
|
||||||
|
q15_t * pSrc);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const q15_t *pTwiddle; /**< points to the twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
} arm_cfft_radix4_instance_q15;
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix4_init_q15(
|
||||||
|
arm_cfft_radix4_instance_q15 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix4_q15(
|
||||||
|
const arm_cfft_radix4_instance_q15 * S,
|
||||||
|
q15_t * pSrc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const q31_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
} arm_cfft_radix2_instance_q31;
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix2_init_q31(
|
||||||
|
arm_cfft_radix2_instance_q31 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix2_q31(
|
||||||
|
const arm_cfft_radix2_instance_q31 * S,
|
||||||
|
q31_t * pSrc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q31 CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const q31_t *pTwiddle; /**< points to the twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
} arm_cfft_radix4_instance_q31;
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix4_q31(
|
||||||
|
const arm_cfft_radix4_instance_q31 * S,
|
||||||
|
q31_t * pSrc);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix4_init_q31(
|
||||||
|
arm_cfft_radix4_instance_q31 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
float32_t onebyfftLen; /**< value of 1/fftLen. */
|
||||||
|
} arm_cfft_radix2_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix2_init_f32(
|
||||||
|
arm_cfft_radix2_instance_f32 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix2_f32(
|
||||||
|
const arm_cfft_radix2_instance_f32 * S,
|
||||||
|
float32_t * pSrc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
float32_t onebyfftLen; /**< value of 1/fftLen. */
|
||||||
|
} arm_cfft_radix4_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix4_init_f32(
|
||||||
|
arm_cfft_radix4_instance_f32 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix4_f32(
|
||||||
|
const arm_cfft_radix4_instance_f32 * S,
|
||||||
|
float32_t * pSrc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the fixed-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
const q15_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t bitRevLength; /**< bit reversal table length. */
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \
|
||||||
|
const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \
|
||||||
|
const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \
|
||||||
|
const q15_t *rearranged_twiddle_stride3;
|
||||||
|
#endif
|
||||||
|
} arm_cfft_instance_q15;
|
||||||
|
|
||||||
|
arm_status arm_cfft_init_q15(
|
||||||
|
arm_cfft_instance_q15 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
void arm_cfft_q15(
|
||||||
|
const arm_cfft_instance_q15 * S,
|
||||||
|
q15_t * p1,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the fixed-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
const q31_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t bitRevLength; /**< bit reversal table length. */
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \
|
||||||
|
const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \
|
||||||
|
const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \
|
||||||
|
const q31_t *rearranged_twiddle_stride3;
|
||||||
|
#endif
|
||||||
|
} arm_cfft_instance_q31;
|
||||||
|
|
||||||
|
arm_status arm_cfft_init_q31(
|
||||||
|
arm_cfft_instance_q31 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
void arm_cfft_q31(
|
||||||
|
const arm_cfft_instance_q31 * S,
|
||||||
|
q31_t * p1,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t bitRevLength; /**< bit reversal table length. */
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \
|
||||||
|
const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \
|
||||||
|
const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \
|
||||||
|
const float32_t *rearranged_twiddle_stride3;
|
||||||
|
#endif
|
||||||
|
} arm_cfft_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
arm_status arm_cfft_init_f32(
|
||||||
|
arm_cfft_instance_f32 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
void arm_cfft_f32(
|
||||||
|
const arm_cfft_instance_f32 * S,
|
||||||
|
float32_t * p1,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Double Precision Floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
const float64_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t bitRevLength; /**< bit reversal table length. */
|
||||||
|
} arm_cfft_instance_f64;
|
||||||
|
|
||||||
|
arm_status arm_cfft_init_f64(
|
||||||
|
arm_cfft_instance_f64 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
void arm_cfft_f64(
|
||||||
|
const arm_cfft_instance_f64 * S,
|
||||||
|
float64_t * p1,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 RFFT/RIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t fftLenReal; /**< length of the real FFT. */
|
||||||
|
uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
|
||||||
|
uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
|
||||||
|
uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
|
||||||
|
const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
arm_cfft_instance_q15 cfftInst;
|
||||||
|
#else
|
||||||
|
const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */
|
||||||
|
#endif
|
||||||
|
} arm_rfft_instance_q15;
|
||||||
|
|
||||||
|
arm_status arm_rfft_init_q15(
|
||||||
|
arm_rfft_instance_q15 * S,
|
||||||
|
uint32_t fftLenReal,
|
||||||
|
uint32_t ifftFlagR,
|
||||||
|
uint32_t bitReverseFlag);
|
||||||
|
|
||||||
|
void arm_rfft_q15(
|
||||||
|
const arm_rfft_instance_q15 * S,
|
||||||
|
q15_t * pSrc,
|
||||||
|
q15_t * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q31 RFFT/RIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t fftLenReal; /**< length of the real FFT. */
|
||||||
|
uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
|
||||||
|
uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
|
||||||
|
uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
|
||||||
|
const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
|
||||||
|
#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
arm_cfft_instance_q31 cfftInst;
|
||||||
|
#else
|
||||||
|
const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */
|
||||||
|
#endif
|
||||||
|
} arm_rfft_instance_q31;
|
||||||
|
|
||||||
|
arm_status arm_rfft_init_q31(
|
||||||
|
arm_rfft_instance_q31 * S,
|
||||||
|
uint32_t fftLenReal,
|
||||||
|
uint32_t ifftFlagR,
|
||||||
|
uint32_t bitReverseFlag);
|
||||||
|
|
||||||
|
void arm_rfft_q31(
|
||||||
|
const arm_rfft_instance_q31 * S,
|
||||||
|
q31_t * pSrc,
|
||||||
|
q31_t * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point RFFT/RIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t fftLenReal; /**< length of the real FFT. */
|
||||||
|
uint16_t fftLenBy2; /**< length of the complex FFT. */
|
||||||
|
uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
|
||||||
|
uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
|
||||||
|
uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
|
||||||
|
const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
|
||||||
|
arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
|
||||||
|
} arm_rfft_instance_f32;
|
||||||
|
|
||||||
|
arm_status arm_rfft_init_f32(
|
||||||
|
arm_rfft_instance_f32 * S,
|
||||||
|
arm_cfft_radix4_instance_f32 * S_CFFT,
|
||||||
|
uint32_t fftLenReal,
|
||||||
|
uint32_t ifftFlagR,
|
||||||
|
uint32_t bitReverseFlag);
|
||||||
|
|
||||||
|
void arm_rfft_f32(
|
||||||
|
const arm_rfft_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Double Precision Floating-point RFFT/RIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arm_cfft_instance_f64 Sint; /**< Internal CFFT structure. */
|
||||||
|
uint16_t fftLenRFFT; /**< length of the real sequence */
|
||||||
|
const float64_t * pTwiddleRFFT; /**< Twiddle factors real stage */
|
||||||
|
} arm_rfft_fast_instance_f64 ;
|
||||||
|
|
||||||
|
arm_status arm_rfft_fast_init_f64 (
|
||||||
|
arm_rfft_fast_instance_f64 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
|
||||||
|
void arm_rfft_fast_f64(
|
||||||
|
arm_rfft_fast_instance_f64 * S,
|
||||||
|
float64_t * p, float64_t * pOut,
|
||||||
|
uint8_t ifftFlag);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point RFFT/RIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */
|
||||||
|
uint16_t fftLenRFFT; /**< length of the real sequence */
|
||||||
|
const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */
|
||||||
|
} arm_rfft_fast_instance_f32 ;
|
||||||
|
|
||||||
|
arm_status arm_rfft_fast_init_f32 (
|
||||||
|
arm_rfft_fast_instance_f32 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
|
||||||
|
void arm_rfft_fast_f32(
|
||||||
|
const arm_rfft_fast_instance_f32 * S,
|
||||||
|
float32_t * p, float32_t * pOut,
|
||||||
|
uint8_t ifftFlag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point DCT4/IDCT4 function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t N; /**< length of the DCT4. */
|
||||||
|
uint16_t Nby2; /**< half of the length of the DCT4. */
|
||||||
|
float32_t normalize; /**< normalizing factor. */
|
||||||
|
const float32_t *pTwiddle; /**< points to the twiddle factor table. */
|
||||||
|
const float32_t *pCosFactor; /**< points to the cosFactor table. */
|
||||||
|
arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */
|
||||||
|
arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
|
||||||
|
} arm_dct4_instance_f32;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the floating-point DCT4/IDCT4.
|
||||||
|
* @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure.
|
||||||
|
* @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure.
|
||||||
|
* @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure.
|
||||||
|
* @param[in] N length of the DCT4.
|
||||||
|
* @param[in] Nby2 half of the length of the DCT4.
|
||||||
|
* @param[in] normalize normalizing factor.
|
||||||
|
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length.
|
||||||
|
*/
|
||||||
|
arm_status arm_dct4_init_f32(
|
||||||
|
arm_dct4_instance_f32 * S,
|
||||||
|
arm_rfft_instance_f32 * S_RFFT,
|
||||||
|
arm_cfft_radix4_instance_f32 * S_CFFT,
|
||||||
|
uint16_t N,
|
||||||
|
uint16_t Nby2,
|
||||||
|
float32_t normalize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the floating-point DCT4/IDCT4.
|
||||||
|
* @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure.
|
||||||
|
* @param[in] pState points to state buffer.
|
||||||
|
* @param[in,out] pInlineBuffer points to the in-place input and output buffer.
|
||||||
|
*/
|
||||||
|
void arm_dct4_f32(
|
||||||
|
const arm_dct4_instance_f32 * S,
|
||||||
|
float32_t * pState,
|
||||||
|
float32_t * pInlineBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q31 DCT4/IDCT4 function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t N; /**< length of the DCT4. */
|
||||||
|
uint16_t Nby2; /**< half of the length of the DCT4. */
|
||||||
|
q31_t normalize; /**< normalizing factor. */
|
||||||
|
const q31_t *pTwiddle; /**< points to the twiddle factor table. */
|
||||||
|
const q31_t *pCosFactor; /**< points to the cosFactor table. */
|
||||||
|
arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */
|
||||||
|
arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
|
||||||
|
} arm_dct4_instance_q31;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the Q31 DCT4/IDCT4.
|
||||||
|
* @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure.
|
||||||
|
* @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure
|
||||||
|
* @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure
|
||||||
|
* @param[in] N length of the DCT4.
|
||||||
|
* @param[in] Nby2 half of the length of the DCT4.
|
||||||
|
* @param[in] normalize normalizing factor.
|
||||||
|
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
|
||||||
|
*/
|
||||||
|
arm_status arm_dct4_init_q31(
|
||||||
|
arm_dct4_instance_q31 * S,
|
||||||
|
arm_rfft_instance_q31 * S_RFFT,
|
||||||
|
arm_cfft_radix4_instance_q31 * S_CFFT,
|
||||||
|
uint16_t N,
|
||||||
|
uint16_t Nby2,
|
||||||
|
q31_t normalize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the Q31 DCT4/IDCT4.
|
||||||
|
* @param[in] S points to an instance of the Q31 DCT4 structure.
|
||||||
|
* @param[in] pState points to state buffer.
|
||||||
|
* @param[in,out] pInlineBuffer points to the in-place input and output buffer.
|
||||||
|
*/
|
||||||
|
void arm_dct4_q31(
|
||||||
|
const arm_dct4_instance_q31 * S,
|
||||||
|
q31_t * pState,
|
||||||
|
q31_t * pInlineBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Q15 DCT4/IDCT4 function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t N; /**< length of the DCT4. */
|
||||||
|
uint16_t Nby2; /**< half of the length of the DCT4. */
|
||||||
|
q15_t normalize; /**< normalizing factor. */
|
||||||
|
const q15_t *pTwiddle; /**< points to the twiddle factor table. */
|
||||||
|
const q15_t *pCosFactor; /**< points to the cosFactor table. */
|
||||||
|
arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */
|
||||||
|
arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
|
||||||
|
} arm_dct4_instance_q15;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialization function for the Q15 DCT4/IDCT4.
|
||||||
|
* @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure.
|
||||||
|
* @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure.
|
||||||
|
* @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure.
|
||||||
|
* @param[in] N length of the DCT4.
|
||||||
|
* @param[in] Nby2 half of the length of the DCT4.
|
||||||
|
* @param[in] normalize normalizing factor.
|
||||||
|
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
|
||||||
|
*/
|
||||||
|
arm_status arm_dct4_init_q15(
|
||||||
|
arm_dct4_instance_q15 * S,
|
||||||
|
arm_rfft_instance_q15 * S_RFFT,
|
||||||
|
arm_cfft_radix4_instance_q15 * S_CFFT,
|
||||||
|
uint16_t N,
|
||||||
|
uint16_t Nby2,
|
||||||
|
q15_t normalize);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Processing function for the Q15 DCT4/IDCT4.
|
||||||
|
* @param[in] S points to an instance of the Q15 DCT4 structure.
|
||||||
|
* @param[in] pState points to state buffer.
|
||||||
|
* @param[in,out] pInlineBuffer points to the in-place input and output buffer.
|
||||||
|
*/
|
||||||
|
void arm_dct4_q15(
|
||||||
|
const arm_dct4_instance_q15 * S,
|
||||||
|
q15_t * pState,
|
||||||
|
q15_t * pInlineBuffer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Floating-point MFCC function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const float32_t *dctCoefs; /**< Internal DCT coefficients */
|
||||||
|
const float32_t *filterCoefs; /**< Internal Mel filter coefficients */
|
||||||
|
const float32_t *windowCoefs; /**< Windowing coefficients */
|
||||||
|
const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */
|
||||||
|
const uint32_t *filterLengths; /**< Internal Mel filter lengths */
|
||||||
|
uint32_t fftLen; /**< FFT length */
|
||||||
|
uint32_t nbMelFilters; /**< Number of Mel filters */
|
||||||
|
uint32_t nbDctOutputs; /**< Number of DCT outputs */
|
||||||
|
#if defined(ARM_MFCC_CFFT_BASED)
|
||||||
|
/* Implementation of the MFCC is using a CFFT */
|
||||||
|
arm_cfft_instance_f32 cfft; /**< Internal CFFT instance */
|
||||||
|
#else
|
||||||
|
/* Implementation of the MFCC is using a RFFT (default) */
|
||||||
|
arm_rfft_fast_instance_f32 rfft;
|
||||||
|
#endif
|
||||||
|
} arm_mfcc_instance_f32 ;
|
||||||
|
|
||||||
|
arm_status arm_mfcc_init_f32(
|
||||||
|
arm_mfcc_instance_f32 * S,
|
||||||
|
uint32_t fftLen,
|
||||||
|
uint32_t nbMelFilters,
|
||||||
|
uint32_t nbDctOutputs,
|
||||||
|
const float32_t *dctCoefs,
|
||||||
|
const uint32_t *filterPos,
|
||||||
|
const uint32_t *filterLengths,
|
||||||
|
const float32_t *filterCoefs,
|
||||||
|
const float32_t *windowCoefs
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief MFCC F32
|
||||||
|
@param[in] S points to the mfcc instance structure
|
||||||
|
@param[in] pSrc points to the input samples
|
||||||
|
@param[out] pDst points to the output MFCC values
|
||||||
|
@param[inout] pTmp points to a temporary buffer of complex
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_mfcc_f32(
|
||||||
|
const arm_mfcc_instance_f32 * S,
|
||||||
|
float32_t *pSrc,
|
||||||
|
float32_t *pDst,
|
||||||
|
float32_t *pTmp
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const q31_t *dctCoefs; /**< Internal DCT coefficients */
|
||||||
|
const q31_t *filterCoefs; /**< Internal Mel filter coefficients */
|
||||||
|
const q31_t *windowCoefs; /**< Windowing coefficients */
|
||||||
|
const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */
|
||||||
|
const uint32_t *filterLengths; /**< Internal Mel filter lengths */
|
||||||
|
uint32_t fftLen; /**< FFT length */
|
||||||
|
uint32_t nbMelFilters; /**< Number of Mel filters */
|
||||||
|
uint32_t nbDctOutputs; /**< Number of DCT outputs */
|
||||||
|
#if defined(ARM_MFCC_CFFT_BASED)
|
||||||
|
/* Implementation of the MFCC is using a CFFT */
|
||||||
|
arm_cfft_instance_q31 cfft; /**< Internal CFFT instance */
|
||||||
|
#else
|
||||||
|
/* Implementation of the MFCC is using a RFFT (default) */
|
||||||
|
arm_rfft_instance_q31 rfft;
|
||||||
|
#endif
|
||||||
|
} arm_mfcc_instance_q31 ;
|
||||||
|
|
||||||
|
arm_status arm_mfcc_init_q31(
|
||||||
|
arm_mfcc_instance_q31 * S,
|
||||||
|
uint32_t fftLen,
|
||||||
|
uint32_t nbMelFilters,
|
||||||
|
uint32_t nbDctOutputs,
|
||||||
|
const q31_t *dctCoefs,
|
||||||
|
const uint32_t *filterPos,
|
||||||
|
const uint32_t *filterLengths,
|
||||||
|
const q31_t *filterCoefs,
|
||||||
|
const q31_t *windowCoefs
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief MFCC Q31
|
||||||
|
@param[in] S points to the mfcc instance structure
|
||||||
|
@param[in] pSrc points to the input samples
|
||||||
|
@param[out] pDst points to the output MFCC values
|
||||||
|
@param[inout] pTmp points to a temporary buffer of complex
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
arm_status arm_mfcc_q31(
|
||||||
|
const arm_mfcc_instance_q31 * S,
|
||||||
|
q31_t *pSrc,
|
||||||
|
q31_t *pDst,
|
||||||
|
q31_t *pTmp
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const q15_t *dctCoefs; /**< Internal DCT coefficients */
|
||||||
|
const q15_t *filterCoefs; /**< Internal Mel filter coefficients */
|
||||||
|
const q15_t *windowCoefs; /**< Windowing coefficients */
|
||||||
|
const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */
|
||||||
|
const uint32_t *filterLengths; /**< Internal Mel filter lengths */
|
||||||
|
uint32_t fftLen; /**< FFT length */
|
||||||
|
uint32_t nbMelFilters; /**< Number of Mel filters */
|
||||||
|
uint32_t nbDctOutputs; /**< Number of DCT outputs */
|
||||||
|
#if defined(ARM_MFCC_CFFT_BASED)
|
||||||
|
/* Implementation of the MFCC is using a CFFT */
|
||||||
|
arm_cfft_instance_q15 cfft; /**< Internal CFFT instance */
|
||||||
|
#else
|
||||||
|
/* Implementation of the MFCC is using a RFFT (default) */
|
||||||
|
arm_rfft_instance_q15 rfft;
|
||||||
|
#endif
|
||||||
|
} arm_mfcc_instance_q15 ;
|
||||||
|
|
||||||
|
arm_status arm_mfcc_init_q15(
|
||||||
|
arm_mfcc_instance_q15 * S,
|
||||||
|
uint32_t fftLen,
|
||||||
|
uint32_t nbMelFilters,
|
||||||
|
uint32_t nbDctOutputs,
|
||||||
|
const q15_t *dctCoefs,
|
||||||
|
const uint32_t *filterPos,
|
||||||
|
const uint32_t *filterLengths,
|
||||||
|
const q15_t *filterCoefs,
|
||||||
|
const q15_t *windowCoefs
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief MFCC Q15
|
||||||
|
@param[in] S points to the mfcc instance structure
|
||||||
|
@param[in] pSrc points to the input samples
|
||||||
|
@param[out] pDst points to the output MFCC values in q8.7 format
|
||||||
|
@param[inout] pTmp points to a temporary buffer of complex
|
||||||
|
@return error status
|
||||||
|
*/
|
||||||
|
arm_status arm_mfcc_q15(
|
||||||
|
const arm_mfcc_instance_q15 * S,
|
||||||
|
q15_t *pSrc,
|
||||||
|
q15_t *pDst,
|
||||||
|
q31_t *pTmp
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _TRANSFORM_FUNCTIONS_H_ */
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file transform_functions_f16.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.10.0
|
||||||
|
* @date 08 July 2021
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _TRANSFORM_FUNCTIONS_F16_H_
|
||||||
|
#define _TRANSFORM_FUNCTIONS_F16_H_
|
||||||
|
|
||||||
|
#include "arm_math_types_f16.h"
|
||||||
|
#include "arm_math_memory.h"
|
||||||
|
|
||||||
|
#include "dsp/none.h"
|
||||||
|
#include "dsp/utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(ARM_FLOAT16_SUPPORTED)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const float16_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
float16_t onebyfftLen; /**< value of 1/fftLen. */
|
||||||
|
} arm_cfft_radix2_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
|
||||||
|
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
|
||||||
|
const float16_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
|
||||||
|
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
|
||||||
|
float16_t onebyfftLen; /**< value of 1/fftLen. */
|
||||||
|
} arm_cfft_radix4_instance_f16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point CFFT/CIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint16_t fftLen; /**< length of the FFT. */
|
||||||
|
const float16_t *pTwiddle; /**< points to the Twiddle factor table. */
|
||||||
|
const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
|
||||||
|
uint16_t bitRevLength; /**< bit reversal table length. */
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \
|
||||||
|
const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \
|
||||||
|
const float16_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \
|
||||||
|
const float16_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \
|
||||||
|
const float16_t *rearranged_twiddle_stride3;
|
||||||
|
#endif
|
||||||
|
} arm_cfft_instance_f16;
|
||||||
|
|
||||||
|
|
||||||
|
arm_status arm_cfft_init_f16(
|
||||||
|
arm_cfft_instance_f16 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
void arm_cfft_f16(
|
||||||
|
const arm_cfft_instance_f16 * S,
|
||||||
|
float16_t * p1,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the floating-point RFFT/RIFFT function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
arm_cfft_instance_f16 Sint; /**< Internal CFFT structure. */
|
||||||
|
uint16_t fftLenRFFT; /**< length of the real sequence */
|
||||||
|
const float16_t * pTwiddleRFFT; /**< Twiddle factors real stage */
|
||||||
|
} arm_rfft_fast_instance_f16 ;
|
||||||
|
|
||||||
|
arm_status arm_rfft_fast_init_f16 (
|
||||||
|
arm_rfft_fast_instance_f16 * S,
|
||||||
|
uint16_t fftLen);
|
||||||
|
|
||||||
|
|
||||||
|
void arm_rfft_fast_f16(
|
||||||
|
const arm_rfft_fast_instance_f16 * S,
|
||||||
|
float16_t * p, float16_t * pOut,
|
||||||
|
uint8_t ifftFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix4_init_f16(
|
||||||
|
arm_cfft_radix4_instance_f16 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix4_f16(
|
||||||
|
const arm_cfft_radix4_instance_f16 * S,
|
||||||
|
float16_t * pSrc);
|
||||||
|
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
arm_status arm_cfft_radix2_init_f16(
|
||||||
|
arm_cfft_radix2_instance_f16 * S,
|
||||||
|
uint16_t fftLen,
|
||||||
|
uint8_t ifftFlag,
|
||||||
|
uint8_t bitReverseFlag);
|
||||||
|
|
||||||
|
/* Deprecated */
|
||||||
|
void arm_cfft_radix2_f16(
|
||||||
|
const arm_cfft_radix2_instance_f16 * S,
|
||||||
|
float16_t * pSrc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Instance structure for the Floating-point MFCC function.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const float16_t *dctCoefs; /**< Internal DCT coefficients */
|
||||||
|
const float16_t *filterCoefs; /**< Internal Mel filter coefficients */
|
||||||
|
const float16_t *windowCoefs; /**< Windowing coefficients */
|
||||||
|
const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */
|
||||||
|
const uint32_t *filterLengths; /**< Internal Mel filter lengths */
|
||||||
|
uint32_t fftLen; /**< FFT length */
|
||||||
|
uint32_t nbMelFilters; /**< Number of Mel filters */
|
||||||
|
uint32_t nbDctOutputs; /**< Number of DCT outputs */
|
||||||
|
#if defined(ARM_MFCC_CFFT_BASED)
|
||||||
|
/* Implementation of the MFCC is using a CFFT */
|
||||||
|
arm_cfft_instance_f16 cfft; /**< Internal CFFT instance */
|
||||||
|
#else
|
||||||
|
/* Implementation of the MFCC is using a RFFT (default) */
|
||||||
|
arm_rfft_fast_instance_f16 rfft;
|
||||||
|
#endif
|
||||||
|
} arm_mfcc_instance_f16 ;
|
||||||
|
|
||||||
|
arm_status arm_mfcc_init_f16(
|
||||||
|
arm_mfcc_instance_f16 * S,
|
||||||
|
uint32_t fftLen,
|
||||||
|
uint32_t nbMelFilters,
|
||||||
|
uint32_t nbDctOutputs,
|
||||||
|
const float16_t *dctCoefs,
|
||||||
|
const uint32_t *filterPos,
|
||||||
|
const uint32_t *filterLengths,
|
||||||
|
const float16_t *filterCoefs,
|
||||||
|
const float16_t *windowCoefs
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief MFCC F16
|
||||||
|
@param[in] S points to the mfcc instance structure
|
||||||
|
@param[in] pSrc points to the input samples
|
||||||
|
@param[out] pDst points to the output MFCC values
|
||||||
|
@param[inout] pTmp points to a temporary buffer of complex
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
void arm_mfcc_f16(
|
||||||
|
const arm_mfcc_instance_f16 * S,
|
||||||
|
float16_t *pSrc,
|
||||||
|
float16_t *pDst,
|
||||||
|
float16_t *pTmp
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* defined(ARM_FLOAT16_SUPPORTED)*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _TRANSFORM_FUNCTIONS_F16_H_ */
|
||||||
@@ -0,0 +1,240 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_math_utils.h
|
||||||
|
* @brief Public header file for CMSIS DSP Library
|
||||||
|
* @version V1.9.0
|
||||||
|
* @date 20. July 2020
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_MATH_UTILS_H_
|
||||||
|
|
||||||
|
#define _ARM_MATH_UTILS_H_
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macros required for reciprocal calculation in Normalized LMS
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define INDEX_MASK 0x0000003F
|
||||||
|
|
||||||
|
|
||||||
|
#define SQ(x) ((x) * (x))
|
||||||
|
|
||||||
|
#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t arm_recip_q31(
|
||||||
|
q31_t in,
|
||||||
|
q31_t * dst,
|
||||||
|
const q31_t * pRecipTable)
|
||||||
|
{
|
||||||
|
q31_t out;
|
||||||
|
uint32_t tempVal;
|
||||||
|
uint32_t index, i;
|
||||||
|
uint32_t signBits;
|
||||||
|
|
||||||
|
if (in > 0)
|
||||||
|
{
|
||||||
|
signBits = ((uint32_t) (__CLZ( in) - 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
signBits = ((uint32_t) (__CLZ(-in) - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert input sample to 1.31 format */
|
||||||
|
in = (in << signBits);
|
||||||
|
|
||||||
|
/* calculation of index for initial approximated Val */
|
||||||
|
index = (uint32_t)(in >> 24);
|
||||||
|
index = (index & INDEX_MASK);
|
||||||
|
|
||||||
|
/* 1.31 with exp 1 */
|
||||||
|
out = pRecipTable[index];
|
||||||
|
|
||||||
|
/* calculation of reciprocal value */
|
||||||
|
/* running approximation for two iterations */
|
||||||
|
for (i = 0U; i < 2U; i++)
|
||||||
|
{
|
||||||
|
tempVal = (uint32_t) (((q63_t) in * out) >> 31);
|
||||||
|
tempVal = 0x7FFFFFFFu - tempVal;
|
||||||
|
/* 1.31 with exp 1 */
|
||||||
|
/* out = (q31_t) (((q63_t) out * tempVal) >> 30); */
|
||||||
|
out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write output */
|
||||||
|
*dst = out;
|
||||||
|
|
||||||
|
/* return num of signbits of out = 1/in value */
|
||||||
|
return (signBits + 1U);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type.
|
||||||
|
*/
|
||||||
|
__STATIC_FORCEINLINE uint32_t arm_recip_q15(
|
||||||
|
q15_t in,
|
||||||
|
q15_t * dst,
|
||||||
|
const q15_t * pRecipTable)
|
||||||
|
{
|
||||||
|
q15_t out = 0;
|
||||||
|
uint32_t tempVal = 0;
|
||||||
|
uint32_t index = 0, i = 0;
|
||||||
|
uint32_t signBits = 0;
|
||||||
|
|
||||||
|
if (in > 0)
|
||||||
|
{
|
||||||
|
signBits = ((uint32_t)(__CLZ( in) - 17));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
signBits = ((uint32_t)(__CLZ(-in) - 17));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convert input sample to 1.15 format */
|
||||||
|
in = (in << signBits);
|
||||||
|
|
||||||
|
/* calculation of index for initial approximated Val */
|
||||||
|
index = (uint32_t)(in >> 8);
|
||||||
|
index = (index & INDEX_MASK);
|
||||||
|
|
||||||
|
/* 1.15 with exp 1 */
|
||||||
|
out = pRecipTable[index];
|
||||||
|
|
||||||
|
/* calculation of reciprocal value */
|
||||||
|
/* running approximation for two iterations */
|
||||||
|
for (i = 0U; i < 2U; i++)
|
||||||
|
{
|
||||||
|
tempVal = (uint32_t) (((q31_t) in * out) >> 15);
|
||||||
|
tempVal = 0x7FFFu - tempVal;
|
||||||
|
/* 1.15 with exp 1 */
|
||||||
|
out = (q15_t) (((q31_t) out * tempVal) >> 14);
|
||||||
|
/* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write output */
|
||||||
|
*dst = out;
|
||||||
|
|
||||||
|
/* return num of signbits of out = 1/in value */
|
||||||
|
return (signBits + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 64-bit to 32-bit unsigned normalization
|
||||||
|
* @param[in] in is input unsigned long long value
|
||||||
|
* @param[out] normalized is the 32-bit normalized value
|
||||||
|
* @param[out] norm is norm scale
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int32_t *norm)
|
||||||
|
{
|
||||||
|
int32_t n1;
|
||||||
|
int32_t hi = (int32_t) (in >> 32);
|
||||||
|
int32_t lo = (int32_t) ((in << 32) >> 32);
|
||||||
|
|
||||||
|
n1 = __CLZ(hi) - 32;
|
||||||
|
if (!n1)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* input fits in 32-bit
|
||||||
|
*/
|
||||||
|
n1 = __CLZ(lo);
|
||||||
|
if (!n1)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* MSB set, need to scale down by 1
|
||||||
|
*/
|
||||||
|
*norm = -1;
|
||||||
|
*normalized = (((uint32_t) lo) >> 1);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
if (n1 == 32)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* input is zero
|
||||||
|
*/
|
||||||
|
*norm = 0;
|
||||||
|
*normalized = 0;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* 32-bit normalization
|
||||||
|
*/
|
||||||
|
*norm = n1 - 1;
|
||||||
|
*normalized = lo << *norm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* input fits in 64-bit
|
||||||
|
*/
|
||||||
|
n1 = 1 - n1;
|
||||||
|
*norm = -n1;
|
||||||
|
/*
|
||||||
|
* 64 bit normalization
|
||||||
|
*/
|
||||||
|
*normalized = (((uint32_t) lo) >> n1) | (hi << (32 - n1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__STATIC_INLINE q31_t arm_div_q63_to_q31(q63_t num, q31_t den)
|
||||||
|
{
|
||||||
|
q31_t result;
|
||||||
|
uint64_t absNum;
|
||||||
|
int32_t normalized;
|
||||||
|
int32_t norm;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if sum fits in 32bits
|
||||||
|
* avoid costly 64-bit division
|
||||||
|
*/
|
||||||
|
absNum = num > 0 ? num : -num;
|
||||||
|
arm_norm_64_to_32u(absNum, &normalized, &norm);
|
||||||
|
if (norm > 0)
|
||||||
|
/*
|
||||||
|
* 32-bit division
|
||||||
|
*/
|
||||||
|
result = (q31_t) num / den;
|
||||||
|
else
|
||||||
|
/*
|
||||||
|
* 64-bit division
|
||||||
|
*/
|
||||||
|
result = (q31_t) (num / den);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /*ifndef _ARM_MATH_UTILS_H_ */
|
||||||
@@ -0,0 +1,200 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_sorting.h
|
||||||
|
* @brief Private header file for CMSIS DSP Library
|
||||||
|
* @version V1.7.0
|
||||||
|
* @date 2019
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2019 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_SORTING_H_
|
||||||
|
#define _ARM_SORTING_H_
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_bubble_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_heap_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data.
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_insertion_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t *pSrc,
|
||||||
|
float32_t* pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_quick_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_selection_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param[in] S points to an instance of the sorting structure.
|
||||||
|
* @param[in] pSrc points to the block of input data.
|
||||||
|
* @param[out] pDst points to the block of output data
|
||||||
|
* @param[in] blockSize number of samples to process.
|
||||||
|
*/
|
||||||
|
void arm_bitonic_sort_f32(
|
||||||
|
const arm_sort_instance_f32 * S,
|
||||||
|
float32_t * pSrc,
|
||||||
|
float32_t * pDst,
|
||||||
|
uint32_t blockSize);
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_NEON)
|
||||||
|
|
||||||
|
#define vtrn256_128q(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x4_t vtrn128_temp = a.val[1]; \
|
||||||
|
a.val[1] = b.val[0]; \
|
||||||
|
b.val[0] = vtrn128_temp ; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vtrn128_64q(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x2_t ab, cd, ef, gh; \
|
||||||
|
ab = vget_low_f32(a); \
|
||||||
|
ef = vget_low_f32(b); \
|
||||||
|
cd = vget_high_f32(a); \
|
||||||
|
gh = vget_high_f32(b); \
|
||||||
|
a = vcombine_f32(ab, ef); \
|
||||||
|
b = vcombine_f32(cd, gh); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vtrn256_64q(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x2_t a_0, a_1, a_2, a_3; \
|
||||||
|
float32x2_t b_0, b_1, b_2, b_3; \
|
||||||
|
a_0 = vget_low_f32(a.val[0]); \
|
||||||
|
a_1 = vget_high_f32(a.val[0]); \
|
||||||
|
a_2 = vget_low_f32(a.val[1]); \
|
||||||
|
a_3 = vget_high_f32(a.val[1]); \
|
||||||
|
b_0 = vget_low_f32(b.val[0]); \
|
||||||
|
b_1 = vget_high_f32(b.val[0]); \
|
||||||
|
b_2 = vget_low_f32(b.val[1]); \
|
||||||
|
b_3 = vget_high_f32(b.val[1]); \
|
||||||
|
a.val[0] = vcombine_f32(a_0, b_0); \
|
||||||
|
a.val[1] = vcombine_f32(a_2, b_2); \
|
||||||
|
b.val[0] = vcombine_f32(a_1, b_1); \
|
||||||
|
b.val[1] = vcombine_f32(a_3, b_3); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vtrn128_32q(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x4x2_t vtrn32_tmp = vtrnq_f32((a), (b)); \
|
||||||
|
(a) = vtrn32_tmp.val[0]; \
|
||||||
|
(b) = vtrn32_tmp.val[1]; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vtrn256_32q(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x4x2_t vtrn32_tmp_1 = vtrnq_f32((a.val[0]), (b.val[0])); \
|
||||||
|
float32x4x2_t vtrn32_tmp_2 = vtrnq_f32((a.val[1]), (b.val[1])); \
|
||||||
|
a.val[0] = vtrn32_tmp_1.val[0]; \
|
||||||
|
a.val[1] = vtrn32_tmp_2.val[0]; \
|
||||||
|
b.val[0] = vtrn32_tmp_1.val[1]; \
|
||||||
|
b.val[1] = vtrn32_tmp_2.val[1]; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vminmaxq(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x4_t minmax_tmp = (a); \
|
||||||
|
(a) = vminq_f32((a), (b)); \
|
||||||
|
(b) = vmaxq_f32(minmax_tmp, (b)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vminmax256q(a, b) \
|
||||||
|
do { \
|
||||||
|
float32x4x2_t minmax256_tmp = (a); \
|
||||||
|
a.val[0] = vminq_f32(a.val[0], b.val[0]); \
|
||||||
|
a.val[1] = vminq_f32(a.val[1], b.val[1]); \
|
||||||
|
b.val[0] = vmaxq_f32(minmax256_tmp.val[0], b.val[0]); \
|
||||||
|
b.val[1] = vmaxq_f32(minmax256_tmp.val[1], b.val[1]); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vrev128q_f32(a) \
|
||||||
|
vcombine_f32(vrev64_f32(vget_high_f32(a)), vrev64_f32(vget_low_f32(a)))
|
||||||
|
|
||||||
|
#define vrev256q_f32(a) \
|
||||||
|
do { \
|
||||||
|
float32x4_t rev_tmp = vcombine_f32(vrev64_f32(vget_high_f32(a.val[0])), vrev64_f32(vget_low_f32(a.val[0]))); \
|
||||||
|
a.val[0] = vcombine_f32(vrev64_f32(vget_high_f32(a.val[1])), vrev64_f32(vget_low_f32(a.val[1]))); \
|
||||||
|
a.val[1] = rev_tmp; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define vldrev128q_f32(a, p) \
|
||||||
|
do { \
|
||||||
|
a = vld1q_f32(p); \
|
||||||
|
a = vrev128q_f32(a); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* ARM_MATH_NEON */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _ARM_SORTING_H */
|
||||||
@@ -0,0 +1,325 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file arm_vec_fft.h
|
||||||
|
* @brief Private header file for CMSIS DSP Library
|
||||||
|
* @version V1.7.0
|
||||||
|
* @date 07. January 2020
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ARM_VEC_FFT_H_
|
||||||
|
#define _ARM_VEC_FFT_H_
|
||||||
|
|
||||||
|
#include "arm_math.h"
|
||||||
|
#include "arm_helium_utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#define MVE_CMPLX_ADD_A_ixB(A, B) vcaddq_rot90(A,B)
|
||||||
|
#define MVE_CMPLX_SUB_A_ixB(A,B) vcaddq_rot270(A,B)
|
||||||
|
#define MVE_CMPLX_MULT_FLT_AxB(A,B) vcmlaq_rot90(vcmulq(A, B), A, B)
|
||||||
|
#define MVE_CMPLX_MULT_FLT_Conj_AxB(A,B) vcmlaq_rot270(vcmulq(A, B), A, B)
|
||||||
|
|
||||||
|
#define MVE_CMPLX_MULT_FX_AxB(A,B,TyA) vqdmladhxq(vqdmlsdhq((TyA)vuninitializedq_s32(), A, B), A, B)
|
||||||
|
#define MVE_CMPLX_MULT_FX_AxConjB(A,B,TyA) vqdmladhq(vqdmlsdhxq((TyA)vuninitializedq_s32(), A, B), A, B)
|
||||||
|
|
||||||
|
#define MVE_CMPLX_ADD_FX_A_ixB(A, B) vhcaddq_rot90(A,B)
|
||||||
|
#define MVE_CMPLX_SUB_FX_A_ixB(A,B) vhcaddq_rot270(A,B)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief In-place 32 bit reversal function for helium
|
||||||
|
@param[in,out] pSrc points to in-place buffer of unknown 32-bit data type
|
||||||
|
@param[in] bitRevLen bit reversal table length
|
||||||
|
@param[in] pBitRevTab points to bit reversal table
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
__STATIC_INLINE void arm_bitreversal_32_inpl_mve(
|
||||||
|
uint32_t *pSrc,
|
||||||
|
const uint16_t bitRevLen,
|
||||||
|
const uint16_t *pBitRevTab)
|
||||||
|
|
||||||
|
{
|
||||||
|
uint64_t *src = (uint64_t *) pSrc;
|
||||||
|
int32_t blkCnt; /* loop counters */
|
||||||
|
uint32x4_t bitRevTabOff;
|
||||||
|
uint32x4_t one = vdupq_n_u32(1);
|
||||||
|
uint64x2_t inLow, inHigh;
|
||||||
|
uint64x2_t bitRevOff1Low, bitRevOff0Low;
|
||||||
|
uint64x2_t bitRevOff1High, bitRevOff0High;
|
||||||
|
|
||||||
|
/* load scheduling to increase gather load idx update / gather load distance */
|
||||||
|
bitRevTabOff = vldrhq_u32(pBitRevTab);
|
||||||
|
pBitRevTab += 4;
|
||||||
|
|
||||||
|
bitRevOff0Low = vmullbq_int_u32(bitRevTabOff, one);
|
||||||
|
bitRevOff0High = vmulltq_int_u32(bitRevTabOff, one);
|
||||||
|
|
||||||
|
|
||||||
|
blkCnt = bitRevLen / 8;
|
||||||
|
while (blkCnt > 0) {
|
||||||
|
bitRevTabOff = vldrhq_u32(pBitRevTab);
|
||||||
|
pBitRevTab += 4;
|
||||||
|
|
||||||
|
/* 64-bit index expansion */
|
||||||
|
bitRevOff1Low = vmullbq_int_u32(bitRevTabOff, one);
|
||||||
|
bitRevOff1High = vmulltq_int_u32(bitRevTabOff, one);
|
||||||
|
|
||||||
|
inLow = vldrdq_gather_offset_u64(src, bitRevOff0Low);
|
||||||
|
inHigh = vldrdq_gather_offset_u64(src, bitRevOff0High);
|
||||||
|
|
||||||
|
vstrdq_scatter_offset_u64(src, bitRevOff0Low, inHigh);
|
||||||
|
vstrdq_scatter_offset_u64(src, bitRevOff0High, inLow);
|
||||||
|
|
||||||
|
|
||||||
|
/* unrolled */
|
||||||
|
bitRevTabOff = vldrhq_u32(pBitRevTab);
|
||||||
|
pBitRevTab += 4;
|
||||||
|
|
||||||
|
bitRevOff0Low = vmullbq_int_u32(bitRevTabOff, one);
|
||||||
|
bitRevOff0High = vmulltq_int_u32(bitRevTabOff, one);
|
||||||
|
|
||||||
|
inLow = vldrdq_gather_offset_u64(src, bitRevOff1Low);
|
||||||
|
inHigh = vldrdq_gather_offset_u64(src, bitRevOff1High);
|
||||||
|
|
||||||
|
vstrdq_scatter_offset_u64(src, bitRevOff1Low, inHigh);
|
||||||
|
vstrdq_scatter_offset_u64(src, bitRevOff1High, inLow);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Decrement the blockSize loop counter
|
||||||
|
*/
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bitRevLen & 7) {
|
||||||
|
/* FFT size = 16 */
|
||||||
|
inLow = vldrdq_gather_offset_u64(src, bitRevOff0Low);
|
||||||
|
inHigh = vldrdq_gather_offset_u64(src, bitRevOff0High);
|
||||||
|
|
||||||
|
vstrdq_scatter_offset_u64(src, bitRevOff0Low, inHigh);
|
||||||
|
vstrdq_scatter_offset_u64(src, bitRevOff0High, inLow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief In-place 16 bit reversal function for helium
|
||||||
|
@param[in,out] pSrc points to in-place buffer of unknown 16-bit data type
|
||||||
|
@param[in] bitRevLen bit reversal table length
|
||||||
|
@param[in] pBitRevTab points to bit reversal table
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
__STATIC_INLINE void arm_bitreversal_16_inpl_mve(
|
||||||
|
uint16_t *pSrc,
|
||||||
|
const uint16_t bitRevLen,
|
||||||
|
const uint16_t *pBitRevTab)
|
||||||
|
|
||||||
|
{
|
||||||
|
uint32_t *src = (uint32_t *) pSrc;
|
||||||
|
int32_t blkCnt; /* loop counters */
|
||||||
|
uint32x4_t bitRevTabOff;
|
||||||
|
uint16x8_t one = vdupq_n_u16(1);
|
||||||
|
uint32x4_t bitRevOff1Low, bitRevOff0Low;
|
||||||
|
uint32x4_t bitRevOff1High, bitRevOff0High;
|
||||||
|
uint32x4_t inLow, inHigh;
|
||||||
|
|
||||||
|
/* load scheduling to increase gather load idx update / gather load distance */
|
||||||
|
bitRevTabOff = vldrhq_u16(pBitRevTab);
|
||||||
|
pBitRevTab += 8;
|
||||||
|
|
||||||
|
bitRevOff0Low = vmullbq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff0High = vmulltq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff0Low = vshrq_n_u16((uint16x8_t)bitRevOff0Low, 3);
|
||||||
|
bitRevOff0High = vshrq_n_u16((uint16x8_t)bitRevOff0High, 3);
|
||||||
|
|
||||||
|
blkCnt = (bitRevLen / 16);
|
||||||
|
while (blkCnt > 0) {
|
||||||
|
bitRevTabOff = vldrhq_u16(pBitRevTab);
|
||||||
|
pBitRevTab += 8;
|
||||||
|
|
||||||
|
bitRevOff1Low = vmullbq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff1High = vmulltq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff1Low = vshrq_n_u16((uint16x8_t)bitRevOff1Low, 3);
|
||||||
|
bitRevOff1High = vshrq_n_u16((uint16x8_t)bitRevOff1High, 3);
|
||||||
|
|
||||||
|
inLow = vldrwq_gather_shifted_offset_u32(src, bitRevOff0Low);
|
||||||
|
inHigh = vldrwq_gather_shifted_offset_u32(src, bitRevOff0High);
|
||||||
|
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff0Low, inHigh);
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff0High, inLow);
|
||||||
|
|
||||||
|
/* loop unrolling */
|
||||||
|
bitRevTabOff = vldrhq_u16(pBitRevTab);
|
||||||
|
pBitRevTab += 8;
|
||||||
|
|
||||||
|
bitRevOff0Low = vmullbq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff0High = vmulltq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff0Low = vshrq_n_u16((uint16x8_t)bitRevOff0Low, 3);
|
||||||
|
bitRevOff0High = vshrq_n_u16((uint16x8_t)bitRevOff0High, 3);
|
||||||
|
|
||||||
|
inLow = vldrwq_gather_shifted_offset_u32(src, bitRevOff1Low);
|
||||||
|
inHigh = vldrwq_gather_shifted_offset_u32(src, bitRevOff1High);
|
||||||
|
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff1Low, inHigh);
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff1High, inLow);
|
||||||
|
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* tail handling */
|
||||||
|
blkCnt = bitRevLen & 0xf;
|
||||||
|
if (blkCnt == 8) {
|
||||||
|
inLow = vldrwq_gather_shifted_offset_u32(src, bitRevOff0Low);
|
||||||
|
inHigh = vldrwq_gather_shifted_offset_u32(src, bitRevOff0High);
|
||||||
|
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff0Low, inHigh);
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff0High, inLow);
|
||||||
|
} else if (blkCnt == 12) {
|
||||||
|
/* FFT 16 special case */
|
||||||
|
mve_pred16_t p = vctp16q(4);
|
||||||
|
|
||||||
|
bitRevTabOff = vldrhq_z_u16(pBitRevTab, p);
|
||||||
|
|
||||||
|
inLow = vldrwq_gather_shifted_offset_u32(src, bitRevOff0Low);
|
||||||
|
inHigh = vldrwq_gather_shifted_offset_u32(src, bitRevOff0High);
|
||||||
|
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff0Low, inHigh);
|
||||||
|
vstrwq_scatter_shifted_offset_u32(src, bitRevOff0High, inLow);
|
||||||
|
|
||||||
|
bitRevOff0Low = vmullbq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff0High = vmulltq_int_u16((uint16x8_t)bitRevTabOff, one);
|
||||||
|
bitRevOff0Low = vshrq_n_u16((uint16x8_t)bitRevOff0Low, 3);
|
||||||
|
bitRevOff0High = vshrq_n_u16((uint16x8_t)bitRevOff0High, 3);
|
||||||
|
|
||||||
|
inLow = vldrwq_gather_shifted_offset_z_u32(src, bitRevOff0Low, p);
|
||||||
|
inHigh = vldrwq_gather_shifted_offset_z_u32(src, bitRevOff0High, p);
|
||||||
|
|
||||||
|
vstrwq_scatter_shifted_offset_p_u32(src, bitRevOff0Low, inHigh, p);
|
||||||
|
vstrwq_scatter_shifted_offset_p_u32(src, bitRevOff0High, inLow, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Out-of-place 32 bit reversal function for helium
|
||||||
|
@param[out] pDst points to destination buffer of unknown 32-bit data type
|
||||||
|
@param[in] pSrc points to input buffer of unknown 32-bit data type
|
||||||
|
@param[in] fftLen FFT length
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void arm_bitreversal_32_outpl_mve(void *pDst, void *pSrc, uint32_t fftLen)
|
||||||
|
{
|
||||||
|
uint32x4_t idxOffs0, idxOffs1, bitRevOffs0, bitRevOffs1;
|
||||||
|
uint32_t bitRevPos, blkCnt;
|
||||||
|
uint32_t *pDst32 = (uint32_t *) pDst;
|
||||||
|
|
||||||
|
/* fwd indexes */
|
||||||
|
idxOffs0 = vdupq_n_u32(0);
|
||||||
|
idxOffs1 = vdupq_n_u32(0);
|
||||||
|
idxOffs0[0] = 0; idxOffs0[2] = 4;
|
||||||
|
idxOffs1[0] = 8; idxOffs1[2] = 12;
|
||||||
|
|
||||||
|
bitRevPos = (31 - __CLZ(fftLen)) + 5;
|
||||||
|
blkCnt = fftLen >> 2;
|
||||||
|
|
||||||
|
/* issued earlier to increase gather load idx update / gather load distance */
|
||||||
|
/* bit-reverse fwd indexes */
|
||||||
|
bitRevOffs0 = vbrsrq(idxOffs0, bitRevPos);
|
||||||
|
bitRevOffs1 = vbrsrq(idxOffs1, bitRevPos);
|
||||||
|
while (blkCnt > 0) {
|
||||||
|
uint64x2_t vecIn;
|
||||||
|
|
||||||
|
vecIn = vldrdq_gather_offset_u64(pSrc, (uint64x2_t) bitRevOffs0);
|
||||||
|
idxOffs0 = idxOffs0 + 16;
|
||||||
|
vst1q(pDst32, (uint32x4_t) vecIn);
|
||||||
|
pDst32 += 4;
|
||||||
|
bitRevOffs0 = vbrsrq(idxOffs0, bitRevPos);
|
||||||
|
|
||||||
|
vecIn = vldrdq_gather_offset_u64(pSrc, (uint64x2_t) bitRevOffs1);
|
||||||
|
idxOffs1 = idxOffs1 + 16;
|
||||||
|
vst1q(pDst32, (uint32x4_t) vecIn);
|
||||||
|
pDst32 += 4;
|
||||||
|
bitRevOffs1 = vbrsrq(idxOffs1, bitRevPos);
|
||||||
|
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Out-of-place 16 bit reversal function for helium
|
||||||
|
@param[out] pDst points to destination buffer of unknown 16-bit data type
|
||||||
|
@param[in] pSrc points to input buffer of unknown 16-bit data type
|
||||||
|
@param[in] fftLen FFT length
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
__STATIC_INLINE void arm_bitreversal_16_outpl_mve(void *pDst, void *pSrc, uint32_t fftLen)
|
||||||
|
{
|
||||||
|
uint32x4_t idxOffs0, idxOffs1, bitRevOffs0, bitRevOffs1;
|
||||||
|
uint32_t bitRevPos, blkCnt;
|
||||||
|
uint16_t *pDst16 = (uint16_t *) pDst;
|
||||||
|
uint32_t incrIdx = 0;
|
||||||
|
|
||||||
|
/* fwd indexes */
|
||||||
|
idxOffs0 = vidupq_wb_u32(&incrIdx, 4); // {0, 4, 8, 12}
|
||||||
|
idxOffs1 = vidupq_wb_u32(&incrIdx, 4); // {16, 20, 24, 28}
|
||||||
|
|
||||||
|
bitRevPos = (31 - __CLZ(fftLen)) + 4;
|
||||||
|
blkCnt = fftLen >> 3;
|
||||||
|
|
||||||
|
/* issued earlier to increase gather load idx update / gather load distance */
|
||||||
|
/* bit-reverse fwd indexes */
|
||||||
|
bitRevOffs0 = vbrsrq(idxOffs0, bitRevPos);
|
||||||
|
bitRevOffs1 = vbrsrq(idxOffs1, bitRevPos);
|
||||||
|
while (blkCnt > 0) {
|
||||||
|
uint32x4_t vecIn;
|
||||||
|
|
||||||
|
vecIn = vldrwq_gather_offset_s32(pSrc, bitRevOffs0);
|
||||||
|
idxOffs0 = idxOffs0 + 32;
|
||||||
|
vst1q(pDst16, (uint16x8_t) vecIn);
|
||||||
|
pDst16 += 8;
|
||||||
|
bitRevOffs0 = vbrsrq(idxOffs0, bitRevPos);
|
||||||
|
|
||||||
|
vecIn = vldrwq_gather_offset_s32(pSrc, bitRevOffs1);
|
||||||
|
idxOffs1 = idxOffs1 + 32;
|
||||||
|
vst1q(pDst16, (uint16x8_t) vecIn);
|
||||||
|
pDst16 += 8;
|
||||||
|
bitRevOffs1 = vbrsrq(idxOffs1, bitRevPos);
|
||||||
|
|
||||||
|
blkCnt--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _ARM_VEC_FFT_H_ */
|
||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,654 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_const_structs.c
|
||||||
|
* Description: Constant structs that are initialized for user convenience.
|
||||||
|
* For example, some can be given as arguments to the arm_cfft_f32() or arm_rfft_f32() functions.
|
||||||
|
*
|
||||||
|
* $Date: 23 April 2021
|
||||||
|
* $Revision: V1.9.0
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "arm_math_types.h"
|
||||||
|
#include "arm_const_structs.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
ALLOW TABLE is true when config table is enabled and the Tramsform folder is included
|
||||||
|
for compilation.
|
||||||
|
*/
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
|
||||||
|
|
||||||
|
/* Floating-point structs */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_16) && defined(ARM_TABLE_BITREVIDX_FLT64_16))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len16 = {
|
||||||
|
16, (const float64_t *)twiddleCoefF64_16, armBitRevIndexTableF64_16, ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_32) && defined(ARM_TABLE_BITREVIDX_FLT64_32))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len32 = {
|
||||||
|
32, (const float64_t *)twiddleCoefF64_32, armBitRevIndexTableF64_32, ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_64) && defined(ARM_TABLE_BITREVIDX_FLT64_64))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len64 = {
|
||||||
|
64, (const float64_t *)twiddleCoefF64_64, armBitRevIndexTableF64_64, ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_128) && defined(ARM_TABLE_BITREVIDX_FLT64_128))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len128 = {
|
||||||
|
128, (const float64_t *)twiddleCoefF64_128, armBitRevIndexTableF64_128, ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_256) && defined(ARM_TABLE_BITREVIDX_FLT64_256))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len256 = {
|
||||||
|
256, (const float64_t *)twiddleCoefF64_256, armBitRevIndexTableF64_256, ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_512) && defined(ARM_TABLE_BITREVIDX_FLT64_512))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len512 = {
|
||||||
|
512, (const float64_t *)twiddleCoefF64_512, armBitRevIndexTableF64_512, ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_1024) && defined(ARM_TABLE_BITREVIDX_FLT64_1024))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len1024 = {
|
||||||
|
1024, (const float64_t *)twiddleCoefF64_1024, armBitRevIndexTableF64_1024, ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_2048) && defined(ARM_TABLE_BITREVIDX_FLT64_2048))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len2048 = {
|
||||||
|
2048, (const float64_t *)twiddleCoefF64_2048, armBitRevIndexTableF64_2048, ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_4096) && defined(ARM_TABLE_BITREVIDX_FLT64_4096))
|
||||||
|
const arm_cfft_instance_f64 arm_cfft_sR_f64_len4096 = {
|
||||||
|
4096, (const float64_t *)twiddleCoefF64_4096, armBitRevIndexTableF64_4096, ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Floating-point structs */
|
||||||
|
#if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len16 = {
|
||||||
|
16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE_16_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len32 = {
|
||||||
|
32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_32_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len64 = {
|
||||||
|
64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE_64_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len128 = {
|
||||||
|
128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len256 = {
|
||||||
|
256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len512 = {
|
||||||
|
512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024 = {
|
||||||
|
1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE_1024_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048 = {
|
||||||
|
2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE_2048_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096))
|
||||||
|
const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096 = {
|
||||||
|
4096, twiddleCoef_4096, armBitRevIndexTable4096, ARMBITREVINDEXTABLE_4096_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
/* Fixed-point structs */
|
||||||
|
|
||||||
|
#if !defined(ARM_MATH_MVEI) || defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Those structures cannot be used to initialize the MVE version of the FFT Q31 instances.
|
||||||
|
So they are not compiled when MVE is defined.
|
||||||
|
|
||||||
|
For the MVE version, the new arm_cfft_init_f32 must be used.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len16 = {
|
||||||
|
16, twiddleCoef_16_q31, armBitRevIndexTable_fixed_16, ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len32 = {
|
||||||
|
32, twiddleCoef_32_q31, armBitRevIndexTable_fixed_32, ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len64 = {
|
||||||
|
64, twiddleCoef_64_q31, armBitRevIndexTable_fixed_64, ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len128 = {
|
||||||
|
128, twiddleCoef_128_q31, armBitRevIndexTable_fixed_128, ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len256 = {
|
||||||
|
256, twiddleCoef_256_q31, armBitRevIndexTable_fixed_256, ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len512 = {
|
||||||
|
512, twiddleCoef_512_q31, armBitRevIndexTable_fixed_512, ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024 = {
|
||||||
|
1024, twiddleCoef_1024_q31, armBitRevIndexTable_fixed_1024, ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048 = {
|
||||||
|
2048, twiddleCoef_2048_q31, armBitRevIndexTable_fixed_2048, ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096))
|
||||||
|
const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096 = {
|
||||||
|
4096, twiddleCoef_4096_q31, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len16 = {
|
||||||
|
16, twiddleCoef_16_q15, armBitRevIndexTable_fixed_16, ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_32) && defined(ARM_TABLE_BITREVIDX_FXT_32))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len32 = {
|
||||||
|
32, twiddleCoef_32_q15, armBitRevIndexTable_fixed_32, ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_64) && defined(ARM_TABLE_BITREVIDX_FXT_64))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len64 = {
|
||||||
|
64, twiddleCoef_64_q15, armBitRevIndexTable_fixed_64, ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_128) && defined(ARM_TABLE_BITREVIDX_FXT_128))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len128 = {
|
||||||
|
128, twiddleCoef_128_q15, armBitRevIndexTable_fixed_128, ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_256) && defined(ARM_TABLE_BITREVIDX_FXT_256))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len256 = {
|
||||||
|
256, twiddleCoef_256_q15, armBitRevIndexTable_fixed_256, ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_512) && defined(ARM_TABLE_BITREVIDX_FXT_512))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len512 = {
|
||||||
|
512, twiddleCoef_512_q15, armBitRevIndexTable_fixed_512, ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024 = {
|
||||||
|
1024, twiddleCoef_1024_q15, armBitRevIndexTable_fixed_1024, ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048 = {
|
||||||
|
2048, twiddleCoef_2048_q15, armBitRevIndexTable_fixed_2048, ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096))
|
||||||
|
const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096 = {
|
||||||
|
4096, twiddleCoef_4096_q15, armBitRevIndexTable_fixed_4096, ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_MATH_MVEI) */
|
||||||
|
|
||||||
|
/* Structure for real-value inputs */
|
||||||
|
/* Double precision strucs */
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_32) && defined(ARM_TABLE_BITREVIDX_FLT64_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_32))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len32 = {
|
||||||
|
{ 16, (const float64_t *)twiddleCoefF64_16, armBitRevIndexTableF64_16, ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH },
|
||||||
|
32U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_32
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_64) && defined(ARM_TABLE_BITREVIDX_FLT64_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_64))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len64 = {
|
||||||
|
{ 32, (const float64_t *)twiddleCoefF64_32, armBitRevIndexTableF64_32, ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH },
|
||||||
|
64U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_64
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_128) && defined(ARM_TABLE_BITREVIDX_FLT64_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_128))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len128 = {
|
||||||
|
{ 64, (const float64_t *)twiddleCoefF64_64, armBitRevIndexTableF64_64, ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH },
|
||||||
|
128U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_128
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_256) && defined(ARM_TABLE_BITREVIDX_FLT64_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_256))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len256 = {
|
||||||
|
{ 128, (const float64_t *)twiddleCoefF64_128, armBitRevIndexTableF64_128, ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH },
|
||||||
|
256U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_256
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_512) && defined(ARM_TABLE_BITREVIDX_FLT64_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_512))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len512 = {
|
||||||
|
{ 256, (const float64_t *)twiddleCoefF64_256, armBitRevIndexTableF64_256, ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH },
|
||||||
|
512U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_512
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_1024) && defined(ARM_TABLE_BITREVIDX_FLT64_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_1024))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len1024 = {
|
||||||
|
{ 512, (const float64_t *)twiddleCoefF64_512, armBitRevIndexTableF64_512, ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH },
|
||||||
|
1024U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_1024
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_2048) && defined(ARM_TABLE_BITREVIDX_FLT64_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_2048))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len2048 = {
|
||||||
|
{ 1024, (const float64_t *)twiddleCoefF64_1024, armBitRevIndexTableF64_1024, ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH },
|
||||||
|
2048U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_2048
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F64_4096) && defined(ARM_TABLE_BITREVIDX_FLT64_4096) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_4096))
|
||||||
|
const arm_rfft_fast_instance_f64 arm_rfft_fast_sR_f64_len4096 = {
|
||||||
|
{ 2048, (const float64_t *)twiddleCoefF64_2048, armBitRevIndexTableF64_2048, ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH },
|
||||||
|
4096U,
|
||||||
|
(float64_t *)twiddleCoefF64_rfft_4096
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Floating-point structs */
|
||||||
|
|
||||||
|
#if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len32 = {
|
||||||
|
{ 16, twiddleCoef_16, armBitRevIndexTable16, ARMBITREVINDEXTABLE_16_TABLE_LENGTH },
|
||||||
|
32U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_32
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len64 = {
|
||||||
|
{ 32, twiddleCoef_32, armBitRevIndexTable32, ARMBITREVINDEXTABLE_32_TABLE_LENGTH },
|
||||||
|
64U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_64
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len128 = {
|
||||||
|
{ 64, twiddleCoef_64, armBitRevIndexTable64, ARMBITREVINDEXTABLE_64_TABLE_LENGTH },
|
||||||
|
128U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_128
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len256 = {
|
||||||
|
{ 128, twiddleCoef_128, armBitRevIndexTable128, ARMBITREVINDEXTABLE_128_TABLE_LENGTH },
|
||||||
|
256U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_256
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len512 = {
|
||||||
|
{ 256, twiddleCoef_256, armBitRevIndexTable256, ARMBITREVINDEXTABLE_256_TABLE_LENGTH },
|
||||||
|
512U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_512
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len1024 = {
|
||||||
|
{ 512, twiddleCoef_512, armBitRevIndexTable512, ARMBITREVINDEXTABLE_512_TABLE_LENGTH },
|
||||||
|
1024U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_1024
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len2048 = {
|
||||||
|
{ 1024, twiddleCoef_1024, armBitRevIndexTable1024, ARMBITREVINDEXTABLE_1024_TABLE_LENGTH },
|
||||||
|
2048U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_2048
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096))
|
||||||
|
const arm_rfft_fast_instance_f32 arm_rfft_fast_sR_f32_len4096 = {
|
||||||
|
{ 2048, twiddleCoef_2048, armBitRevIndexTable2048, ARMBITREVINDEXTABLE_2048_TABLE_LENGTH },
|
||||||
|
4096U,
|
||||||
|
(float32_t *)twiddleCoef_rfft_4096
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* #if !defined(ARM_MATH_MVEF) || defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
/* Fixed-point structs */
|
||||||
|
/* q31_t */
|
||||||
|
|
||||||
|
#if !defined(ARM_MATH_MVEI) || defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Those structures cannot be used to initialize the MVE version of the FFT Q31 instances.
|
||||||
|
So they are not compiled when MVE is defined.
|
||||||
|
|
||||||
|
For the MVE version, the new arm_cfft_init_f32 must be used.
|
||||||
|
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len32 = {
|
||||||
|
32U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
256U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len16
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len64 = {
|
||||||
|
64U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
128U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len32
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len128 = {
|
||||||
|
128U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
64U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len64
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len256 = {
|
||||||
|
256U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
32U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len128
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len512 = {
|
||||||
|
512U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
16U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len256
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len1024 = {
|
||||||
|
1024U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
8U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len512
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len2048 = {
|
||||||
|
2048U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
4U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len1024
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len4096 = {
|
||||||
|
4096U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len2048
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q31) && defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096))
|
||||||
|
const arm_rfft_instance_q31 arm_rfft_sR_q31_len8192 = {
|
||||||
|
8192U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1U,
|
||||||
|
(q31_t*)realCoefAQ31,
|
||||||
|
(q31_t*)realCoefBQ31,
|
||||||
|
&arm_cfft_sR_q31_len4096
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* q15_t */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len32 = {
|
||||||
|
32U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
256U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len16
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_32) && defined(ARM_TABLE_BITREVIDX_FXT_32))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len64 = {
|
||||||
|
64U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
128U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len32
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_64) && defined(ARM_TABLE_BITREVIDX_FXT_64))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len128 = {
|
||||||
|
128U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
64U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len64
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_128) && defined(ARM_TABLE_BITREVIDX_FXT_128))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len256 = {
|
||||||
|
256U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
32U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len128
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_256) && defined(ARM_TABLE_BITREVIDX_FXT_256))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len512 = {
|
||||||
|
512U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
16U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len256
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_512) && defined(ARM_TABLE_BITREVIDX_FXT_512))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len1024 = {
|
||||||
|
1024U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
8U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len512
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len2048 = {
|
||||||
|
2048U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
4U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len1024
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len4096 = {
|
||||||
|
4096U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len2048
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_REALCOEF_Q15) && defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096))
|
||||||
|
const arm_rfft_instance_q15 arm_rfft_sR_q15_len8192 = {
|
||||||
|
8192U,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
1U,
|
||||||
|
(q15_t*)realCoefAQ15,
|
||||||
|
(q15_t*)realCoefBQ15,
|
||||||
|
&arm_cfft_sR_q15_len4096
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !defined(ARM_MATH_MVEI) */
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_bitreversal2.c
|
||||||
|
* Description: Bitreversal functions
|
||||||
|
*
|
||||||
|
* $Date: 23 April 2021
|
||||||
|
* $Revision: V1.9.0
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2019 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief In-place 64 bit reversal function.
|
||||||
|
@param[in,out] pSrc points to in-place buffer of unknown 64-bit data type
|
||||||
|
@param[in] bitRevLen bit reversal table length
|
||||||
|
@param[in] pBitRevTab points to bit reversal table
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_bitreversal_64(
|
||||||
|
uint64_t *pSrc,
|
||||||
|
const uint16_t bitRevLen,
|
||||||
|
const uint16_t *pBitRevTab)
|
||||||
|
{
|
||||||
|
uint64_t a, b, i, tmp;
|
||||||
|
|
||||||
|
for (i = 0; i < bitRevLen; )
|
||||||
|
{
|
||||||
|
a = pBitRevTab[i ] >> 2;
|
||||||
|
b = pBitRevTab[i + 1] >> 2;
|
||||||
|
|
||||||
|
//real
|
||||||
|
tmp = pSrc[a];
|
||||||
|
pSrc[a] = pSrc[b];
|
||||||
|
pSrc[b] = tmp;
|
||||||
|
|
||||||
|
//complex
|
||||||
|
tmp = pSrc[a+1];
|
||||||
|
pSrc[a+1] = pSrc[b+1];
|
||||||
|
pSrc[b+1] = tmp;
|
||||||
|
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief In-place 32 bit reversal function.
|
||||||
|
@param[in,out] pSrc points to in-place buffer of unknown 32-bit data type
|
||||||
|
@param[in] bitRevLen bit reversal table length
|
||||||
|
@param[in] pBitRevTab points to bit reversal table
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_bitreversal_32(
|
||||||
|
uint32_t *pSrc,
|
||||||
|
const uint16_t bitRevLen,
|
||||||
|
const uint16_t *pBitRevTab)
|
||||||
|
{
|
||||||
|
uint32_t a, b, i, tmp;
|
||||||
|
|
||||||
|
for (i = 0; i < bitRevLen; )
|
||||||
|
{
|
||||||
|
a = pBitRevTab[i ] >> 2;
|
||||||
|
b = pBitRevTab[i + 1] >> 2;
|
||||||
|
|
||||||
|
//real
|
||||||
|
tmp = pSrc[a];
|
||||||
|
pSrc[a] = pSrc[b];
|
||||||
|
pSrc[b] = tmp;
|
||||||
|
|
||||||
|
//complex
|
||||||
|
tmp = pSrc[a+1];
|
||||||
|
pSrc[a+1] = pSrc[b+1];
|
||||||
|
pSrc[b+1] = tmp;
|
||||||
|
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief In-place 16 bit reversal function.
|
||||||
|
@param[in,out] pSrc points to in-place buffer of unknown 16-bit data type
|
||||||
|
@param[in] bitRevLen bit reversal table length
|
||||||
|
@param[in] pBitRevTab points to bit reversal table
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_bitreversal_16(
|
||||||
|
uint16_t *pSrc,
|
||||||
|
const uint16_t bitRevLen,
|
||||||
|
const uint16_t *pBitRevTab)
|
||||||
|
{
|
||||||
|
uint16_t a, b, i, tmp;
|
||||||
|
|
||||||
|
for (i = 0; i < bitRevLen; )
|
||||||
|
{
|
||||||
|
a = pBitRevTab[i ] >> 2;
|
||||||
|
b = pBitRevTab[i + 1] >> 2;
|
||||||
|
|
||||||
|
//real
|
||||||
|
tmp = pSrc[a];
|
||||||
|
pSrc[a] = pSrc[b];
|
||||||
|
pSrc[b] = tmp;
|
||||||
|
|
||||||
|
//complex
|
||||||
|
tmp = pSrc[a+1];
|
||||||
|
pSrc[a+1] = pSrc[b+1];
|
||||||
|
pSrc[b+1] = tmp;
|
||||||
|
|
||||||
|
i += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,358 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_cfft_init_f32.c
|
||||||
|
* Description: Initialization function for cfft f32 instance
|
||||||
|
*
|
||||||
|
* $Date: 23 April 2021
|
||||||
|
* $Revision: V1.9.0
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define FFTINIT(EXT,SIZE) \
|
||||||
|
S->bitRevLength = arm_cfft_sR_##EXT##_len##SIZE.bitRevLength; \
|
||||||
|
S->pBitRevTable = arm_cfft_sR_##EXT##_len##SIZE.pBitRevTable; \
|
||||||
|
S->pTwiddle = arm_cfft_sR_##EXT##_len##SIZE.pTwiddle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@addtogroup ComplexFFT
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Initialization function for the cfft f32 function
|
||||||
|
@param[in,out] S points to an instance of the floating-point CFFT structure
|
||||||
|
@param[in] fftLen fft length (number of complex samples)
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
|
||||||
|
@par Use of this function is mandatory only for the MVE version of the FFT.
|
||||||
|
Other versions can still initialize directly the data structure using
|
||||||
|
variables declared in arm_const_structs.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
#include "arm_const_structs.h"
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
|
||||||
|
#include "arm_vec_fft.h"
|
||||||
|
#include "arm_mve_tables.h"
|
||||||
|
|
||||||
|
arm_status arm_cfft_radix4by2_rearrange_twiddles_f32(arm_cfft_instance_f32 *S, int twidCoefModifier)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (S->fftLen >> (twidCoefModifier - 1)) {
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
|
||||||
|
|| defined(ARM_TABLE_TWIDDLECOEF_F32_4096)
|
||||||
|
case 4096U:
|
||||||
|
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_4096_f32;
|
||||||
|
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_4096_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_4096_f32;
|
||||||
|
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_4096_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_4096_f32;
|
||||||
|
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_4096_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
|
||||||
|
|| defined(ARM_TABLE_TWIDDLECOEF_F32_1024) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048)
|
||||||
|
case 1024U:
|
||||||
|
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_1024_f32;
|
||||||
|
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_1024_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_1024_f32;
|
||||||
|
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_1024_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_1024_f32;
|
||||||
|
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_1024_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
|
||||||
|
|| defined(ARM_TABLE_TWIDDLECOEF_F32_256) || defined(ARM_TABLE_TWIDDLECOEF_F32_512)
|
||||||
|
case 256U:
|
||||||
|
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_256_f32;
|
||||||
|
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_256_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_256_f32;
|
||||||
|
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_256_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_256_f32;
|
||||||
|
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_256_f32;
|
||||||
|
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
|
||||||
|
|| defined(ARM_TABLE_TWIDDLECOEF_F32_64) || defined(ARM_TABLE_TWIDDLECOEF_F32_128)
|
||||||
|
case 64U:
|
||||||
|
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_64_f32;
|
||||||
|
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_64_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_64_f32;
|
||||||
|
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_64_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_64_f32;
|
||||||
|
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_64_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
|
||||||
|
|| defined(ARM_TABLE_TWIDDLECOEF_F32_16) || defined(ARM_TABLE_TWIDDLECOEF_F32_32)
|
||||||
|
case 16U:
|
||||||
|
S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_16_f32;
|
||||||
|
S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_16_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_16_f32;
|
||||||
|
S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_16_f32;
|
||||||
|
|
||||||
|
S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_16_f32;
|
||||||
|
S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_16_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
return(ARM_MATH_ARGUMENT_ERROR);
|
||||||
|
break;
|
||||||
|
/* invalid sizes already filtered */
|
||||||
|
}
|
||||||
|
|
||||||
|
return(ARM_MATH_SUCCESS);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
arm_status arm_cfft_init_f32(
|
||||||
|
arm_cfft_instance_f32 * S,
|
||||||
|
uint16_t fftLen)
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Initialise the default arm status */
|
||||||
|
arm_status status = ARM_MATH_SUCCESS;
|
||||||
|
|
||||||
|
/* Initialise the FFT length */
|
||||||
|
S->fftLen = fftLen;
|
||||||
|
|
||||||
|
/* Initialise the Twiddle coefficient pointer */
|
||||||
|
S->pTwiddle = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/* Initializations of Instance structure depending on the FFT length */
|
||||||
|
switch (S->fftLen) {
|
||||||
|
/* Initializations of structure parameters for 4096 point FFT */
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_F32_4096))
|
||||||
|
case 4096U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_4096;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_4096;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_F32_2048))
|
||||||
|
/* Initializations of structure parameters for 2048 point FFT */
|
||||||
|
case 2048U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_2048;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_2048;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_F32_1024))
|
||||||
|
/* Initializations of structure parameters for 1024 point FFT */
|
||||||
|
case 1024U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_1024;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_1024;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_F32_512))
|
||||||
|
/* Initializations of structure parameters for 512 point FFT */
|
||||||
|
case 512U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_512;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_512;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_F32_256))
|
||||||
|
case 256U:
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_256;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_256;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_F32_128))
|
||||||
|
case 128U:
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_128;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_128;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_F32_64))
|
||||||
|
case 64U:
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_64;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_64;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_F32_32))
|
||||||
|
case 32U:
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_32;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_32;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_F32_16))
|
||||||
|
case 16U:
|
||||||
|
/* Initializations of structure parameters for 16 point FFT */
|
||||||
|
S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH;
|
||||||
|
S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_16;
|
||||||
|
S->pTwiddle = (float32_t *)twiddleCoef_16;
|
||||||
|
status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Reporting argument error if fftSize is not valid value */
|
||||||
|
status = ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (status);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
arm_status arm_cfft_init_f32(
|
||||||
|
arm_cfft_instance_f32 * S,
|
||||||
|
uint16_t fftLen)
|
||||||
|
{
|
||||||
|
/* Initialise the default arm status */
|
||||||
|
arm_status status = ARM_MATH_SUCCESS;
|
||||||
|
|
||||||
|
/* Initialise the FFT length */
|
||||||
|
S->fftLen = fftLen;
|
||||||
|
|
||||||
|
/* Initialise the Twiddle coefficient pointer */
|
||||||
|
S->pTwiddle = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/* Initializations of Instance structure depending on the FFT length */
|
||||||
|
switch (S->fftLen) {
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096))
|
||||||
|
/* Initializations of structure parameters for 4096 point FFT */
|
||||||
|
case 4096U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
FFTINIT(f32,4096);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048))
|
||||||
|
/* Initializations of structure parameters for 2048 point FFT */
|
||||||
|
case 2048U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
FFTINIT(f32,2048);
|
||||||
|
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024))
|
||||||
|
/* Initializations of structure parameters for 1024 point FFT */
|
||||||
|
case 1024U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
FFTINIT(f32,1024);
|
||||||
|
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512))
|
||||||
|
/* Initializations of structure parameters for 512 point FFT */
|
||||||
|
case 512U:
|
||||||
|
/* Initialise the bit reversal table modifier */
|
||||||
|
FFTINIT(f32,512);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256))
|
||||||
|
case 256U:
|
||||||
|
FFTINIT(f32,256);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128))
|
||||||
|
case 128U:
|
||||||
|
FFTINIT(f32,128);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64))
|
||||||
|
case 64U:
|
||||||
|
FFTINIT(f32,64);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
|
||||||
|
case 32U:
|
||||||
|
FFTINIT(f32,32);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
|
||||||
|
case 16U:
|
||||||
|
/* Initializations of structure parameters for 16 point FFT */
|
||||||
|
FFTINIT(f32,16);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Reporting argument error if fftSize is not valid value */
|
||||||
|
status = ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return (status);
|
||||||
|
}
|
||||||
|
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
@} end of ComplexFFT group
|
||||||
|
*/
|
||||||
@@ -0,0 +1,285 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_cfft_radix8_f32.c
|
||||||
|
* Description: Radix-8 Decimation in Frequency CFFT & CIFFT Floating point processing function
|
||||||
|
*
|
||||||
|
* $Date: 23 April 2021
|
||||||
|
* $Revision: V1.9.0
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Internal helper function used by the FFTs
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
brief Core function for the floating-point CFFT butterfly process.
|
||||||
|
param[in,out] pSrc points to the in-place buffer of floating-point data type.
|
||||||
|
param[in] fftLen length of the FFT.
|
||||||
|
param[in] pCoef points to the twiddle coefficient buffer.
|
||||||
|
param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
|
||||||
|
return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_radix8_butterfly_f32(
|
||||||
|
float32_t * pSrc,
|
||||||
|
uint16_t fftLen,
|
||||||
|
const float32_t * pCoef,
|
||||||
|
uint16_t twidCoefModifier)
|
||||||
|
{
|
||||||
|
uint32_t ia1, ia2, ia3, ia4, ia5, ia6, ia7;
|
||||||
|
uint32_t i1, i2, i3, i4, i5, i6, i7, i8;
|
||||||
|
uint32_t id;
|
||||||
|
uint32_t n1, n2, j;
|
||||||
|
|
||||||
|
float32_t r1, r2, r3, r4, r5, r6, r7, r8;
|
||||||
|
float32_t t1, t2;
|
||||||
|
float32_t s1, s2, s3, s4, s5, s6, s7, s8;
|
||||||
|
float32_t p1, p2, p3, p4;
|
||||||
|
float32_t co2, co3, co4, co5, co6, co7, co8;
|
||||||
|
float32_t si2, si3, si4, si5, si6, si7, si8;
|
||||||
|
const float32_t C81 = 0.70710678118f;
|
||||||
|
|
||||||
|
n2 = fftLen;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
n1 = n2;
|
||||||
|
n2 = n2 >> 3;
|
||||||
|
i1 = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
i2 = i1 + n2;
|
||||||
|
i3 = i2 + n2;
|
||||||
|
i4 = i3 + n2;
|
||||||
|
i5 = i4 + n2;
|
||||||
|
i6 = i5 + n2;
|
||||||
|
i7 = i6 + n2;
|
||||||
|
i8 = i7 + n2;
|
||||||
|
r1 = pSrc[2 * i1] + pSrc[2 * i5];
|
||||||
|
r5 = pSrc[2 * i1] - pSrc[2 * i5];
|
||||||
|
r2 = pSrc[2 * i2] + pSrc[2 * i6];
|
||||||
|
r6 = pSrc[2 * i2] - pSrc[2 * i6];
|
||||||
|
r3 = pSrc[2 * i3] + pSrc[2 * i7];
|
||||||
|
r7 = pSrc[2 * i3] - pSrc[2 * i7];
|
||||||
|
r4 = pSrc[2 * i4] + pSrc[2 * i8];
|
||||||
|
r8 = pSrc[2 * i4] - pSrc[2 * i8];
|
||||||
|
t1 = r1 - r3;
|
||||||
|
r1 = r1 + r3;
|
||||||
|
r3 = r2 - r4;
|
||||||
|
r2 = r2 + r4;
|
||||||
|
pSrc[2 * i1] = r1 + r2;
|
||||||
|
pSrc[2 * i5] = r1 - r2;
|
||||||
|
r1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1];
|
||||||
|
s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1];
|
||||||
|
r2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1];
|
||||||
|
s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1];
|
||||||
|
s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1];
|
||||||
|
s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1];
|
||||||
|
r4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1];
|
||||||
|
s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1];
|
||||||
|
t2 = r1 - s3;
|
||||||
|
r1 = r1 + s3;
|
||||||
|
s3 = r2 - r4;
|
||||||
|
r2 = r2 + r4;
|
||||||
|
pSrc[2 * i1 + 1] = r1 + r2;
|
||||||
|
pSrc[2 * i5 + 1] = r1 - r2;
|
||||||
|
pSrc[2 * i3] = t1 + s3;
|
||||||
|
pSrc[2 * i7] = t1 - s3;
|
||||||
|
pSrc[2 * i3 + 1] = t2 - r3;
|
||||||
|
pSrc[2 * i7 + 1] = t2 + r3;
|
||||||
|
r1 = (r6 - r8) * C81;
|
||||||
|
r6 = (r6 + r8) * C81;
|
||||||
|
r2 = (s6 - s8) * C81;
|
||||||
|
s6 = (s6 + s8) * C81;
|
||||||
|
t1 = r5 - r1;
|
||||||
|
r5 = r5 + r1;
|
||||||
|
r8 = r7 - r6;
|
||||||
|
r7 = r7 + r6;
|
||||||
|
t2 = s5 - r2;
|
||||||
|
s5 = s5 + r2;
|
||||||
|
s8 = s7 - s6;
|
||||||
|
s7 = s7 + s6;
|
||||||
|
pSrc[2 * i2] = r5 + s7;
|
||||||
|
pSrc[2 * i8] = r5 - s7;
|
||||||
|
pSrc[2 * i6] = t1 + s8;
|
||||||
|
pSrc[2 * i4] = t1 - s8;
|
||||||
|
pSrc[2 * i2 + 1] = s5 - r7;
|
||||||
|
pSrc[2 * i8 + 1] = s5 + r7;
|
||||||
|
pSrc[2 * i6 + 1] = t2 - r8;
|
||||||
|
pSrc[2 * i4 + 1] = t2 + r8;
|
||||||
|
|
||||||
|
i1 += n1;
|
||||||
|
} while (i1 < fftLen);
|
||||||
|
|
||||||
|
if (n2 < 8)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ia1 = 0;
|
||||||
|
j = 1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* index calculation for the coefficients */
|
||||||
|
id = ia1 + twidCoefModifier;
|
||||||
|
ia1 = id;
|
||||||
|
ia2 = ia1 + id;
|
||||||
|
ia3 = ia2 + id;
|
||||||
|
ia4 = ia3 + id;
|
||||||
|
ia5 = ia4 + id;
|
||||||
|
ia6 = ia5 + id;
|
||||||
|
ia7 = ia6 + id;
|
||||||
|
|
||||||
|
co2 = pCoef[2 * ia1];
|
||||||
|
co3 = pCoef[2 * ia2];
|
||||||
|
co4 = pCoef[2 * ia3];
|
||||||
|
co5 = pCoef[2 * ia4];
|
||||||
|
co6 = pCoef[2 * ia5];
|
||||||
|
co7 = pCoef[2 * ia6];
|
||||||
|
co8 = pCoef[2 * ia7];
|
||||||
|
si2 = pCoef[2 * ia1 + 1];
|
||||||
|
si3 = pCoef[2 * ia2 + 1];
|
||||||
|
si4 = pCoef[2 * ia3 + 1];
|
||||||
|
si5 = pCoef[2 * ia4 + 1];
|
||||||
|
si6 = pCoef[2 * ia5 + 1];
|
||||||
|
si7 = pCoef[2 * ia6 + 1];
|
||||||
|
si8 = pCoef[2 * ia7 + 1];
|
||||||
|
|
||||||
|
i1 = j;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* index calculation for the input */
|
||||||
|
i2 = i1 + n2;
|
||||||
|
i3 = i2 + n2;
|
||||||
|
i4 = i3 + n2;
|
||||||
|
i5 = i4 + n2;
|
||||||
|
i6 = i5 + n2;
|
||||||
|
i7 = i6 + n2;
|
||||||
|
i8 = i7 + n2;
|
||||||
|
r1 = pSrc[2 * i1] + pSrc[2 * i5];
|
||||||
|
r5 = pSrc[2 * i1] - pSrc[2 * i5];
|
||||||
|
r2 = pSrc[2 * i2] + pSrc[2 * i6];
|
||||||
|
r6 = pSrc[2 * i2] - pSrc[2 * i6];
|
||||||
|
r3 = pSrc[2 * i3] + pSrc[2 * i7];
|
||||||
|
r7 = pSrc[2 * i3] - pSrc[2 * i7];
|
||||||
|
r4 = pSrc[2 * i4] + pSrc[2 * i8];
|
||||||
|
r8 = pSrc[2 * i4] - pSrc[2 * i8];
|
||||||
|
t1 = r1 - r3;
|
||||||
|
r1 = r1 + r3;
|
||||||
|
r3 = r2 - r4;
|
||||||
|
r2 = r2 + r4;
|
||||||
|
pSrc[2 * i1] = r1 + r2;
|
||||||
|
r2 = r1 - r2;
|
||||||
|
s1 = pSrc[2 * i1 + 1] + pSrc[2 * i5 + 1];
|
||||||
|
s5 = pSrc[2 * i1 + 1] - pSrc[2 * i5 + 1];
|
||||||
|
s2 = pSrc[2 * i2 + 1] + pSrc[2 * i6 + 1];
|
||||||
|
s6 = pSrc[2 * i2 + 1] - pSrc[2 * i6 + 1];
|
||||||
|
s3 = pSrc[2 * i3 + 1] + pSrc[2 * i7 + 1];
|
||||||
|
s7 = pSrc[2 * i3 + 1] - pSrc[2 * i7 + 1];
|
||||||
|
s4 = pSrc[2 * i4 + 1] + pSrc[2 * i8 + 1];
|
||||||
|
s8 = pSrc[2 * i4 + 1] - pSrc[2 * i8 + 1];
|
||||||
|
t2 = s1 - s3;
|
||||||
|
s1 = s1 + s3;
|
||||||
|
s3 = s2 - s4;
|
||||||
|
s2 = s2 + s4;
|
||||||
|
r1 = t1 + s3;
|
||||||
|
t1 = t1 - s3;
|
||||||
|
pSrc[2 * i1 + 1] = s1 + s2;
|
||||||
|
s2 = s1 - s2;
|
||||||
|
s1 = t2 - r3;
|
||||||
|
t2 = t2 + r3;
|
||||||
|
p1 = co5 * r2;
|
||||||
|
p2 = si5 * s2;
|
||||||
|
p3 = co5 * s2;
|
||||||
|
p4 = si5 * r2;
|
||||||
|
pSrc[2 * i5] = p1 + p2;
|
||||||
|
pSrc[2 * i5 + 1] = p3 - p4;
|
||||||
|
p1 = co3 * r1;
|
||||||
|
p2 = si3 * s1;
|
||||||
|
p3 = co3 * s1;
|
||||||
|
p4 = si3 * r1;
|
||||||
|
pSrc[2 * i3] = p1 + p2;
|
||||||
|
pSrc[2 * i3 + 1] = p3 - p4;
|
||||||
|
p1 = co7 * t1;
|
||||||
|
p2 = si7 * t2;
|
||||||
|
p3 = co7 * t2;
|
||||||
|
p4 = si7 * t1;
|
||||||
|
pSrc[2 * i7] = p1 + p2;
|
||||||
|
pSrc[2 * i7 + 1] = p3 - p4;
|
||||||
|
r1 = (r6 - r8) * C81;
|
||||||
|
r6 = (r6 + r8) * C81;
|
||||||
|
s1 = (s6 - s8) * C81;
|
||||||
|
s6 = (s6 + s8) * C81;
|
||||||
|
t1 = r5 - r1;
|
||||||
|
r5 = r5 + r1;
|
||||||
|
r8 = r7 - r6;
|
||||||
|
r7 = r7 + r6;
|
||||||
|
t2 = s5 - s1;
|
||||||
|
s5 = s5 + s1;
|
||||||
|
s8 = s7 - s6;
|
||||||
|
s7 = s7 + s6;
|
||||||
|
r1 = r5 + s7;
|
||||||
|
r5 = r5 - s7;
|
||||||
|
r6 = t1 + s8;
|
||||||
|
t1 = t1 - s8;
|
||||||
|
s1 = s5 - r7;
|
||||||
|
s5 = s5 + r7;
|
||||||
|
s6 = t2 - r8;
|
||||||
|
t2 = t2 + r8;
|
||||||
|
p1 = co2 * r1;
|
||||||
|
p2 = si2 * s1;
|
||||||
|
p3 = co2 * s1;
|
||||||
|
p4 = si2 * r1;
|
||||||
|
pSrc[2 * i2] = p1 + p2;
|
||||||
|
pSrc[2 * i2 + 1] = p3 - p4;
|
||||||
|
p1 = co8 * r5;
|
||||||
|
p2 = si8 * s5;
|
||||||
|
p3 = co8 * s5;
|
||||||
|
p4 = si8 * r5;
|
||||||
|
pSrc[2 * i8] = p1 + p2;
|
||||||
|
pSrc[2 * i8 + 1] = p3 - p4;
|
||||||
|
p1 = co6 * r6;
|
||||||
|
p2 = si6 * s6;
|
||||||
|
p3 = co6 * s6;
|
||||||
|
p4 = si6 * r6;
|
||||||
|
pSrc[2 * i6] = p1 + p2;
|
||||||
|
pSrc[2 * i6 + 1] = p3 - p4;
|
||||||
|
p1 = co4 * t1;
|
||||||
|
p2 = si4 * t2;
|
||||||
|
p3 = co4 * t2;
|
||||||
|
p4 = si4 * t1;
|
||||||
|
pSrc[2 * i4] = p1 + p2;
|
||||||
|
pSrc[2 * i4 + 1] = p3 - p4;
|
||||||
|
|
||||||
|
i1 += n1;
|
||||||
|
} while (i1 < fftLen);
|
||||||
|
|
||||||
|
j++;
|
||||||
|
} while (j < n2);
|
||||||
|
|
||||||
|
twidCoefModifier <<= 3;
|
||||||
|
} while (n2 > 7);
|
||||||
|
}
|
||||||
@@ -0,0 +1,603 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_rfft_fast_f32.c
|
||||||
|
* Description: RFFT & RIFFT Floating point process function
|
||||||
|
*
|
||||||
|
* $Date: 23 April 2021
|
||||||
|
* $Revision: V1.9.0
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
|
||||||
|
#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
|
||||||
|
void stage_rfft_f32(
|
||||||
|
const arm_rfft_fast_instance_f32 * S,
|
||||||
|
float32_t * p,
|
||||||
|
float32_t * pOut)
|
||||||
|
{
|
||||||
|
int32_t k; /* Loop Counter */
|
||||||
|
float32_t twR, twI; /* RFFT Twiddle coefficients */
|
||||||
|
const float32_t * pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */
|
||||||
|
float32_t *pA = p; /* increasing pointer */
|
||||||
|
float32_t *pB = p; /* decreasing pointer */
|
||||||
|
float32_t xAR, xAI, xBR, xBI; /* temporary variables */
|
||||||
|
float32_t t1a, t1b; /* temporary variables */
|
||||||
|
float32_t p0, p1, p2, p3; /* temporary variables */
|
||||||
|
|
||||||
|
float32x4x2_t tw,xA,xB;
|
||||||
|
float32x4x2_t tmp1, tmp2, res;
|
||||||
|
|
||||||
|
uint32x4_t vecStridesFwd, vecStridesBkwd;
|
||||||
|
|
||||||
|
vecStridesFwd = vidupq_u32((uint32_t)0, 2);
|
||||||
|
vecStridesBkwd = -vecStridesFwd;
|
||||||
|
|
||||||
|
int blockCnt;
|
||||||
|
|
||||||
|
|
||||||
|
k = (S->Sint).fftLen - 1;
|
||||||
|
|
||||||
|
/* Pack first and last sample of the frequency domain together */
|
||||||
|
|
||||||
|
xBR = pB[0];
|
||||||
|
xBI = pB[1];
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
twR = *pCoeff++ ;
|
||||||
|
twI = *pCoeff++ ;
|
||||||
|
|
||||||
|
// U1 = XA(1) + XB(1); % It is real
|
||||||
|
t1a = xBR + xAR ;
|
||||||
|
|
||||||
|
// U2 = XB(1) - XA(1); % It is imaginary
|
||||||
|
t1b = xBI + xAI ;
|
||||||
|
|
||||||
|
// real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI);
|
||||||
|
// imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI);
|
||||||
|
*pOut++ = 0.5f * ( t1a + t1b );
|
||||||
|
*pOut++ = 0.5f * ( t1a - t1b );
|
||||||
|
|
||||||
|
// XA(1) = 1/2*( U1 - imag(U2) + i*( U1 +imag(U2) ));
|
||||||
|
pB = p + 2*k;
|
||||||
|
pA += 2;
|
||||||
|
|
||||||
|
blockCnt = k >> 2;
|
||||||
|
while (blockCnt > 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
function X = my_split_rfft(X, ifftFlag)
|
||||||
|
% X is a series of real numbers
|
||||||
|
L = length(X);
|
||||||
|
XC = X(1:2:end) +i*X(2:2:end);
|
||||||
|
XA = fft(XC);
|
||||||
|
XB = conj(XA([1 end:-1:2]));
|
||||||
|
TW = i*exp(-2*pi*i*[0:L/2-1]/L).';
|
||||||
|
for l = 2:L/2
|
||||||
|
XA(l) = 1/2 * (XA(l) + XB(l) + TW(l) * (XB(l) - XA(l)));
|
||||||
|
end
|
||||||
|
XA(1) = 1/2* (XA(1) + XB(1) + TW(1) * (XB(1) - XA(1))) + i*( 1/2*( XA(1) + XB(1) + i*( XA(1) - XB(1))));
|
||||||
|
X = XA;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
xA = vld2q_f32(pA);
|
||||||
|
pA += 8;
|
||||||
|
|
||||||
|
xB = vld2q_f32(pB);
|
||||||
|
|
||||||
|
xB.val[0] = vldrwq_gather_shifted_offset_f32(pB, vecStridesBkwd);
|
||||||
|
xB.val[1] = vldrwq_gather_shifted_offset_f32(&pB[1], vecStridesBkwd);
|
||||||
|
|
||||||
|
xB.val[1] = vnegq_f32(xB.val[1]);
|
||||||
|
pB -= 8;
|
||||||
|
|
||||||
|
|
||||||
|
tw = vld2q_f32(pCoeff);
|
||||||
|
pCoeff += 8;
|
||||||
|
|
||||||
|
|
||||||
|
tmp1.val[0] = vaddq_f32(xA.val[0],xB.val[0]);
|
||||||
|
tmp1.val[1] = vaddq_f32(xA.val[1],xB.val[1]);
|
||||||
|
|
||||||
|
tmp2.val[0] = vsubq_f32(xB.val[0],xA.val[0]);
|
||||||
|
tmp2.val[1] = vsubq_f32(xB.val[1],xA.val[1]);
|
||||||
|
|
||||||
|
res.val[0] = vmulq(tw.val[0], tmp2.val[0]);
|
||||||
|
res.val[0] = vfmsq(res.val[0],tw.val[1], tmp2.val[1]);
|
||||||
|
|
||||||
|
res.val[1] = vmulq(tw.val[0], tmp2.val[1]);
|
||||||
|
res.val[1] = vfmaq(res.val[1], tw.val[1], tmp2.val[0]);
|
||||||
|
|
||||||
|
res.val[0] = vaddq_f32(res.val[0],tmp1.val[0] );
|
||||||
|
res.val[1] = vaddq_f32(res.val[1],tmp1.val[1] );
|
||||||
|
|
||||||
|
res.val[0] = vmulq_n_f32(res.val[0], 0.5f);
|
||||||
|
res.val[1] = vmulq_n_f32(res.val[1], 0.5f);
|
||||||
|
|
||||||
|
|
||||||
|
vst2q_f32(pOut, res);
|
||||||
|
pOut += 8;
|
||||||
|
|
||||||
|
|
||||||
|
blockCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockCnt = k & 3;
|
||||||
|
while (blockCnt > 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
function X = my_split_rfft(X, ifftFlag)
|
||||||
|
% X is a series of real numbers
|
||||||
|
L = length(X);
|
||||||
|
XC = X(1:2:end) +i*X(2:2:end);
|
||||||
|
XA = fft(XC);
|
||||||
|
XB = conj(XA([1 end:-1:2]));
|
||||||
|
TW = i*exp(-2*pi*i*[0:L/2-1]/L).';
|
||||||
|
for l = 2:L/2
|
||||||
|
XA(l) = 1/2 * (XA(l) + XB(l) + TW(l) * (XB(l) - XA(l)));
|
||||||
|
end
|
||||||
|
XA(1) = 1/2* (XA(1) + XB(1) + TW(1) * (XB(1) - XA(1))) + i*( 1/2*( XA(1) + XB(1) + i*( XA(1) - XB(1))));
|
||||||
|
X = XA;
|
||||||
|
*/
|
||||||
|
|
||||||
|
xBI = pB[1];
|
||||||
|
xBR = pB[0];
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
twR = *pCoeff++;
|
||||||
|
twI = *pCoeff++;
|
||||||
|
|
||||||
|
t1a = xBR - xAR ;
|
||||||
|
t1b = xBI + xAI ;
|
||||||
|
|
||||||
|
// real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI);
|
||||||
|
// imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI);
|
||||||
|
p0 = twR * t1a;
|
||||||
|
p1 = twI * t1a;
|
||||||
|
p2 = twR * t1b;
|
||||||
|
p3 = twI * t1b;
|
||||||
|
|
||||||
|
*pOut++ = 0.5f * (xAR + xBR + p0 + p3 ); //xAR
|
||||||
|
*pOut++ = 0.5f * (xAI - xBI + p1 - p2 ); //xAI
|
||||||
|
|
||||||
|
pA += 2;
|
||||||
|
pB -= 2;
|
||||||
|
blockCnt--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepares data for inverse cfft */
|
||||||
|
void merge_rfft_f32(
|
||||||
|
const arm_rfft_fast_instance_f32 * S,
|
||||||
|
float32_t * p,
|
||||||
|
float32_t * pOut)
|
||||||
|
{
|
||||||
|
int32_t k; /* Loop Counter */
|
||||||
|
float32_t twR, twI; /* RFFT Twiddle coefficients */
|
||||||
|
const float32_t *pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */
|
||||||
|
float32_t *pA = p; /* increasing pointer */
|
||||||
|
float32_t *pB = p; /* decreasing pointer */
|
||||||
|
float32_t xAR, xAI, xBR, xBI; /* temporary variables */
|
||||||
|
float32_t t1a, t1b, r, s, t, u; /* temporary variables */
|
||||||
|
|
||||||
|
float32x4x2_t tw,xA,xB;
|
||||||
|
float32x4x2_t tmp1, tmp2, res;
|
||||||
|
uint32x4_t vecStridesFwd, vecStridesBkwd;
|
||||||
|
|
||||||
|
vecStridesFwd = vidupq_u32((uint32_t)0, 2);
|
||||||
|
vecStridesBkwd = -vecStridesFwd;
|
||||||
|
|
||||||
|
int blockCnt;
|
||||||
|
|
||||||
|
|
||||||
|
k = (S->Sint).fftLen - 1;
|
||||||
|
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
pCoeff += 2 ;
|
||||||
|
|
||||||
|
*pOut++ = 0.5f * ( xAR + xAI );
|
||||||
|
*pOut++ = 0.5f * ( xAR - xAI );
|
||||||
|
|
||||||
|
pB = p + 2*k ;
|
||||||
|
pA += 2 ;
|
||||||
|
|
||||||
|
blockCnt = k >> 2;
|
||||||
|
while (blockCnt > 0)
|
||||||
|
{
|
||||||
|
/* G is half of the frequency complex spectrum */
|
||||||
|
//for k = 2:N
|
||||||
|
// Xk(k) = 1/2 * (G(k) + conj(G(N-k+2)) + Tw(k)*( G(k) - conj(G(N-k+2))));
|
||||||
|
xA = vld2q_f32(pA);
|
||||||
|
pA += 8;
|
||||||
|
|
||||||
|
xB = vld2q_f32(pB);
|
||||||
|
|
||||||
|
xB.val[0] = vldrwq_gather_shifted_offset_f32(pB, vecStridesBkwd);
|
||||||
|
xB.val[1] = vldrwq_gather_shifted_offset_f32(&pB[1], vecStridesBkwd);
|
||||||
|
|
||||||
|
xB.val[1] = vnegq_f32(xB.val[1]);
|
||||||
|
pB -= 8;
|
||||||
|
|
||||||
|
|
||||||
|
tw = vld2q_f32(pCoeff);
|
||||||
|
tw.val[1] = vnegq_f32(tw.val[1]);
|
||||||
|
pCoeff += 8;
|
||||||
|
|
||||||
|
|
||||||
|
tmp1.val[0] = vaddq_f32(xA.val[0],xB.val[0]);
|
||||||
|
tmp1.val[1] = vaddq_f32(xA.val[1],xB.val[1]);
|
||||||
|
|
||||||
|
tmp2.val[0] = vsubq_f32(xB.val[0],xA.val[0]);
|
||||||
|
tmp2.val[1] = vsubq_f32(xB.val[1],xA.val[1]);
|
||||||
|
|
||||||
|
res.val[0] = vmulq(tw.val[0], tmp2.val[0]);
|
||||||
|
res.val[0] = vfmsq(res.val[0],tw.val[1], tmp2.val[1]);
|
||||||
|
|
||||||
|
res.val[1] = vmulq(tw.val[0], tmp2.val[1]);
|
||||||
|
res.val[1] = vfmaq(res.val[1], tw.val[1], tmp2.val[0]);
|
||||||
|
|
||||||
|
res.val[0] = vaddq_f32(res.val[0],tmp1.val[0] );
|
||||||
|
res.val[1] = vaddq_f32(res.val[1],tmp1.val[1] );
|
||||||
|
|
||||||
|
res.val[0] = vmulq_n_f32(res.val[0], 0.5f);
|
||||||
|
res.val[1] = vmulq_n_f32(res.val[1], 0.5f);
|
||||||
|
|
||||||
|
|
||||||
|
vst2q_f32(pOut, res);
|
||||||
|
pOut += 8;
|
||||||
|
|
||||||
|
|
||||||
|
blockCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockCnt = k & 3;
|
||||||
|
while (blockCnt > 0)
|
||||||
|
{
|
||||||
|
/* G is half of the frequency complex spectrum */
|
||||||
|
//for k = 2:N
|
||||||
|
// Xk(k) = 1/2 * (G(k) + conj(G(N-k+2)) + Tw(k)*( G(k) - conj(G(N-k+2))));
|
||||||
|
xBI = pB[1] ;
|
||||||
|
xBR = pB[0] ;
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
twR = *pCoeff++;
|
||||||
|
twI = *pCoeff++;
|
||||||
|
|
||||||
|
t1a = xAR - xBR ;
|
||||||
|
t1b = xAI + xBI ;
|
||||||
|
|
||||||
|
r = twR * t1a;
|
||||||
|
s = twI * t1b;
|
||||||
|
t = twI * t1a;
|
||||||
|
u = twR * t1b;
|
||||||
|
|
||||||
|
// real(tw * (xA - xB)) = twR * (xAR - xBR) - twI * (xAI - xBI);
|
||||||
|
// imag(tw * (xA - xB)) = twI * (xAR - xBR) + twR * (xAI - xBI);
|
||||||
|
*pOut++ = 0.5f * (xAR + xBR - r - s ); //xAR
|
||||||
|
*pOut++ = 0.5f * (xAI - xBI + t - u ); //xAI
|
||||||
|
|
||||||
|
pA += 2;
|
||||||
|
pB -= 2;
|
||||||
|
blockCnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void stage_rfft_f32(
|
||||||
|
const arm_rfft_fast_instance_f32 * S,
|
||||||
|
float32_t * p,
|
||||||
|
float32_t * pOut)
|
||||||
|
{
|
||||||
|
int32_t k; /* Loop Counter */
|
||||||
|
float32_t twR, twI; /* RFFT Twiddle coefficients */
|
||||||
|
const float32_t * pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */
|
||||||
|
float32_t *pA = p; /* increasing pointer */
|
||||||
|
float32_t *pB = p; /* decreasing pointer */
|
||||||
|
float32_t xAR, xAI, xBR, xBI; /* temporary variables */
|
||||||
|
float32_t t1a, t1b; /* temporary variables */
|
||||||
|
float32_t p0, p1, p2, p3; /* temporary variables */
|
||||||
|
|
||||||
|
|
||||||
|
k = (S->Sint).fftLen - 1;
|
||||||
|
|
||||||
|
/* Pack first and last sample of the frequency domain together */
|
||||||
|
|
||||||
|
xBR = pB[0];
|
||||||
|
xBI = pB[1];
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
twR = *pCoeff++ ;
|
||||||
|
twI = *pCoeff++ ;
|
||||||
|
|
||||||
|
|
||||||
|
// U1 = XA(1) + XB(1); % It is real
|
||||||
|
t1a = xBR + xAR ;
|
||||||
|
|
||||||
|
// U2 = XB(1) - XA(1); % It is imaginary
|
||||||
|
t1b = xBI + xAI ;
|
||||||
|
|
||||||
|
// real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI);
|
||||||
|
// imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI);
|
||||||
|
*pOut++ = 0.5f * ( t1a + t1b );
|
||||||
|
*pOut++ = 0.5f * ( t1a - t1b );
|
||||||
|
|
||||||
|
// XA(1) = 1/2*( U1 - imag(U2) + i*( U1 +imag(U2) ));
|
||||||
|
pB = p + 2*k;
|
||||||
|
pA += 2;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
function X = my_split_rfft(X, ifftFlag)
|
||||||
|
% X is a series of real numbers
|
||||||
|
L = length(X);
|
||||||
|
XC = X(1:2:end) +i*X(2:2:end);
|
||||||
|
XA = fft(XC);
|
||||||
|
XB = conj(XA([1 end:-1:2]));
|
||||||
|
TW = i*exp(-2*pi*i*[0:L/2-1]/L).';
|
||||||
|
for l = 2:L/2
|
||||||
|
XA(l) = 1/2 * (XA(l) + XB(l) + TW(l) * (XB(l) - XA(l)));
|
||||||
|
end
|
||||||
|
XA(1) = 1/2* (XA(1) + XB(1) + TW(1) * (XB(1) - XA(1))) + i*( 1/2*( XA(1) + XB(1) + i*( XA(1) - XB(1))));
|
||||||
|
X = XA;
|
||||||
|
*/
|
||||||
|
|
||||||
|
xBI = pB[1];
|
||||||
|
xBR = pB[0];
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
twR = *pCoeff++;
|
||||||
|
twI = *pCoeff++;
|
||||||
|
|
||||||
|
t1a = xBR - xAR ;
|
||||||
|
t1b = xBI + xAI ;
|
||||||
|
|
||||||
|
// real(tw * (xB - xA)) = twR * (xBR - xAR) - twI * (xBI - xAI);
|
||||||
|
// imag(tw * (xB - xA)) = twI * (xBR - xAR) + twR * (xBI - xAI);
|
||||||
|
p0 = twR * t1a;
|
||||||
|
p1 = twI * t1a;
|
||||||
|
p2 = twR * t1b;
|
||||||
|
p3 = twI * t1b;
|
||||||
|
|
||||||
|
*pOut++ = 0.5f * (xAR + xBR + p0 + p3 ); //xAR
|
||||||
|
*pOut++ = 0.5f * (xAI - xBI + p1 - p2 ); //xAI
|
||||||
|
|
||||||
|
|
||||||
|
pA += 2;
|
||||||
|
pB -= 2;
|
||||||
|
k--;
|
||||||
|
} while (k > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prepares data for inverse cfft */
|
||||||
|
void merge_rfft_f32(
|
||||||
|
const arm_rfft_fast_instance_f32 * S,
|
||||||
|
float32_t * p,
|
||||||
|
float32_t * pOut)
|
||||||
|
{
|
||||||
|
int32_t k; /* Loop Counter */
|
||||||
|
float32_t twR, twI; /* RFFT Twiddle coefficients */
|
||||||
|
const float32_t *pCoeff = S->pTwiddleRFFT; /* Points to RFFT Twiddle factors */
|
||||||
|
float32_t *pA = p; /* increasing pointer */
|
||||||
|
float32_t *pB = p; /* decreasing pointer */
|
||||||
|
float32_t xAR, xAI, xBR, xBI; /* temporary variables */
|
||||||
|
float32_t t1a, t1b, r, s, t, u; /* temporary variables */
|
||||||
|
|
||||||
|
k = (S->Sint).fftLen - 1;
|
||||||
|
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
pCoeff += 2 ;
|
||||||
|
|
||||||
|
*pOut++ = 0.5f * ( xAR + xAI );
|
||||||
|
*pOut++ = 0.5f * ( xAR - xAI );
|
||||||
|
|
||||||
|
pB = p + 2*k ;
|
||||||
|
pA += 2 ;
|
||||||
|
|
||||||
|
while (k > 0)
|
||||||
|
{
|
||||||
|
/* G is half of the frequency complex spectrum */
|
||||||
|
//for k = 2:N
|
||||||
|
// Xk(k) = 1/2 * (G(k) + conj(G(N-k+2)) + Tw(k)*( G(k) - conj(G(N-k+2))));
|
||||||
|
xBI = pB[1] ;
|
||||||
|
xBR = pB[0] ;
|
||||||
|
xAR = pA[0];
|
||||||
|
xAI = pA[1];
|
||||||
|
|
||||||
|
twR = *pCoeff++;
|
||||||
|
twI = *pCoeff++;
|
||||||
|
|
||||||
|
t1a = xAR - xBR ;
|
||||||
|
t1b = xAI + xBI ;
|
||||||
|
|
||||||
|
r = twR * t1a;
|
||||||
|
s = twI * t1b;
|
||||||
|
t = twI * t1a;
|
||||||
|
u = twR * t1b;
|
||||||
|
|
||||||
|
// real(tw * (xA - xB)) = twR * (xAR - xBR) - twI * (xAI - xBI);
|
||||||
|
// imag(tw * (xA - xB)) = twI * (xAR - xBR) + twR * (xAI - xBI);
|
||||||
|
*pOut++ = 0.5f * (xAR + xBR - r - s ); //xAR
|
||||||
|
*pOut++ = 0.5f * (xAI - xBI + t - u ); //xAI
|
||||||
|
|
||||||
|
pA += 2;
|
||||||
|
pB -= 2;
|
||||||
|
k--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
|
||||||
|
|
||||||
|
/**
|
||||||
|
@ingroup groupTransforms
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@defgroup RealFFT Real FFT Functions
|
||||||
|
|
||||||
|
@par
|
||||||
|
The CMSIS DSP library includes specialized algorithms for computing the
|
||||||
|
FFT of real data sequences. The FFT is defined over complex data but
|
||||||
|
in many applications the input is real. Real FFT algorithms take advantage
|
||||||
|
of the symmetry properties of the FFT and have a speed advantage over complex
|
||||||
|
algorithms of the same length.
|
||||||
|
@par
|
||||||
|
The Fast RFFT algorithm relays on the mixed radix CFFT that save processor usage.
|
||||||
|
@par
|
||||||
|
The real length N forward FFT of a sequence is computed using the steps shown below.
|
||||||
|
@par
|
||||||
|
\image html RFFT.gif "Real Fast Fourier Transform"
|
||||||
|
@par
|
||||||
|
The real sequence is initially treated as if it were complex to perform a CFFT.
|
||||||
|
Later, a processing stage reshapes the data to obtain half of the frequency spectrum
|
||||||
|
in complex format. Except the first complex number that contains the two real numbers
|
||||||
|
X[0] and X[N/2] all the data is complex. In other words, the first complex sample
|
||||||
|
contains two real values packed.
|
||||||
|
@par
|
||||||
|
The input for the inverse RFFT should keep the same format as the output of the
|
||||||
|
forward RFFT. A first processing stage pre-process the data to later perform an
|
||||||
|
inverse CFFT.
|
||||||
|
@par
|
||||||
|
\image html RIFFT.gif "Real Inverse Fast Fourier Transform"
|
||||||
|
@par
|
||||||
|
The algorithms for floating-point, Q15, and Q31 data are slightly different
|
||||||
|
and we describe each algorithm in turn.
|
||||||
|
@par Floating-point
|
||||||
|
The main functions are \ref arm_rfft_fast_f32() and \ref arm_rfft_fast_init_f32().
|
||||||
|
The older functions \ref arm_rfft_f32() and \ref arm_rfft_init_f32() have been deprecated
|
||||||
|
but are still documented.
|
||||||
|
@par
|
||||||
|
The FFT of a real N-point sequence has even symmetry in the frequency domain.
|
||||||
|
The second half of the data equals the conjugate of the first half flipped in frequency.
|
||||||
|
Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers.
|
||||||
|
These are packed into the output array in alternating real and imaginary components:
|
||||||
|
@par
|
||||||
|
X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ...
|
||||||
|
real[(N/2)-1], imag[(N/2)-1 }
|
||||||
|
@par
|
||||||
|
It happens that the first complex number (real[0], imag[0]) is actually
|
||||||
|
all real. real[0] represents the DC offset, and imag[0] should be 0.
|
||||||
|
(real[1], imag[1]) is the fundamental frequency, (real[2], imag[2]) is
|
||||||
|
the first harmonic and so on.
|
||||||
|
@par
|
||||||
|
The real FFT functions pack the frequency domain data in this fashion.
|
||||||
|
The forward transform outputs the data in this form and the inverse
|
||||||
|
transform expects input data in this form. The function always performs
|
||||||
|
the needed bitreversal so that the input and output data is always in
|
||||||
|
normal order. The functions support lengths of [32, 64, 128, ..., 4096]
|
||||||
|
samples.
|
||||||
|
@par Q15 and Q31
|
||||||
|
The real algorithms are defined in a similar manner and utilize N/2 complex
|
||||||
|
transforms behind the scenes.
|
||||||
|
@par
|
||||||
|
The complex transforms used internally include scaling to prevent fixed-point
|
||||||
|
overflows. The overall scaling equals 1/(fftLen/2).
|
||||||
|
Due to the use of complex transform internally, the source buffer is
|
||||||
|
modified by the rfft.
|
||||||
|
@par
|
||||||
|
A separate instance structure must be defined for each transform used but
|
||||||
|
twiddle factor and bit reversal tables can be reused.
|
||||||
|
@par
|
||||||
|
There is also an associated initialization function for each data type.
|
||||||
|
The initialization function performs the following operations:
|
||||||
|
- Sets the values of the internal structure fields.
|
||||||
|
- Initializes twiddle factor table and bit reversal table pointers.
|
||||||
|
- Initializes the internal complex FFT data structure.
|
||||||
|
@par
|
||||||
|
Use of the initialization function is optional **except for MVE versions where it is mandatory**.
|
||||||
|
If you don't use the initialization functions, then the structures should be initialized with code
|
||||||
|
similar to the one below:
|
||||||
|
<pre>
|
||||||
|
arm_rfft_instance_q31 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
|
||||||
|
arm_rfft_instance_q15 S = {fftLenReal, fftLenBy2, ifftFlagR, bitReverseFlagR, twidCoefRModifier, pTwiddleAReal, pTwiddleBReal, pCfft};
|
||||||
|
</pre>
|
||||||
|
where <code>fftLenReal</code> is the length of the real transform;
|
||||||
|
<code>fftLenBy2</code> length of the internal complex transform (fftLenReal/2).
|
||||||
|
<code>ifftFlagR</code> Selects forward (=0) or inverse (=1) transform.
|
||||||
|
<code>bitReverseFlagR</code> Selects bit reversed output (=0) or normal order
|
||||||
|
output (=1).
|
||||||
|
<code>twidCoefRModifier</code> stride modifier for the twiddle factor table.
|
||||||
|
The value is based on the FFT length;
|
||||||
|
<code>pTwiddleAReal</code>points to the A array of twiddle coefficients;
|
||||||
|
<code>pTwiddleBReal</code>points to the B array of twiddle coefficients;
|
||||||
|
<code>pCfft</code> points to the CFFT Instance structure. The CFFT structure
|
||||||
|
must also be initialized.
|
||||||
|
@par
|
||||||
|
Note that with MVE versions you can't initialize instance structures directly and **must
|
||||||
|
use the initialization function**.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@addtogroup RealFFT
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Processing function for the floating-point real FFT.
|
||||||
|
@param[in] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@param[in] p points to input buffer (Source buffer is modified by this function.)
|
||||||
|
@param[in] pOut points to output buffer
|
||||||
|
@param[in] ifftFlag
|
||||||
|
- value = 0: RFFT
|
||||||
|
- value = 1: RIFFT
|
||||||
|
@return none
|
||||||
|
*/
|
||||||
|
|
||||||
|
void arm_rfft_fast_f32(
|
||||||
|
const arm_rfft_fast_instance_f32 * S,
|
||||||
|
float32_t * p,
|
||||||
|
float32_t * pOut,
|
||||||
|
uint8_t ifftFlag)
|
||||||
|
{
|
||||||
|
const arm_cfft_instance_f32 * Sint = &(S->Sint);
|
||||||
|
|
||||||
|
/* Calculation of Real FFT */
|
||||||
|
if (ifftFlag)
|
||||||
|
{
|
||||||
|
/* Real FFT compression */
|
||||||
|
merge_rfft_f32(S, p, pOut);
|
||||||
|
/* Complex radix-4 IFFT process */
|
||||||
|
arm_cfft_f32( Sint, pOut, ifftFlag, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Calculation of RFFT of input */
|
||||||
|
arm_cfft_f32( Sint, p, ifftFlag, 1);
|
||||||
|
|
||||||
|
/* Real FFT extraction */
|
||||||
|
stage_rfft_f32(S, p, pOut);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @} end of RealFFT group
|
||||||
|
*/
|
||||||
@@ -0,0 +1,352 @@
|
|||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Project: CMSIS DSP Library
|
||||||
|
* Title: arm_rfft_fast_init_f32.c
|
||||||
|
* Description: Split Radix Decimation in Frequency CFFT Floating point processing function
|
||||||
|
*
|
||||||
|
* $Date: 23 April 2021
|
||||||
|
* $Revision: V1.9.0
|
||||||
|
*
|
||||||
|
* Target Processor: Cortex-M and Cortex-A cores
|
||||||
|
* -------------------------------------------------------------------- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the License); you may
|
||||||
|
* not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an AS IS BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dsp/transform_functions.h"
|
||||||
|
#include "arm_common_tables.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
@ingroup groupTransforms
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@addtogroup RealFFT
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32))
|
||||||
|
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 32pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_32_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),16);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
S->fftLenRFFT = 32U;
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_32;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64))
|
||||||
|
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 64pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_64_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),32);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 64U;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_64;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128))
|
||||||
|
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 128pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_128_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),64);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 128;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_128;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256))
|
||||||
|
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 256pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_256_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),128);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 256U;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_256;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512))
|
||||||
|
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 512pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_512_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),256);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 512U;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_512;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024))
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 1024pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_1024_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),512);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 1024U;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_1024;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048))
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
@brief Initialization function for the 2048pt floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
static arm_status arm_rfft_2048_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),1024);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 2048U;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_2048;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096))
|
||||||
|
/**
|
||||||
|
@private
|
||||||
|
* @brief Initialization function for the 4096pt floating-point real FFT.
|
||||||
|
* @param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
|
||||||
|
*/
|
||||||
|
|
||||||
|
static arm_status arm_rfft_4096_fast_init_f32( arm_rfft_fast_instance_f32 * S ) {
|
||||||
|
|
||||||
|
arm_status status;
|
||||||
|
|
||||||
|
if( !S ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
|
||||||
|
status=arm_cfft_init_f32(&(S->Sint),2048);
|
||||||
|
if (status != ARM_MATH_SUCCESS)
|
||||||
|
{
|
||||||
|
return(status);
|
||||||
|
}
|
||||||
|
S->fftLenRFFT = 4096U;
|
||||||
|
|
||||||
|
S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_4096;
|
||||||
|
|
||||||
|
return ARM_MATH_SUCCESS;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief Initialization function for the floating-point real FFT.
|
||||||
|
@param[in,out] S points to an arm_rfft_fast_instance_f32 structure
|
||||||
|
@param[in] fftLen length of the Real Sequence
|
||||||
|
@return execution status
|
||||||
|
- \ref ARM_MATH_SUCCESS : Operation successful
|
||||||
|
- \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLen</code> is not a supported length
|
||||||
|
|
||||||
|
@par Description
|
||||||
|
The parameter <code>fftLen</code> specifies the length of RFFT/CIFFT process.
|
||||||
|
Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096.
|
||||||
|
@par
|
||||||
|
This Function also initializes Twiddle factor table pointer and Bit reversal table pointer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
arm_status arm_rfft_fast_init_f32(
|
||||||
|
arm_rfft_fast_instance_f32 * S,
|
||||||
|
uint16_t fftLen)
|
||||||
|
{
|
||||||
|
typedef arm_status(*fft_init_ptr)( arm_rfft_fast_instance_f32 *);
|
||||||
|
fft_init_ptr fptr = 0x0;
|
||||||
|
|
||||||
|
switch (fftLen)
|
||||||
|
{
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096))
|
||||||
|
case 4096U:
|
||||||
|
fptr = arm_rfft_4096_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048))
|
||||||
|
case 2048U:
|
||||||
|
fptr = arm_rfft_2048_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024))
|
||||||
|
case 1024U:
|
||||||
|
fptr = arm_rfft_1024_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512))
|
||||||
|
case 512U:
|
||||||
|
fptr = arm_rfft_512_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256))
|
||||||
|
case 256U:
|
||||||
|
fptr = arm_rfft_256_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128))
|
||||||
|
case 128U:
|
||||||
|
fptr = arm_rfft_128_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64))
|
||||||
|
case 64U:
|
||||||
|
fptr = arm_rfft_64_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16) && defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32))
|
||||||
|
case 32U:
|
||||||
|
fptr = arm_rfft_32_fast_init_f32;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ! fptr ) return ARM_MATH_ARGUMENT_ERROR;
|
||||||
|
return fptr( S );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@} end of RealFFT group
|
||||||
|
*/
|
||||||
@@ -430,6 +430,16 @@
|
|||||||
<type>1</type>
|
<type>1</type>
|
||||||
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/gui/src/octaver_screen/OctaverView.cpp</locationURI>
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/gui/src/octaver_screen/OctaverView.cpp</locationURI>
|
||||||
</link>
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Application/User/gui/OscilloPresenter.cpp</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/gui/src/oscillo_screen/OscilloPresenter.cpp</locationURI>
|
||||||
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Application/User/gui/OscilloView.cpp</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/gui/src/oscillo_screen/OscilloView.cpp</locationURI>
|
||||||
|
</link>
|
||||||
<link>
|
<link>
|
||||||
<name>Application/User/gui/OverdrivePresenter.cpp</name>
|
<name>Application/User/gui/OverdrivePresenter.cpp</name>
|
||||||
<type>1</type>
|
<type>1</type>
|
||||||
@@ -580,6 +590,11 @@
|
|||||||
<type>1</type>
|
<type>1</type>
|
||||||
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/gui_generated/src/octaver_screen/OctaverViewBase.cpp</locationURI>
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/gui_generated/src/octaver_screen/OctaverViewBase.cpp</locationURI>
|
||||||
</link>
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Application/User/generated/OscilloViewBase.cpp</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/gui_generated/src/oscillo_screen/OscilloViewBase.cpp</locationURI>
|
||||||
|
</link>
|
||||||
<link>
|
<link>
|
||||||
<name>Application/User/generated/OverdriveViewBase.cpp</name>
|
<name>Application/User/generated/OverdriveViewBase.cpp</name>
|
||||||
<type>1</type>
|
<type>1</type>
|
||||||
@@ -620,6 +635,11 @@
|
|||||||
<type>1</type>
|
<type>1</type>
|
||||||
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/images/src/__generated/image_glass_theme_images_widgets_button_icon_round_huge_fill_pressed.cpp</locationURI>
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/images/src/__generated/image_glass_theme_images_widgets_button_icon_round_huge_fill_pressed.cpp</locationURI>
|
||||||
</link>
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Application/User/generated/image_glass_theme_images_widgets_button_regular_height_36_medium_round_action.cpp</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/images/src/__generated/image_glass_theme_images_widgets_button_regular_height_36_medium_round_action.cpp</locationURI>
|
||||||
|
</link>
|
||||||
<link>
|
<link>
|
||||||
<name>Application/User/generated/image_glass_theme_images_widgets_button_regular_height_50_large_rounded_normal.cpp</name>
|
<name>Application/User/generated/image_glass_theme_images_widgets_button_regular_height_50_large_rounded_normal.cpp</name>
|
||||||
<type>1</type>
|
<type>1</type>
|
||||||
@@ -700,6 +720,11 @@
|
|||||||
<type>1</type>
|
<type>1</type>
|
||||||
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/images/src/__generated/image_icon_theme_images_av_fiber_manual_record_50_50_5E3E10.svg.cpp</locationURI>
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/images/src/__generated/image_icon_theme_images_av_fiber_manual_record_50_50_5E3E10.svg.cpp</locationURI>
|
||||||
</link>
|
</link>
|
||||||
|
<link>
|
||||||
|
<name>Application/User/generated/image_icon_theme_images_hardware_headset_50_50_FFFFFF.svg.cpp</name>
|
||||||
|
<type>1</type>
|
||||||
|
<locationURI>PARENT-2-PROJECT_LOC/Appli/TouchGFX/generated/images/src/__generated/image_icon_theme_images_hardware_headset_50_50_FFFFFF.svg.cpp</locationURI>
|
||||||
|
</link>
|
||||||
<link>
|
<link>
|
||||||
<name>Application/User/generated/image_fondHorlogerie1.cpp</name>
|
<name>Application/User/generated/image_fondHorlogerie1.cpp</name>
|
||||||
<type>1</type>
|
<type>1</type>
|
||||||
|
|||||||
@@ -300,6 +300,7 @@ board_c_files += \
|
|||||||
Appli/Core/Src/stm32h7rsxx_hal_timebase_tim.c \
|
Appli/Core/Src/stm32h7rsxx_hal_timebase_tim.c \
|
||||||
Appli/Core/Src/system_stm32h7rsxx.c \
|
Appli/Core/Src/system_stm32h7rsxx.c \
|
||||||
Appli/Core/Src/audio_effects.c \
|
Appli/Core/Src/audio_effects.c \
|
||||||
|
Appli/Core/Src/audio_analysis.c \
|
||||||
Appli/Core/Src/fx_octaver.c \
|
Appli/Core/Src/fx_octaver.c \
|
||||||
Appli/Core/Src/fx_equalizer.c \
|
Appli/Core/Src/fx_equalizer.c \
|
||||||
Appli/Core/Src/fx_overdrive.c \
|
Appli/Core/Src/fx_overdrive.c \
|
||||||
@@ -307,6 +308,22 @@ board_c_files += \
|
|||||||
Appli/Core/Src/fx_echo.c \
|
Appli/Core/Src/fx_echo.c \
|
||||||
Appli/Core/Src/fx_reverb.c
|
Appli/Core/Src/fx_reverb.c
|
||||||
|
|
||||||
|
# CMSIS-DSP (vendored from the STM32H7RS firmware package, source-only : no
|
||||||
|
# precompiled .a for this device). Only the RFFT float32 chain needed by
|
||||||
|
# audio_analysis.c is included, not the whole library. The MVE/Helium code
|
||||||
|
# paths in arm_cfft_f32.c/arm_cfft_init_f32.c are guarded behind
|
||||||
|
# ARM_MATH_MVEF, which is never defined here, so they compile out on this
|
||||||
|
# Cortex-M7 (no Helium) target.
|
||||||
|
board_c_files += \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_f32.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/TransformFunctions/arm_rfft_fast_init_f32.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/TransformFunctions/arm_cfft_f32.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/TransformFunctions/arm_cfft_init_f32.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/TransformFunctions/arm_cfft_radix8_f32.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/TransformFunctions/arm_bitreversal2.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/CommonTables/arm_common_tables.c \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Source/CommonTables/arm_const_structs.c
|
||||||
|
|
||||||
# Drivers
|
# Drivers
|
||||||
board_include_paths := \
|
board_include_paths := \
|
||||||
$(Drivers_path)/CMSIS/Include \
|
$(Drivers_path)/CMSIS/Include \
|
||||||
@@ -315,6 +332,8 @@ board_include_paths := \
|
|||||||
$(Drivers_path)/CMSIS/RTOS2/Include \
|
$(Drivers_path)/CMSIS/RTOS2/Include \
|
||||||
$(Drivers_path)/STM32H7RSxx_BSP/STM32H7S78-DK \
|
$(Drivers_path)/STM32H7RSxx_BSP/STM32H7S78-DK \
|
||||||
$(Drivers_path)/STM32H7RSxx_BSP/Components/wm8904 \
|
$(Drivers_path)/STM32H7RSxx_BSP/Components/wm8904 \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/Include \
|
||||||
|
$(Drivers_path)/CMSIS/DSP/PrivateInclude \
|
||||||
Appli/Core/Inc \
|
Appli/Core/Inc \
|
||||||
$(gpu2d_path)/TouchGFXNema/include \
|
$(gpu2d_path)/TouchGFXNema/include \
|
||||||
$(gpu2d_path)/NemaGFX/include
|
$(gpu2d_path)/NemaGFX/include
|
||||||
|
|||||||
Reference in new issue
Block a user