快速傅里叶变换:第一个元素是正确的,但其余元素不正确
Fast Fourier Transform: The first element is correct, but the rest are not
我正在实现FFT,我的解决方案可以始终如一地解决转换的第一个元素,但不能完成其余的工作。
这是代码:
vector<complex<double>> FFT(vector<complex<double>> a, complex<double> w)
{
if (a.size() == 1) {
return a;
}
vector<complex<double>> even;
vector<complex<double>> odd;
for (int i = 0; i < a.size(); i ++) {
if (i % 2 == 0) {
even.push_back(a[i]);
}
else {
odd.push_back(a[i]);
}
}
vector<complex<double>> FFTeven = FFT(even, nthRoot(a.size() / 2));
vector<complex<double>> FFTodd = FFT(odd, nthRoot(a.size() / 2));
vector<complex<double>> ret;
for (int i = 0; i < a.size(); i++) {
ret.push_back(0);
}
for (int i = 0; i <= (a.size() / 2) - 1; i++) {
ret[i] = FFTeven[i] + pow(w, i) * FFTodd[i];
ret[i + a.size() / 2] = FFTeven[i] - pow(w, i) * FFTodd[i];
}
return ret;
}
主代码:
int n = 4;
vector <complex<double>> a;
vector<complex<double>> b;
for (int i = 1; i < 9; i++) {
if (i < 5) {
a.push_back((complex<double>) i);
}
else {
b.push_back((complex<double>) i);
}
}
for (int i = 0; i < n; i++) {
a.push_back(0);
b.push_back(0);
}
complex<double> w = nthRoot(a.size());
a = FFT(a, w);
b = FFT(b, w);
for (int i = 0; i < a.size() - 1; i++) {
cout << a[i].real() << ", ";
}
cout << a.back().real() << ">n";
for (int i = 0; i < b.size() - 1; i++) {
cout << b[i].real() << ", ";
}
cout << b.back().real() << ">n";
第 n 个根:
complex<double> nthRoot(int n)
{
return (cos(2 * M_PI / n) + i * sin(2 * M_PI / n));
}
我在全球范围内声明:
const complex<double> i = (0.0, 1.0);
示例输入:
a = <5, 6, 7, 8, 0, 0, 0, 0>
示例输出:
ret = <26, 31.799, -6, -7.65685, -2, -7.79899, 2, 3.65685>
预期输出:
ret = <26, 3.5858, -2, 6.4142,-2, 6.4142, -2, 3.5858>
该FFT用于查找卷积,因此在输入向量末尾填充零。任何帮助都会得到赞赏。
好吧,
我通过运行您的代码获得了您预期的输出。唯一的区别是当我pushback
0 时,我必须使用 push_back(complex<double>(0))
.我认为这并不重要。
您是否搞砸了预期结果和示例结果?
如果有人对这个FFT示例感兴趣,我将"复制-粘贴-运行"版本放在下面:
#include <stdio.h>
#include <iostream>
#include <vector>
#include <complex>
using namespace std;
complex<double> nthRoot(int n)
{
return complex<double>(cos(2 * M_PI / n), sin(2 * M_PI / n));
}
vector<complex<double> > FFT(vector<complex<double> > a, complex<double> w)
{
if (a.size() == 1) {
return a;
}
vector<complex<double> > even;
vector<complex<double> > odd;
for (int i = 0; i < a.size(); i ++) {
if (i % 2 == 0) {
even.push_back(a[i]);
}
else {
odd.push_back(a[i]);
}
}
vector<complex<double> > FFTeven = FFT(even, nthRoot(a.size() / 2));
vector<complex<double> > FFTodd = FFT(odd, nthRoot(a.size() / 2));
vector<complex<double> > ret;
for (size_t i = 0; i < a.size(); i++) {
ret.push_back(complex<double>(0));
}
for (size_t i = 0; i <= (a.size() / 2) - 1; i++) {
ret[i] = FFTeven[i] + pow(w, i) * FFTodd[i];
ret[i + a.size() / 2] = FFTeven[i] - pow(w, i) * FFTodd[i];
}
return ret;
}
int main(void) {
int n = 4;
vector<complex<double> > a;
vector<complex<double> > b;
for (int i = 1; i < 9; i++) {
if (i < 5) {
a.push_back((complex<double>) i);
}
else {
b.push_back((complex<double>) i);
}
}
for (int i = 0; i < n; i++) {
a.push_back(complex<double>(0));
b.push_back(complex<double>(0));
}
complex<double> w = nthRoot(a.size());
a = FFT(a, w);
b = FFT(b, w);
for (int i = 0; i < a.size() - 1; i++) {
cout << a[i].real() << ", ";
}
cout << a.back().real() << ">n";
for (int i = 0; i < b.size() - 1; i++) {
cout << b[i].real() << ", ";
}
cout << b.back().real() << ">n";
}
输出为
10, -0.414214, -2, 2.41421, -2, 2.41421,-2, -0.414214>
26, 3.58579, -2, 6.41421, -2,6.41421, -2, 3.58579>
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何与元素进行元素比较
- 在查找子集中元素和元素数量之间的二进制比较背后的逻辑是什么?
- 并行算法将向量的元素分配到另一个元素的元素
- 为什么我要获得元素填充元素的零长度
- 如何删除 QStringList 中的冗余元素
- 如何在 MFC 中访问主对话框的元素?元素是在可视化编辑器VS 2012中创建的
- 指向列表中元素VS元素本身的指针