0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 18
1

Вызывать функции класс C++ на Python

20.07.2018, 09:08. Показов 2449. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В этом году я прохожу практику и с нуля пришлось за несколько дней изучать Python, при том, что я в жизни почти не программировал. Сейчас я работаю в GNURadio и должен написать демодулятор с ФАПЧ (PLL). К моему счастью есть написанный блок, но он написан на С++, мне же поставили задачу написать его в Python. С нуля его писать очень много придется, а в самой программе есть функции которые могут упростить мою работу. Только я не совсем понимаю как правильно вызывать эти функции (которые написаны на языке С++) в свой код, который пишу на Python. Вот пример
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import numpy
import math
from gnuradio import gr
 
class PLL(gr.sync_block):
    """
    docstring for block PLL
    """
    def __init__(self, LOOP, MAX, MIN):
        self.LOOP=LOOP
        self.MAX=MAX
        self.MIN=MIN
            gr.sync_block.__init__(self,
                name="PLL",
                in_sig=[numpy.float32, numpy.float32, numpy.float32],
                out_sig=[numpy.float32])
 
    def mod_2pi (self, in0)
        if in0 > (2*math.pi):
            return = in0 - (2*math.pi)
        elif in0 < (-2*math.pi):
            return = in0 + (2*math.pi)
        else
            return in0;
    def phase_detector (self, gr_complex_sample, ref_phase)
        sample_phase = def fast_atan2f(sample.imag(), sample.real()); 'fast_atan2f это функция С++, как мне правильно её вызвать?'
 
    def work(self, input_items, output_items):
            in0 = input_items[0]
            out = output_items[0]
А вот код самой этой функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/* -*- c++ -*- */
/*
 * Copyright 2005,2013 Free Software Foundation, Inc.
 *
 * This file is part of GNU Radio
 *
 * GNU Radio is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 *
 * GNU Radio is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with GNU Radio; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street,
 * Boston, MA 02110-1301, USA.
 */
 
#include <gnuradio/math.h>         // declaration is in here
#include <cmath>
 
namespace gr {
 
  /***************************************************************************/
  /* Constant definitions */
  /***************************************************************************/
 
  #define TAN_MAP_RES 0.003921569 /* (smallest non-zero value in table) */
  #define RAD_PER_DEG 0.017453293
  #define TAN_MAP_SIZE 255
 
