Эти функции python в c ++?

У меня в основном есть исходный код (а не мой собственный) на питоне, который я хотел бы понять. Это сглаженный xor аудиогенератор. Я вообще не знаю python – но это вполне читаемо, за исключением нескольких вещей:

Во-первых – полный код:

f0 = 500. fs = 44100. T0 = f0/fs P0 = fs/f0 t = arange(0,3*fs) L = len(t) imax = 2**16 # ============================================================================= # SIGNALS # ============================================================================= # ----------------------------------------------------------------------------- # def trivial_xor(): s = zeros(L) sd1 = zeros(L) sd2 = zeros(L) s = zeros(L) w = 0.5 p = 0 for n in range(0,L): d1 = 2*p - 1 if p < w: d2 = 0 else: d2 = -0.5 x1 = int(d1 * imax) & 0xFFFF x2 = int(d2 * imax) & 0xFFFF y = (x1 ^ x2) / float(imax) s[n] = 2*y - 1 sd1[n] = d1 sd2[n] = d2 p += T0 if p > 1: p -= 1 return s # ----------------------------------------------------------------------------- # def trivial_xor_withSources(): s = zeros(L) sd1 = zeros(L) sd2 = zeros(L) s = zeros(L) w = 0.5 p = 0 for n in range(0,L): d1 = 2*p - 1 if p < w: d2 = 0 else: d2 = -0.5 x1 = int(d1 * imax) & 0xFFFF x2 = int(d2 * imax) & 0xFFFF y = (x1 ^ x2) / float(imax) s[n] = 2*y - 1 sd1[n] = d1 sd2[n] = d2 p += T0 if p > 1: p -= 1 return s,sd1,sd2 # ----------------------------------------------------------------------------- # def PTR1_xor(): s = trivial_xor() - 2*T0 # T1 = 2*T0 P1 = 1/T1 cdc = 1 + T1 p0 = p1 = 0 # for n in range(0,L): if p0 < 0.5: h = 0.5 if p1 < T1: s[n] = p1*(2 - 2*h*P1) + 2*h - cdc elif p0 < 0.75: h = 0.5 if p1 < T1: s[n] = p1*(2 - 2*h*P1) + 2*h - cdc + 1 else: h = 1 pp = p1 - 0.5 if pp < T1: s[n] = pp*(2 - 2*h*P1) + 2*h - cdc # p0 += T0 p1 += T1 if p0 > 1: p0 -= 1 if p1 > 1: p1 -= 1 return s 

Все это выглядит довольно прямолинейно – за исключением того, что я считаю буферами, все, что мне нужно знать, это то, что есть эти функции в c ++?

////////////////////////////////

 t = arange(0,3*fs) L = len(t) imax = 2**16 

////////////////////////////////

  def trivial_xor_withSources(): s = zeros(L) sd1 = zeros(L) sd2 = zeros(L) s = zeros(L) w = 0.5 p = 0 for n in range(0,L): 

Я планирую использовать это в режиме реального времени. Остальное просто выглядит как простая математика. Любая помощь очень ценится!

Андрей

3 Solutions collect form web for “Эти функции python в c ++?”

Если вы пытаетесь преобразовать код в C ++, вы можете легко реализовать (примерно) эквивалентную функцию arange :

 #include <vector> template<typename T> std::vector<T> arange(T start, T stop, T step = 1) { std::vector<T> values; for (T value = start; value < stop; value += step) values.push_back(value); return values; } 

Затем вы можете использовать его следующим образом:

 auto t = arange<double>(0, 3*fs); auto L = t.length(); 

** – возведение в степень. Вы можете вызвать функцию pow :

 #include <cmath> const double imax = pow(2., 16.); 

Но поскольку вы все равно имеете дело с константами, вам было бы лучше:

 const double imax = 65536.; 

Если вы хотите сохранить выразительную силу 2**16 и вы не хотите брать на себя затраты времени на вызов pow (возможно, вы хотите иметь возможность изменять экспонента без ручного пересчета константы), вы может использовать функцию constexpr :

 constexpr unsigned long power(unsigned long base, unsigned long exponent) { return exponent == 0 ? 1 : base * pow(base, exponent - 1); } const unsigned long imax = power(2, 16); 

Вот объяснение всех нетривиальных строк, которые вы указали:

  • len(t) означает «длина t » , т. е. количество элементов в массиве t.

  • 2**16 «два для мощности 16» ( 1 << 16 в вашем коде на C ++).

  • for n in range(0,L) эквивалентно for (int n = 0; i < L; ++i)

  • arange и zeros , вероятно, являются функциями Numpy. Вы можете найти ссылку на них здесь и здесь .

Что касается последнего момента, вероятно, есть некоторый оператор import вы пропустили из кода.

Цитирование из документов:

arange

Возвращайте равномерно разнесенные значения в течение заданного интервала.

Значения генерируются в пределах полуоткрытого интервала [старт, стоп) (другими словами, интервал, включающий начало, но исключая стоп).

Шаг по умолчанию – 1 , поэтому t будет массивом, содержащим числа [0, 1, 2, 3, ..., 3 * 44100 - 1] .

нули

Верните новый массив заданной формы и типа, заполненный нулями.

Тип по умолчанию для zerosfloat , поэтому s , sd1 и sd2 инициализируются как массивы, заполненные 0.0 , каждый из которых имеет L элементов.

Python: t = arange(0,3*fs)

C ++: double t[] = {0.0,1.0,...,3*fs}; // will not compile of course double t[] = {0.0,1.0,...,3*fs}; // will not compile of course

Python: L = len(t)

C ++: int L = sizeof(t)/sizeof(*t); // where t is an array in the current scope int L = sizeof(t)/sizeof(*t); // where t is an array in the current scope

Python: s = zeros(L)

C ++: double s[L] = {0}; // where L is a constant double s[L] = {0}; // where L is a constant

Python: for n in range(0,L)

C ++: for (int i=0; i<L; i++)

Interesting Posts

Визуализация 3D-numpy-массива кадр за кадром

Смешивание PostgreSQL и MongoDB (как бэкэндов Django)

SMTPAuthenticationError при отправке почты с использованием gmail и python

Сравнение и замена значений внутри DataFrames

Получение ошибки кортежа при попытке проанализировать файл конфигурации

Как получить следующий сетевой адрес с учетом начального сетевого адреса в python

Ошибка с командой Python sleep () на странице http://rept.it

сериализовать фрейм данных pandas (python) в двоичный формат

Предварительная обработка в scikit learn – отдельная выборка – Предупреждение об износ

читать предложения, разделенные разрывом строки и анализом

Преобразовать временную метку с эпохи в datetime.datetime

SWIG C ++ для Python: предупреждение (362): operator = ignored

Как включить сторонние библиотеки Python в Google App Engine?

Накопитель Google App Engine: работа с возможной согласованностью

Как конвертировать даты с алфавитными месяцами в timestamp

Python - лучший язык программирования в мире.