Skip to content

Commit 1b90608

Browse files
committed
complex: Add example interface for C++
1 parent 11ec56f commit 1b90608

File tree

4 files changed

+107
-13
lines changed

4 files changed

+107
-13
lines changed

compile.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
gcc -std=c17 -I/home/johannes/src/volk/include -x c main.c -o mainvolkgnuc -lm
2-
clang -std=c17 -I/home/johannes/src/volk/include -x c main.c -o mainvolkclangc -lm
3-
g++ -std=c++17 -I/home/johannes/src/volk/include -x c++ main.cc -o mainvolkcpp -lm -lfmt
1+
gcc -std=c17 -I/home/johannes/src/volk/include -I/home/johannes/src/volk/build/include -L/home/johannes/src/volk/build/lib -x c main.c -o mainvolkgnuc -lm -lvolk
2+
clang -std=c17 -I/home/johannes/src/volk/include -I/home/johannes/src/volk/build/include -L/home/johannes/src/volk/build/lib -x c main.c -o mainvolkclangc -lm -lvolk
3+
g++ -std=c++17 -I/home/johannes/src/volk/include -I/home/johannes/src/volk/build/include -L/home/johannes/src/volk/build/lib -x c++ main.cc -o mainvolkcpp -lm -lfmt -lvolk

include/volk/volk_complex.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
* - lv_conj - take the conjugate of the complex number
1818
*/
1919

20-
#include <volk/volk_common.h>
20+
// #include <volk/volk_common.h>
2121

22-
__VOLK_DECL_BEGIN
22+
#if defined(__cplusplus)
23+
extern "C" {
24+
#endif
2325

2426
#include <complex.h>
2527

@@ -68,6 +70,10 @@ typedef double _Complex lv_64fc_t;
6870

6971
#endif /* __GNUC__ */
7072

71-
__VOLK_DECL_END
73+
// __VOLK_DECL_END
74+
75+
#if defined(__cplusplus)
76+
}
77+
#endif
7278

7379
#endif /* INCLUDE_VOLK_COMPLEX_H */

main.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,49 @@
11

22
#include <stdio.h>
3-
#include <volk/volk_complex.h>
3+
#include <math.h>
4+
#include <volk/volk.h>
5+
6+
void function_test(int num_points)
7+
{
8+
unsigned int alignment = volk_get_alignment();
9+
lv_32fc_t* in0 = (lv_32fc_t*)volk_malloc(sizeof(lv_32fc_t) * num_points, alignment);
10+
lv_32fc_t* in1 = (lv_32fc_t*)volk_malloc(sizeof(lv_32fc_t) * num_points, alignment);
11+
lv_32fc_t* out = (lv_32fc_t*)volk_malloc(sizeof(lv_32fc_t) * num_points, alignment);
12+
13+
for (unsigned int ii = 0; ii < num_points; ++ii) {
14+
// Generate two tones
15+
float real_1 = cosf(0.3f * (float)ii);
16+
float imag_1 = sinf(0.3f * (float)ii);
17+
in0[ii] = lv_cmake(real_1, imag_1);
18+
float real_2 = cosf(0.1f * (float)ii);
19+
float imag_2 = sinf(0.1f * (float)ii);
20+
in1[ii] = lv_cmake(real_2, imag_2);
21+
}
22+
23+
volk_32fc_x2_multiply_32fc(out, in0, in1, num_points);
24+
25+
for (unsigned int ii = 0; ii < num_points; ++ii) {
26+
lv_32fc_t v0 = in0[ii];
27+
lv_32fc_t v1 = in1[ii];
28+
lv_32fc_t o = out[ii];
29+
printf("in0=(%+.1f%+.1fj), in1=(%+.1f%+.1fj), out=(%+.1f%+.1fj)\n",
30+
creal(v0),
31+
cimag(v0),
32+
creal(v1),
33+
cimag(v1),
34+
creal(o),
35+
cimag(o));
36+
}
37+
38+
volk_free(in0);
39+
volk_free(in1);
40+
volk_free(out);
41+
}
442