  /* arctangents from 0 to pi/4 radians */
  static float
  fast_atan_table[257] = {
    0.000000e+00, 3.921549e-03, 7.842976e-03, 1.176416e-02,
    1.568499e-02, 1.960533e-02, 2.352507e-02, 2.744409e-02,
    3.136226e-02, 3.527947e-02, 3.919560e-02, 4.311053e-02,
    4.702413e-02, 5.093629e-02, 5.484690e-02, 5.875582e-02,
    6.266295e-02, 6.656816e-02, 7.047134e-02, 7.437238e-02,
    7.827114e-02, 8.216752e-02, 8.606141e-02, 8.995267e-02,
    9.384121e-02, 9.772691e-02, 1.016096e-01, 1.054893e-01,
    1.093658e-01, 1.132390e-01, 1.171087e-01, 1.209750e-01,
    1.248376e-01, 1.286965e-01, 1.325515e-01, 1.364026e-01,
    1.402496e-01, 1.440924e-01, 1.479310e-01, 1.517652e-01,
    1.555948e-01, 1.594199e-01, 1.632403e-01, 1.670559e-01,
    1.708665e-01, 1.746722e-01, 1.784728e-01, 1.822681e-01,
    1.860582e-01, 1.898428e-01, 1.936220e-01, 1.973956e-01,
    2.011634e-01, 2.049255e-01, 2.086818e-01, 2.124320e-01,
    2.161762e-01, 2.199143e-01, 2.236461e-01, 2.273716e-01,
    2.310907e-01, 2.348033e-01, 2.385093e-01, 2.422086e-01,
    2.459012e-01, 2.495869e-01, 2.532658e-01, 2.569376e-01,
    2.606024e-01, 2.642600e-01, 2.679104e-01, 2.715535e-01,
    2.751892e-01, 2.788175e-01, 2.824383e-01, 2.860514e-01,
    2.896569e-01, 2.932547e-01, 2.968447e-01, 3.004268e-01,
    3.040009e-01, 3.075671e-01, 3.111252e-01, 3.146752e-01,
    3.182170e-01, 3.217506e-01, 3.252758e-01, 3.287927e-01,
    3.323012e-01, 3.358012e-01, 3.392926e-01, 3.427755e-01,
    3.462497e-01, 3.497153e-01, 3.531721e-01, 3.566201e-01,
    3.600593e-01, 3.634896e-01, 3.669110e-01, 3.703234e-01,
    3.737268e-01, 3.771211e-01, 3.805064e-01, 3.838825e-01,
    3.872494e-01, 3.906070e-01, 3.939555e-01, 3.972946e-01,
    4.006244e-01, 4.039448e-01, 4.072558e-01, 4.105574e-01,
    4.138496e-01, 4.171322e-01, 4.204054e-01, 4.236689e-01,
    4.269229e-01, 4.301673e-01, 4.334021e-01, 4.366272e-01,
    4.398426e-01, 4.430483e-01, 4.462443e-01, 4.494306e-01,
    4.526070e-01, 4.557738e-01, 4.589307e-01, 4.620778e-01,
    4.652150e-01, 4.683424e-01, 4.714600e-01, 4.745676e-01,
    4.776654e-01, 4.807532e-01, 4.838312e-01, 4.868992e-01,
    4.899573e-01, 4.930055e-01, 4.960437e-01, 4.990719e-01,
    5.020902e-01, 5.050985e-01, 5.080968e-01, 5.110852e-01,
    5.140636e-01, 5.170320e-01, 5.199904e-01, 5.229388e-01,
    5.258772e-01, 5.288056e-01, 5.317241e-01, 5.346325e-01,
    5.375310e-01, 5.404195e-01, 5.432980e-01, 5.461666e-01,
    5.490251e-01, 5.518738e-01, 5.547124e-01, 5.575411e-01,
    5.603599e-01, 5.631687e-01, 5.659676e-01, 5.687566e-01,
    5.715357e-01, 5.743048e-01, 5.770641e-01, 5.798135e-01,
    5.825531e-01, 5.852828e-01, 5.880026e-01, 5.907126e-01,
    5.934128e-01, 5.961032e-01, 5.987839e-01, 6.014547e-01,
    6.041158e-01, 6.067672e-01, 6.094088e-01, 6.120407e-01,
    6.146630e-01, 6.172755e-01, 6.198784e-01, 6.224717e-01,
    6.250554e-01, 6.276294e-01, 6.301939e-01, 6.327488e-01,
    6.352942e-01, 6.378301e-01, 6.403565e-01, 6.428734e-01,
    6.453808e-01, 6.478788e-01, 6.503674e-01, 6.528466e-01,
    6.553165e-01, 6.577770e-01, 6.602282e-01, 6.626701e-01,
    6.651027e-01, 6.675261e-01, 6.699402e-01, 6.723452e-01,
    6.747409e-01, 6.771276e-01, 6.795051e-01, 6.818735e-01,
    6.842328e-01, 6.865831e-01, 6.889244e-01, 6.912567e-01,
    6.935800e-01, 6.958943e-01, 6.981998e-01, 7.004964e-01,
    7.027841e-01, 7.050630e-01, 7.073330e-01, 7.095943e-01,
    7.118469e-01, 7.140907e-01, 7.163258e-01, 7.185523e-01,
    7.207701e-01, 7.229794e-01, 7.251800e-01, 7.273721e-01,
    7.295557e-01, 7.317307e-01, 7.338974e-01, 7.360555e-01,
    7.382053e-01, 7.403467e-01, 7.424797e-01, 7.446045e-01,
    7.467209e-01, 7.488291e-01, 7.509291e-01, 7.530208e-01,
    7.551044e-01, 7.571798e-01, 7.592472e-01, 7.613064e-01,
    7.633576e-01, 7.654008e-01, 7.674360e-01, 7.694633e-01,
    7.714826e-01, 7.734940e-01, 7.754975e-01, 7.774932e-01,
    7.794811e-01, 7.814612e-01, 7.834335e-01, 7.853982e-01,
    7.853982e-01
  };
 
 
  /*****************************************************************************
   Function: Arc tangent
 
   Syntax: angle = fast_atan2(y, x);
   float y y component of input vector
   float x x component of input vector
   float angle angle of vector (x, y) in radians
 
   Description: This function calculates the angle of the vector (x,y)
   based on a table lookup and linear interpolation. The table uses a
   256 point table covering -45 to +45 degrees and uses symmetry to
   determine the final angle value in the range of -180 to 180
   degrees. Note that this function uses the small angle approximation
   for values close to zero. This routine calculates the arc tangent
   with an average error of +/- 3.56e-5 degrees (6.21e-7 radians).
  *****************************************************************************/
 
