如何将int16数组更改为vector <float>

时间:2019-08-19 06:04:21

标签: c++ arrays vector

我正在设置新的ASR服务器。音频数据来自客户端,音频数据格式为int16数组(PCM数据),应在ASR服务器引擎之前将其更改为vector<float>

我尝试了很多次,但是编译器错误发生如下:

error: invalid conversion from ‘int’ to  kaldi::MatrixResizeType’ [-fpermissive]

error: ‘vector’ was not declared in this scope
    wave_data = vector(std::begin(pcm_bytes), std::end(pcm_bytes)); //testing;

error: missing template arguments before ‘(’ token
    Vector wave_data = Vector(pcm_bytes, pcm_bytes + sizeof(pcm_bytes) / sizeof(pcm_bytes[0])); //testing;

请告诉我如何将数组更改为向量(int16浮点型)而不会发生编译错误。

我的源文件:

BaseFloat pcm_bytes[MAX_FRAME_SIZE*CHANNELS*2];
opus_int16 out[MAX_FRAME_SIZE*CHANNELS]; //opus_int16

/* Convert to little-endian ordering. */
for(int i=0; i<CHANNELS*userinfo->asr_session_data->frame_size; i++)
{
  //pcm_byte
  pcm_bytes[2*i]=(BaseFloat)(out[i]&0xFF);
  pcm_bytes[2*i+1]=(BaseFloat)((out[i]>>8)&0xFF);
}
//vector init
Vector<BaseFloat> wave_data(CHANNELS*userinfo->asr_session_data->frame_size,0);
*wave_data = vector(std::begin(pcm_bytes), std::end(pcm_bytes));* //testing;  -> **error happend this line**    

我的向量头文件:

template<typename Real>
class Vector: public VectorBase<Real> {
 public:
  /// Constructor that takes no arguments.  Initializes to empty.
  Vector(): VectorBase<Real>() {}

  /// Constructor with specific size.  Sets to all-zero by default
  /// if set_zero == false, memory contents are undefined.
  explicit Vector(const MatrixIndexT s,
                  MatrixResizeType resize_type = kSetZero)
      : VectorBase<Real>() {  Resize(s, resize_type);  }

  /// Copy constructor from CUDA vector
  /// This is defined in ../cudamatrix/cu-vector.h
  template<typename OtherReal>
  explicit Vector(const CuVectorBase<OtherReal> &cu);

  /// Copy constructor.  The need for this is controversial.
  Vector(const Vector<Real> &v) : VectorBase<Real>()  { //  (cannot be explicit)
    Resize(v.Dim(), kUndefined);
    this->CopyFromVec(v);
  }

  /// Copy-constructor from base-class, needed to copy from SubVector.
  explicit Vector(const VectorBase<Real> &v) : VectorBase<Real>() {
    Resize(v.Dim(), kUndefined);
    this->CopyFromVec(v);
  }

  /// Type conversion constructor.
  template<typename OtherReal>
  explicit Vector(const VectorBase<OtherReal> &v): VectorBase<Real>() {
    Resize(v.Dim(), kUndefined);
    this->CopyFromVec(v);
  }

// Took this out since it is unsafe : Arnab
//  /// Constructor from a pointer and a size; copies the data to a location
//  /// it owns.
//  Vector(const Real* Data, const MatrixIndexT s): VectorBase<Real>() {
//    Resize(s);
  //    CopyFromPtr(Data, s);
//  }


  /// Swaps the contents of *this and *other.  Shallow swap.
  void Swap(Vector<Real> *other);

  /// Destructor.  Deallocates memory.
  ~Vector() { Destroy(); }

};

1 个答案:

答案 0 :(得分:0)

在线

 *wave_data = vector(std::begin(pcm_bytes), std::end(pcm_bytes));

vector显然是指std::vector(可能某处有using namespace std;-一个坏主意,但经常发生)。 std::vector是标准模板,需要指定元素类型(例如,使用vector<int>(...)vector<float>(...)

但是在代码中没有指定类型;这就是错误的意思。

注意:C ++ 17为构造函数添加了模板参数推导,因为错误消息看起来您的编译器尚不支持。

此外,类Vector(请注意大写字母V)似乎没有接受std::vector的构造函数,除非VectorBase具有非显式构造函数接受std::vector