543
int main(int argc, char* argv[])
644
{
45+
function_test(32);
46+
747
lv_32fc_t fc_cpl[4];
848
printf("float=%lu, complex float=%lu, complex float array[4]=%lu\n",
949
sizeof(float),

main.cc

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,64 @@
11
#include <fmt/core.h>
2+
#include <cmath>
3+
#include <complex>
24
#include <cstdlib>
35
#include <iostream>
46
#include <vector>
5-
#include <complex>
7+
8+
typedef std::complex<float> cmplxf;
9+
10+
#include <volk/volk.h>
11+
#include <volk/volk_alloc.hh>
612

713

8-
#include <volk/volk_complex.h>
14+
void cppmultiply(volk::vector<cmplxf>& result,
15+
volk::vector<cmplxf>& input0,
16+
volk::vector<cmplxf>& input1)
17+
{
18+
volk_32fc_x2_multiply_32fc(reinterpret_cast<lv_32fc_t*>(result.data()),
19+
reinterpret_cast<lv_32fc_t*>(input0.data()),
20+
reinterpret_cast<lv_32fc_t*>(input1.data()),
21+
input0.size());
22+
}
23+
24+
void function_test(int num_points)
25+
{
26+
volk::vector<cmplxf> in0(num_points);
27+
volk::vector<cmplxf> in1(num_points);
28+
volk::vector<cmplxf> out(num_points);
29+
30+
for (unsigned int ii = 0; ii < num_points; ++ii) {
31+
// Generate two tones
32+
float real_1 = std::cos(0.3f * (float)ii);
33+
float imag_1 = std::sin(0.3f * (float)ii);
34+
in0[ii] = cmplxf(real_1, imag_1);
35+
float real_2 = std::cos(0.1f * (float)ii);
36+
float imag_2 = std::sin(0.1f * (float)ii);
37+
in1[ii] = cmplxf(real_2, imag_2);
38+
}
39+
40+
cppmultiply(out, in0, in1);
41+
42+
for (int ii = 0; ii < num_points; ++ii) {
43+
cmplxf v0 = in0[ii];
44+
cmplxf v1 = in1[ii];
45+
cmplxf o = out[ii];
46+
47+
fmt::print(
48+
"in0=({:+.1f}{:+.1f}j), in1=({:+.1f}{:+.1f}j), out=({:+.1f}{:+.1f}j)\n",
49+
std::real(v0),
50+
std::imag(v0),
51+
std::real(v1),
52+
std::imag(v1),
53+
std::real(o),
54+
std::imag(o));
55+
}
56+
}
957

1058

1159
int main(int argc, char* argv[])
1260
{
61+
function_test(32);
1362
lv_32fc_t fc_cpl[4];
1463
fmt::print("float={}, complex float={}, complex float array[4]={}\n",
1564
sizeof(float),
@@ -19,14 +68,13 @@ int main(int argc, char* argv[])
1968

2069
std::vector<lv_32fc_t> vec(4);
2170
for (int i = 0; i < 4; i++) {
22-
auto foo = std::complex<float>( (i + 3), (i + 8) );
71+
auto foo = std::complex<float>((i + 3), (i + 8));
2372
fmt::print("std::complex: ({:+.1f}{:+.1f}j)\n", std::real(foo), std::imag(foo));
24-
lv_32fc_t bar = lv_32fc_t{5, 6};
73+
lv_32fc_t bar = lv_32fc_t{ 5, 6 };
2574
vec.at(i) = bar;
26-
2775
}
2876

29-
for(auto &val : vec){
77+
for (auto& val : vec) {
3078
float r = __real__ val;
3179
float i = __imag__ val;
3280
fmt::print("sizeof(val)={}, {:+.1f}{:+.1f}j\n", sizeof(val), r, i);

0 commit comments

Comments
 (0)