  float
  fast_atan2f(float y, float x)
  {
    float x_abs, y_abs, z;
    float alpha, angle, base_angle;
    int index;
 
    /* normalize to +/- 45 degree range */
    y_abs = fabsf(y);
    x_abs = fabsf(x);
    /* don't divide by zero! */
    if(!((y_abs > 0.0f) || (x_abs > 0.0f)))
      return 0.0;
 
    if(y_abs < x_abs)
      z = y_abs / x_abs;
    else
      z = x_abs / y_abs;
 
    /* when ratio approaches the table resolution, the angle is */
    /* best approximated with the argument itself... */
    if(z < TAN_MAP_RES)
      base_angle = z;
    else {
      /* find index and interpolation value */
      alpha = z * (float)TAN_MAP_SIZE;
      index = ((int)alpha) & 0xff;
      alpha -= (float)index;
      /* determine base angle based on quadrant and */
      /* add or subtract table value from base angle based on quadrant */
      base_angle  =  fast_atan_table[index];
      base_angle += (fast_atan_table[index + 1] - fast_atan_table[index]) * alpha;
    }
 
    if(x_abs > y_abs) { /* -45 -> 45 or 135 -> 225 */
      if(x >= 0.0) { /* -45 -> 45 */
        if(y >= 0.0)
          angle = base_angle; /* 0 -> 45, angle OK */
        else
          angle = -base_angle; /* -45 -> 0, angle = -angle */
      }
      else { /* 135 -> 180 or 180 -> -135 */
        angle = 3.14159265358979323846;
        if(y >= 0.0)
          angle -= base_angle; /* 135 -> 180, angle = 180 - angle */
        else
          angle = base_angle - angle; /* 180 -> -135, angle = angle - 180 */
      }
    }
    else { /* 45 -> 135 or -135 -> -45 */
      if(y >= 0.0) { /* 45 -> 135 */
        angle = 1.57079632679489661923;
        if(x >= 0.0)
          angle -= base_angle; /* 45 -> 90, angle = 90 - angle */
        else
          angle += base_angle; /* 90 -> 135, angle = 90 + angle */
      }
      else { /* -135 -> -45 */
        angle = -1.57079632679489661923;
        if(x >= 0.0)
          angle += base_angle; /* -90 -> -45, angle = -90 + angle */
        else
          angle -= base_angle; /* -135 -> -90, angle = -90 - angle */
      }
    }
 
  #ifdef ZERO_TO_TWOPI
    if (angle < 0)
      return (angle + TWOPI);
    else
      return (angle);
  #else
    return (angle);
  #endif
  }
 
} /* namespace gr */
Я что то находил про библиотеку BOOST, она подойдет? или есть что то другое?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2018, 09:08
Ответы с готовыми решениями:

Нужно установить к Python плагин, позволяющий вызывать матлабовские функции
Коллеги, Нужно установить к Python плагин, позволяющий вызывать матлабовские функции. У кого...

Можно ли в интерактивной оболочке Python вызывать функции из библиотек на языке С?
C, Python, Java

Как вызывать код, написанный на Python, из C++ кода?
Решил использовать .py скрипты в проекте. Кинул python.h в каталог проекта, но код #include...

Как вызывать класс несколько раз?
добрый день! Как вызывать класс несколько раз? например я создаю класс PERSON то есть человека...

Добавление функции, чтобы ее можно было вызывать с функции загрузки формы
Здравствуйте! Подскажите как правильно добавить функцию, чтоб ее можно было вызывать с функции...

