Audacity 3.2.0
VectorOps.h
Go to the documentation of this file.
1//
2// This header is provided for convenience, to easily wrap vector operations around
3// their platform-specific optimised libraries (e.g. IPP, vDSP), if desired.
4// This can be done by adding #if defined(...) compile-time branches to each function
5// and calling the corresponding library function, e.g. ippsAdd_32f or vDSP_vadd
6// inside add().
7//
8
9#pragma once
10
11#include <stdlib.h>
12
13#include <complex>
14#include <cstdint>
15#include <cstring>
16
17namespace staffpad {
18namespace vo {
19
20inline void* allocate(int32_t bytes)
21{
22 return ::malloc(bytes);
23}
24
25inline void free(void* ptr)
26{
27 return ::free(ptr);
28}
29
30template <class T>
31inline void copy(const T* src, T* dst, int32_t n)
32{
33 memcpy(dst, src, n * sizeof(T));
34}
35
36template <class T>
37inline void add(const T* src1, const T* src2, T* dst, int32_t n)
38{
39 for (int32_t i = 0; i < n; i++)
40 dst[i] = src1[i] + src2[i];
41}
42
43template <class T>
44inline void subtract(const T* src1, const T* src2, T* dst, int32_t n)
45{
46 for (int32_t i = 0; i < n; i++)
47 dst[i] = src2[i] - src1[i];
48}
49
50template <class T>
51inline void constantMultiply(const T* src, T constant, T* dst, int32_t n)
52{
53 for (int32_t i = 0; i < n; i++)
54 dst[i] = src[i] * constant;
55}
56
57template <class T>
58inline void constantMultiplyAndAdd(const T* src, T constant, T* dst, int32_t n)
59{
60 for (int32_t i = 0; i < n; i++)
61 dst[i] += src[i] * constant;
62}
63
64template <class T>
65inline void multiply(const T* src1, const T* src2, T* dst, int32_t n)
66{
67 for (int32_t i = 0; i < n; i++)
68 dst[i] = src1[i] * src2[i];
69}
70
71template <class T>
72inline void setToZero(T* dst, int32_t n)
73{
74 std::fill(dst, dst + n, 0.f);
75}
76
77template <class T>
78inline void findMaxElement(const T* src, int32_t n, int32_t& maxIndex, T& maxValue)
79{
80 maxIndex = 0;
81 maxValue = n > 0 ? src[0] : std::numeric_limits<T>::min();
82
83 for (int32_t i = 1; i < n; i++)
84 {
85 if (src[i] > maxValue)
86 {
87 maxValue = src[i];
88 maxIndex = i;
89 }
90 }
91}
92
93inline void calcPhases(const std::complex<float>* src, float* dst, int32_t n)
94{
95 for (int32_t i = 0; i < n; i++)
96 dst[i] = std::arg(src[i]);
97}
98
99inline void calcMagnitudes(const std::complex<float>* src, float* dst, int32_t n)
100{
101 for (int32_t i = 0; i < n; i++)
102 dst[i] = std::abs(src[i]);
103}
104
105inline void convertPolarToCartesian(const float* srcMag, const float* srcPh, std::complex<float>* dst, int32_t n)
106{
107 for (int32_t i = 0; i < n; i++)
108 dst[i] = std::polar<float>(srcMag[i], srcPh[i]);
109}
110
111} // namespace vo
112} // namespace staffpad
int min(int a, int b)
void * allocate(int32_t bytes)
Definition: VectorOps.h:20
void subtract(const T *src1, const T *src2, T *dst, int32_t n)
Definition: VectorOps.h:44
void multiply(const T *src1, const T *src2, T *dst, int32_t n)
Definition: VectorOps.h:65
void calcPhases(const std::complex< float > *src, float *dst, int32_t n)
Definition: VectorOps.h:93
void setToZero(T *dst, int32_t n)
Definition: VectorOps.h:72
void findMaxElement(const T *src, int32_t n, int32_t &maxIndex, T &maxValue)
Definition: VectorOps.h:78
void add(const T *src1, const T *src2, T *dst, int32_t n)
Definition: VectorOps.h:37
void free(void *ptr)
Definition: VectorOps.h:25
void convertPolarToCartesian(const float *srcMag, const float *srcPh, std::complex< float > *dst, int32_t n)
Definition: VectorOps.h:105
void constantMultiplyAndAdd(const T *src, T constant, T *dst, int32_t n)
Definition: VectorOps.h:58
void calcMagnitudes(const std::complex< float > *src, float *dst, int32_t n)
Definition: VectorOps.h:99
void copy(const T *src, T *dst, int32_t n)
Definition: VectorOps.h:31
void constantMultiply(const T *src, T constant, T *dst, int32_t n)
Definition: VectorOps.h:51