如何将std::vector<complex<double>>转换为FFT所需的complex<double>[N]数组
核心解决思路
C++ 中 std::vector 的元素是连续存储的,其 data() 方法会返回指向内部存储数组的指针,可以直接匹配 FFT 函数要求的数组入参,不需要额外做数组转换。同时你原代码中构造复数向量的逻辑可以简化,优化后的完整实现如下:
优化后代码
// 原有前置代码不变 void FFT(Complex f[], Complex ftilde[], int log2N); vector<double> amplitudes; WavReader("../Projects/Project4/input.wav", amplitudes); size_t size = amplitudes.size(); const int new_size = resize(size); // 取最近的2的幂次 int log2N = log2(new_size); using Complex = complex<double>; // 简化复数向量构造逻辑,不需要单独创建虚部数组 vector<Complex> cvec(new_size); for (size_t i = 0; i < size; ++i) { cvec[i] = Complex(amplitudes[i], 0.0); } // 振幅resize补的0对应复数默认就是(0,0),无需额外处理 // 构造FFT输出向量 vector<Complex> ftilde(new_size); // 直接传入vector的data()指针即可,不需要额外定义栈上数组 FFT(cvec.data(), ftilde.data(), log2N);
注意事项
- 你原代码中写的
Complex f[N]属于变长数组(VLA),不是标准C++支持的语法,仅部分编译器提供扩展支持,可移植性很差,不推荐使用 - 如果确实需要把数据复制到栈数组中(仅当N是编译期常量时合法),可以用
std::copy拷贝:// 仅N为编译期常量时可用 Complex f[N]; std::copy(cvec.begin(), cvec.end(), f);
内容的提问来源于stack exchange,提问作者meso96
相关产品推荐
相关产品推荐