4
931 / 692 / 270
Регистрация: 10.12.2016
Сообщений: 1,708
20.07.2018, 10:55 2
по первому взгляду там чисто С-код, хватит и ctypes
https://www.ibm.com/developerw... etails_06/
1
Просто Лис
Эксперт Python
5924 / 3694 / 1087
Регистрация: 17.05.2012
Сообщений: 10,727
Записей в блоге: 9
20.07.2018, 11:00 3
Скомпилить в .so/.dll и вызывать, как обычную функцию: https://lancelote.gitbooks.io/... nsion.html

Будет выглядеть как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <Python.h>
 
static PyObject* fast_atan2f(PyObject* self, PyObject* arg1 /*…*/){
  //PyArg_Parse...
  //…
  //return Py_BuildValue
}
 
static char fast_atan2f_docs[] =
    "\n";
 
static PyMethodDef funcs[] = {
    {"fast_atan2f", (PyCFunction)fast_atan2f, METH_VARARGS, fast_atan2f_docs},
    {NULL, NULL, 0, NULL}
};
 
PyMODINIT_FUNC initgr(void){
    Py_InitModule3("gr", funcs, "doc");
}
1
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 18
20.07.2018, 12:54  [ТС] 4
Спасибо. Тогдаещё вопросик. Сейчас для начала я грубо говоря перевожу этот документ в Python
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
 
#include "pll_freqdet_cf_impl.h"
#include <gnuradio/io_signature.h>
#include <math.h>
#include <gnuradio/math.h>
 
namespace gr {
  namespace analog {
 
#ifndef M_TWOPI
#define M_TWOPI (2.0f*M_PI)
#endif
 
    pll_freqdet_cf::sptr
    pll_freqdet_cf::make(float loop_bw, float max_freq, float min_freq)
    {
      return gnuradio::get_initial_sptr
    (new pll_freqdet_cf_impl(loop_bw, max_freq, min_freq));
    }
 
    pll_freqdet_cf_impl::pll_freqdet_cf_impl(float loop_bw, float max_freq, float min_freq)
      : sync_block("pll_freqdet_cf",
              io_signature::make(1, 1, sizeof(gr_complex)),
              io_signature::make(1, 1, sizeof(float))),
    blocks::control_loop(loop_bw, max_freq, min_freq)
    {
    }
 
    pll_freqdet_cf_impl::~pll_freqdet_cf_impl()
    {
    }
 
    float
    pll_freqdet_cf_impl::mod_2pi(float in)
    {
      if(in > M_PI)
    return in - M_TWOPI;
      else if(in < -M_PI)
    return in + M_TWOPI;
      else
    return in;
    }
 
    float
    pll_freqdet_cf_impl::phase_detector(gr_complex sample, float ref_phase)
    {
      float sample_phase;
      sample_phase = gr::fast_atan2f(sample.imag(), sample.real());
      return mod_2pi(sample_phase - ref_phase);
    }
 
    int
    pll_freqdet_cf_impl::work(int noutput_items,
                  gr_vector_const_void_star &input_items,
                  gr_vector_void_star &output_items)
    {
      const gr_complex *iptr = (gr_complex*)input_items[0];
      float *optr = (float*)output_items[0];
 
      float error;
      int size = noutput_items;
 
      while(size-- > 0) {
    *optr++ = d_freq;
 
    error = phase_detector(*iptr++, d_phase);
 
    advance_loop(error);
    phase_wrap();
    frequency_limit();
      }
      return noutput_items;
    }
 
    void
    pll_freqdet_cf_impl::set_loop_bandwidth(float bw)
    {
      blocks::control_loop::set_loop_bandwidth(bw);
    }
 
    void
    pll_freqdet_cf_impl::set_damping_factor(float df)
    {
      blocks::control_loop::set_damping_factor(df);
    }
 
    void
    pll_freqdet_cf_impl::set_alpha(float alpha)
    {
      blocks::control_loop::set_alpha(alpha);
    }
 
    void
    pll_freqdet_cf_impl::set_beta(float beta)
    {
      blocks::control_loop::set_beta(beta);
    }
 
    void
    pll_freqdet_cf_impl::set_frequency(float freq)
    {
      blocks::control_loop::set_frequency(freq);
    }
 
