在C++中,当我在main()中输入时,RL\u输入={1,2,-3,4},IM\u输入={4,3,2,1},我得到的答案是RL\u输出={4,6,-8,2},IM\u输出={2,-4,-6,-8}。
我想从SWIFT中调用这个C++代码。因此,在SWIFT中,我想做以下事情:
let (RL_Output, IM_Output) = Some_Swift_Function([1,2,-3,4], [-4,3,2,1])
print(RL_Output)
print(IM_Output)
如何使用我的C++代码(如下所示)实现上述功能?
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <random>
#include <vector>
#include "FftRealPair.hpp"
using std::cout;
using std::endl;
using std::vector;
int main() {
  vector<double> inputreal({1,2,-3,4});
  vector<double> inputimag({-4,3,2,1});
  vector<double> actualoutreal(inputreal);
  vector<double> actualoutimag(inputimag);
  Fft::transform(actualoutreal, actualoutimag);
  std::cout << "REAL:" << std::endl;
  for (int i = 0; i < inputimag.size(); ++i)
  {
    std::cout << actualoutreal[i] << std::endl;
  }
  std::cout << "IMAG" << std::endl;
  for (int i = 0; i < inputimag.size(); ++i)
  {
    std::cout << actualoutimag[i] << std::endl;
  }
  Â
}
#include <algorithm>
#include <cmath>
#include <cstddef>
#include <cstdint>
#include "FftRealPair.hpp"
using std::size_t;
using std::vector;
static size_t reverseBits(size_t x, int n);
void Fft::transform(vector<double> &real, vector<double> &imag) {
  size_t n = real.size();
  if (n != imag.size())
    throw "Mismatched lengths";
  if (n == 0)
    return;
  else if ((n & (n - 1)) == 0)Â
    transformRadix2(real, imag);
  elseÂ
    transformBluestein(real, imag);
}
void Fft::inverseTransform(vector<double> &real, vector<double> &imag) {
  transform(imag, real);
}
void Fft::transformRadix2(vector<double> &real, vector<double> &imag) {
 Â
  size_t n = real.size();
  if (n != imag.size())
    throw "Mismatched lengths";
  int levels = 0;Â
  for (size_t temp = n; temp > 1U; temp >>= 1)
    levels++;
  if (static_cast<size_t>(1U) << levels != n)
    throw "Length is not a power of 2";
 Â
  vector<double> cosTable(n / 2);
  vector<double> sinTable(n / 2);
  for (size_t i = 0; i < n / 2; i++) {
    cosTable[i] = std::cos(2 * M_PI * i / n);
    sinTable[i] = std::sin(2 * M_PI * i / n);
  }
 Â
  for (size_t i = 0; i < n; i++) {
    size_t j = reverseBits(i, levels);
    if (j > i) {
      std::swap(real[i], real[j]);
      std::swap(imag[i], imag[j]);
    }
  }
 Â
  for (size_t size = 2; size <= n; size *= 2) {
    size_t halfsize = size / 2;
    size_t tablestep = n / size;
    for (size_t i = 0; i < n; i += size) {
      for (size_t j = i, k = 0; j < i + halfsize; j++, k += tablestep) {
        size_t l = j + halfsize;
        double tpre = real[l] * cosTable[k] + imag[l] * sinTable[k];
        double tpim = -real[l] * sinTable[k] + imag[l] * cosTable[k];
        real[l] = real[j] - tpre;
        imag[l] = imag[j] - tpim;
        real[j] += tpre;
        imag[j] += tpim;
      }
    }
    if (size == n)Â
      break;
  }
}
void Fft::transformBluestein(vector<double> &real, vector<double> &imag) {
 Â
  size_t n = real.size();
  if (n != imag.size())
    throw "Mismatched lengths";
  size_t m = 1;
  while (m / 2 <= n) {
    if (m > SIZE_MAX / 2)
      throw "Vector too large";
    m *= 2;
  }
 Â
  vector<double> cosTable(n), sinTable(n);
  for (size_t i = 0; i < n; i++) {
    unsigned long long temp = static_cast<unsigned long long>(i) * i;
    temp %= static_cast<unsigned long long>(n) * 2;
    double angle = M_PI * temp / n;
   Â
    cosTable[i] = std::cos(angle);
    sinTable[i] = std::sin(angle);
  }
 Â
  vector<double> areal(m), aimag(m);
  for (size_t i = 0; i < n; i++) {
    areal[i] = real[i] * cosTable[i] + imag[i] * sinTable[i];
    aimag[i] = -real[i] * sinTable[i] + imag[i] * cosTable[i];
  }
  vector<double> breal(m), bimag(m);
  breal[0] = cosTable[0];
  bimag[0] = sinTable[0];
  for (size_t i = 1; i < n; i++) {
    breal[i] = breal[m - i] = cosTable[i];
    bimag[i] = bimag[m - i] = sinTable[i];
  }
 Â
  vector<double> creal(m), cimag(m);
  convolve(areal, aimag, breal, bimag, creal, cimag);
 Â
  for (size_t i = 0; i < n; i++) {
    real[i] = creal[i] * cosTable[i] + cimag[i] * sinTable[i];
    imag[i] = -creal[i] * sinTable[i] + cimag[i] * cosTable[i];
  }
}
void Fft::convolve(const vector<double> &x, const vector<double> &y, vector<double> &out) {
  size_t n = x.size();
  if (n != y.size() || n != out.size())
    throw "Mismatched lengths";
  vector<double> outimag(n);
  convolve(x, vector<double>(n), y, vector<double>(n), out, outimag);
}
void Fft::convolve(
          const vector<double> &xreal, const vector<double> &ximag,
          const vector<double> &yreal, const vector<double> &yimag,
          vector<double> &outreal, vector<double> &outimag) {
  size_t n = xreal.size();
  if (n != ximag.size() || n != yreal.size() || n != yimag.size()
    || n != outreal.size() || n != outimag.size())
    throw "Mismatched lengths";
  vector<double> xr(xreal);
  vector<double> xi(ximag);
  vector<double> yr(yreal);
  vector<double> yi(yimag);
  transform(xr, xi);
  transform(yr, yi);
  Â
  for (size_t i = 0; i < n; i++) {
    double temp = xr[i] * yr[i] - xi[i] * yi[i];
    xi[i] = xi[i] * yr[i] + xr[i] * yi[i];
    xr[i] = temp;
  }
  inverseTransform(xr, xi);
  Â
  for (size_t i = 0; i < n; i++) {Â
    outreal[i] = xr[i] / n;
    outimag[i] = xi[i] / n;
  }
}
static size_t reverseBits(size_t x, int n) {
  size_t result = 0;
  for (int i = 0; i < n; i++, x >>= 1)
    result = (result << 1) | (x & 1U);
  return result;
}
#pragma once
#include <vector>
namespace Fft {
 Â
  void transform(std::vector<double> &real, std::vector<double> &imag);
 Â
  void inverseTransform(std::vector<double> &real, std::vector<double> &imag);
 Â
  void transformRadix2(std::vector<double> &real, std::vector<double> &imag);
 Â
  void transformBluestein(std::vector<double> &real, std::vector<double> &imag);
 Â
  void convolve(const std::vector<double> &x, const std::vector<double> &y, std::vector<double> &out);
 Â
  void convolve(
         const std::vector<double> &xreal, const std::vector<double> &ximag,
         const std::vector<double> &yreal, const std::vector<double> &yimag,
         std::vector<double> &outreal, std::vector<double> &outimag);
  Â
}