    void
    pll_freqdet_cf_impl::set_phase(float phase)
    {
      blocks::control_loop::set_phase(phase);
    }
 
    void
    pll_freqdet_cf_impl::set_min_freq(float freq)
    {
      blocks::control_loop::set_min_freq(freq);
    }
 
    void
    pll_freqdet_cf_impl::set_max_freq(float freq)
    {
      blocks::control_loop::set_max_freq(freq);
    }
 
 
    float
    pll_freqdet_cf_impl::get_loop_bandwidth() const
    {
      return blocks::control_loop::get_loop_bandwidth();
    }
 
    float
    pll_freqdet_cf_impl::get_damping_factor() const
    {
      return blocks::control_loop::get_damping_factor();
    }
 
    float
    pll_freqdet_cf_impl::get_alpha() const
    {
      return blocks::control_loop::get_alpha();
    }
 
    float
    pll_freqdet_cf_impl::get_beta() const
    {
      return blocks::control_loop::get_beta();
    }
 
    float
    pll_freqdet_cf_impl::get_frequency() const
    {
      return blocks::control_loop::get_frequency();
    }
 
    float
    pll_freqdet_cf_impl::get_phase() const
    {
      return blocks::control_loop::get_phase();
    }
 
    float
    pll_freqdet_cf_impl::get_min_freq() const
    {
      return blocks::control_loop::get_min_freq();
    }
 
    float
    pll_freqdet_cf_impl::get_max_freq() const
    {
      return blocks::control_loop::get_max_freq();
    }
 
  } /* namespace analog */
} /* namespace gr */
И там есть вызов методов, я аналогично могу же вызывать их? Документы с этими методами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
 
#include <gnuradio/blocks/control_loop.h>
#include <gnuradio/math.h>
#include <stdexcept>
 
namespace gr {
  namespace blocks {
 
#define M_TWOPI (2.0f*M_PI)
 
    control_loop::control_loop(float loop_bw,
                               float max_freq, float min_freq)
      : d_phase(0), d_freq(0), d_max_freq(max_freq), d_min_freq(min_freq)
    {
      // Set the damping factor for a critically damped system
      d_damping = sqrtf(2.0f)/2.0f;
 
      // Set the bandwidth, which will then call update_gains()
      set_loop_bandwidth(loop_bw);
    }
 
    control_loop::~control_loop()
    {
    }
 
    void
    control_loop::update_gains()
    {
      float denom = (1.0 + 2.0*d_damping*d_loop_bw + d_loop_bw*d_loop_bw);
      d_alpha = (4*d_damping*d_loop_bw) / denom;
      d_beta = (4*d_loop_bw*d_loop_bw) / denom;
    }
 
    void
    control_loop::advance_loop(float error)
    {
      d_freq = d_freq + d_beta * error;
      d_phase = d_phase + d_freq + d_alpha * error;
    }
 
    void
    control_loop::phase_wrap()
    {
      while(d_phase>M_TWOPI)
        d_phase -= M_TWOPI;
      while(d_phase<-M_TWOPI)
        d_phase += M_TWOPI;
    }
 
    void
    control_loop::frequency_limit()
    {
      if(d_freq > d_max_freq)
        d_freq = d_max_freq;
      else if(d_freq < d_min_freq)
        d_freq = d_min_freq;
    }
 
    /*******************************************************************
     * SET FUNCTIONS
     *******************************************************************/
 
    void
    control_loop::set_loop_bandwidth(float bw)
    {
      if(bw < 0) {
        throw std::out_of_range ("control_loop: invalid bandwidth. Must be >= 0.");
      }
 
      d_loop_bw = bw;
      update_gains();
    }
 
    void
    control_loop::set_damping_factor(float df)
    {
      if(df <= 0) {
        throw std::out_of_range ("control_loop: invalid damping factor. Must be > 0.");
      }
 
      d_damping = df;
      update_gains();
    }
 
    void
    control_loop::set_alpha(float alpha)
    {
      if(alpha < 0 || alpha > 1.0) {
        throw std::out_of_range ("control_loop: invalid alpha. Must be in [0,1].");
      }
      d_alpha = alpha;
    }
 
    void
    control_loop::set_beta(float beta)
    {
      if(beta < 0 || beta > 1.0) {
        throw std::out_of_range ("control_loop: invalid beta. Must be in [0,1].");
      }
      d_beta = beta;
    }
 
    void
    control_loop::set_frequency(float freq)
    {
      if(freq > d_max_freq)
        d_freq = d_min_freq;
      else if(freq < d_min_freq)
        d_freq = d_max_freq;
      else
        d_freq = freq;
    }
 
    void
    control_loop::set_phase(float phase)
    {
      d_phase = phase;
      while(d_phase>M_TWOPI)
        d_phase -= M_TWOPI;
      while(d_phase<-M_TWOPI)
        d_phase += M_TWOPI;
    }
 
    void
    control_loop::set_max_freq(float freq)
    {
      d_max_freq = freq;
    }
 
    void
    control_loop::set_min_freq(float freq)
    {
      d_min_freq = freq;
    }
 
    /*******************************************************************
     * GET FUNCTIONS
     *******************************************************************/
 
    float
    control_loop::get_loop_bandwidth() const
    {
      return d_loop_bw;
    }
 
    float
    control_loop::get_damping_factor() const
    {
      return d_damping;
    }
 
    float
    control_loop::get_alpha() const
    {
      return d_alpha;
    }
 
    float
    control_loop::get_beta() const
    {
      return d_beta;
    }
 
    float
    control_loop::get_frequency() const
    {
      return d_freq;
    }
 
    float
    control_loop::get_phase() const
    {
      return d_phase;
    }
 
    float
    control_loop::get_max_freq() const
    {
      return d_max_freq;
    }
 
    float
    control_loop::get_min_freq() const
    {
      return d_min_freq;
    }
 
  } /* namespace blocks */
} /* namespace gr */
и + тот арктангенс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <gnuradio/math.h>         // declaration is in here
#include <cmath>
 
namespace gr {
 
  /***************************************************************************/
  /* Constant definitions */
  /***************************************************************************/
 
  #define TAN_MAP_RES 0.003921569 /* (smallest non-zero value in table) */
  #define RAD_PER_DEG 0.017453293
  #define TAN_MAP_SIZE 255
 
  /* arctangents from 0 to pi/4 radians */
  static float
  fast_atan_table[257] = {
    0.000000e+00, 3.921549e-03, 7.842976e-03, 1.176416e-02,
    1.568499e-02, 1.960533e-02, 2.352507e-02, 2.744409e-02,
    3.136226e-02, 3.527947e-02, 3.919560e-02, 4.311053e-02,
    4.702413e-02, 5.093629e-02, 5.484690e-02, 5.875582e-02,
    6.266295e-02, 6.656816e-02, 7.047134e-02, 7.437238e-02,
    7.827114e-02, 8.216752e-02, 8.606141e-02, 8.995267e-02,
    9.384121e-02, 9.772691e-02, 1.016096e-01, 1.054893e-01,
    1.093658e-01, 1.132390e-01, 1.171087e-01, 1.209750e-01,
    1.248376e-01, 1.286965e-01, 1.325515e-01, 1.364026e-01,
    1.402496e-01, 1.440924e-01, 1.479310e-01, 1.517652e-01,
    1.555948e-01, 1.594199e-01, 1.632403e-01, 1.670559e-01,
    1.708665e-01, 1.746722e-01, 1.784728e-01, 1.822681e-01,
    1.860582e-01, 1.898428e-01, 1.936220e-01, 1.973956e-01,
    2.011634e-01, 2.049255e-01, 2.086818e-01, 2.124320e-01,
    2.161762e-01, 2.199143e-01, 2.236461e-01, 2.273716e-01,
    2.310907e-01, 2.348033e-01, 2.385093e-01, 2.422086e-01,
    2.459012e-01, 2.495869e-01, 2.532658e-01, 2.569376e-01,
    2.606024e-01, 2.642600e-01, 2.679104e-01, 2.715535e-01,
    2.751892e-01, 2.788175e-01, 2.824383e-01, 2.860514e-01,
    2.896569e-01, 2.932547e-01, 2.968447e-01, 3.004268e-01,
    3.040009e-01, 3.075671e-01, 3.111252e-01, 3.146752e-01,
    3.182170e-01, 3.217506e-01, 3.252758e-01, 3.287927e-01,
    3.323012e-01, 3.358012e-01, 3.392926e-01, 3.427755e-01,
    3.462497e-01, 3.497153e-01, 3.531721e-01, 3.566201e-01,
    3.600593e-01, 3.634896e-01, 3.669110e-01, 3.703234e-01,
    3.737268e-01, 3.771211e-01, 3.805064e-01, 3.838825e-01,
    3.872494e-01, 3.906070e-01, 3.939555e-01, 3.972946e-01,
    4.006244e-01, 4.039448e-01, 4.072558e-01, 4.105574e-01,
    4.138496e-01, 4.171322e-01, 4.204054e-01, 4.236689e-01,
    4.269229e-01, 4.301673e-01, 4.334021e-01, 4.366272e-01,
    4.398426e-01, 4.430483e-01, 4.462443e-01, 4.494306e-01,
    4.526070e-01, 4.557738e-01, 4.589307e-01, 4.620778e-01,
    4.652150e-01, 4.683424e-01, 4.714600e-01, 4.745676e-01,
    4.776654e-01, 4.807532e-01, 4.838312e-01, 4.868992e-01,
    4.899573e-01, 4.930055e-01, 4.960437e-01, 4.990719e-01,
    5.020902e-01, 5.050985e-01, 5.080968e-01, 5.110852e-01,
    5.140636e-01, 5.170320e-01, 5.199904e-01, 5.229388e-01,
    5.258772e-01, 5.288056e-01, 5.317241e-01, 5.346325e-01,
    5.375310e-01, 5.404195e-01, 5.432980e-01, 5.461666e-01,
    5.490251e-01, 5.518738e-01, 5.547124e-01, 5.575411e-01,
    5.603599e-01, 5.631687e-01, 5.659676e-01, 5.687566e-01,
    5.715357e-01, 5.743048e-01, 5.770641e-01, 5.798135e-01,
    5.825531e-01, 5.852828e-01, 5.880026e-01, 5.907126e-01,
    5.934128e-01, 5.961032e-01, 5.987839e-01, 6.014547e-01,
    6.041158e-01, 6.067672e-01, 6.094088e-01, 6.120407e-01,
    6.146630e-01, 6.172755e-01, 6.198784e-01, 6.224717e-01,
    6.250554e-01, 6.276294e-01, 6.301939e-01, 6.327488e-01,
    6.352942e-01, 6.378301e-01, 6.403565e-01, 6.428734e-01,
    6.453808e-01, 6.478788e-01, 6.503674e-01, 6.528466e-01,
    6.553165e-01, 6.577770e-01, 6.602282e-01, 6.626701e-01,
    6.651027e-01, 6.675261e-01, 6.699402e-01, 6.723452e-01,
    6.747409e-01, 6.771276e-01, 6.795051e-01, 6.818735e-01,
    6.842328e-01, 6.865831e-01, 6.889244e-01, 6.912567e-01,
    6.935800e-01, 6.958943e-01, 6.981998e-01, 7.004964e-01,
    7.027841e-01, 7.050630e-01, 7.073330e-01, 7.095943e-01,
    7.118469e-01, 7.140907e-01, 7.163258e-01, 7.185523e-01,
    7.207701e-01, 7.229794e-01, 7.251800e-01, 7.273721e-01,
    7.295557e-01, 7.317307e-01, 7.338974e-01, 7.360555e-01,
    7.382053e-01, 7.403467e-01, 7.424797e-01, 7.446045e-01,
    7.467209e-01, 7.488291e-01, 7.509291e-01, 7.530208e-01,
    7.551044e-01, 7.571798e-01, 7.592472e-01, 7.613064e-01,
    7.633576e-01, 7.654008e-01, 7.674360e-01, 7.694633e-01,
    7.714826e-01, 7.734940e-01, 7.754975e-01, 7.774932e-01,
    7.794811e-01, 7.814612e-01, 7.834335e-01, 7.853982e-01,
    7.853982e-01
  };
 
 
  /*****************************************************************************
   Function: Arc tangent
 
   Syntax: angle = fast_atan2(y, x);
   float y y component of input vector
   float x x component of input vector
   float angle angle of vector (x, y) in radians
 
   Description: This function calculates the angle of the vector (x,y)
   based on a table lookup and linear interpolation. The table uses a
   256 point table covering -45 to +45 degrees and uses symmetry to
   determine the final angle value in the range of -180 to 180
   degrees. Note that this function uses the small angle approximation
   for values close to zero. This routine calculates the arc tangent
   with an average error of +/- 3.56e-5 degrees (6.21e-7 radians).
  *****************************************************************************/
 
  float
  fast_atan2f(float y, float x)
  {
    float x_abs, y_abs, z;
    float alpha, angle, base_angle;
    int index;
 
    /* normalize to +/- 45 degree range */
    y_abs = fabsf(y);
    x_abs = fabsf(x);
    /* don't divide by zero! */
    if(!((y_abs > 0.0f) || (x_abs > 0.0f)))
      return 0.0;
 
    if(y_abs < x_abs)
      z = y_abs / x_abs;
    else
      z = x_abs / y_abs;
 
    /* when ratio approaches the table resolution, the angle is */
    /* best approximated with the argument itself... */
    if(z < TAN_MAP_RES)
      base_angle = z;
    else {
      /* find index and interpolation value */
      alpha = z * (float)TAN_MAP_SIZE;
      index = ((int)alpha) & 0xff;
      alpha -= (float)index;
      /* determine base angle based on quadrant and */
      /* add or subtract table value from base angle based on quadrant */
      base_angle  =  fast_atan_table[index];
      base_angle += (fast_atan_table[index + 1] - fast_atan_table[index]) * alpha;
    }
 
    if(x_abs > y_abs) { /* -45 -> 45 or 135 -> 225 */
      if(x >= 0.0) { /* -45 -> 45 */
        if(y >= 0.0)
          angle = base_angle; /* 0 -> 45, angle OK */
        else
          angle = -base_angle; /* -45 -> 0, angle = -angle */
      }
      else { /* 135 -> 180 or 180 -> -135 */
        angle = 3.14159265358979323846;
        if(y >= 0.0)
          angle -= base_angle; /* 135 -> 180, angle = 180 - angle */
        else
          angle = base_angle - angle; /* 180 -> -135, angle = angle - 180 */
      }
    }
    else { /* 45 -> 135 or -135 -> -45 */
      if(y >= 0.0) { /* 45 -> 135 */
        angle = 1.57079632679489661923;
        if(x >= 0.0)
          angle -= base_angle; /* 45 -> 90, angle = 90 - angle */
        else
          angle += base_angle; /* 90 -> 135, angle = 90 + angle */
      }
      else { /* -135 -> -45 */
        angle = -1.57079632679489661923;
        if(x >= 0.0)
          angle += base_angle; /* -90 -> -45, angle = -90 + angle */
        else
          angle -= base_angle; /* -135 -> -90, angle = -90 - angle */
      }
    }
 
  #ifdef ZERO_TO_TWOPI
    if (angle < 0)
      return (angle + TWOPI);
    else
      return (angle);
  #else
    return (angle);
  #endif
  }
 
} /* namespace gr */
0
931 / 692 / 270
Регистрация: 10.12.2016
Сообщений: 1,708
21.07.2018, 00:45 5
вроде там надо "extern C" вставлять для совместимости С/С++
я бы код под gcc переработал - С и С++ неодинаково компилятся
0
21.07.2018, 00:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2018, 00:45
Помогаю со студенческими работами здесь

Как вызывать класс в основном файле game1.cs?
Делаю класс, чтобы он рисовал что-то... а потом его вызывать в основном файле game1.cs и тогда он...

Как можно вызывать один класс в разных activity?
Всем привет! Пишу плеер типа ютюба и нужно, чтобы один класс вызывался в нескольких активти. я...

Как через базовый класс вызывать виртуальную функцию во всех потомках?
Ну например, есть класс: class BATYANA { BATYANA(); virtual ~BATYANA(); ...

Где в Yii создавать класс UserIdentity и вызывать его метод authenticate?
Добрый день, помогите люди, кто изучал данную статью Макарова...

ManagerClass как вызывать функции
Здравствуйте! Пишу такой код: main.cpp .... ManagerClass* Manager = new ManagerClass;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru