离散傅立叶变换C++
Discrete Fourier Transform C++
我正在尝试编写简单的DFT和IDFT函数,这将是我未来项目的核心。问题是IDFT返回的值与输入值不同,我不明白错误在哪里。下面是我的源代码:
vector<double> input;
vector<double> result;
vector<complex<double>> output;
double IDFT(int n)
{
double a = 0;
double b = 0;
int N = output.size();
for(int k = 0; k < N; k++)
{
double value = abs(output[k]);
a+= cos((2 * M_PI * k * n) / N) * value;
b+= sin((2 * M_PI * k * n) / N) * value;
}
complex<double> temp(a, b);
double result = abs(temp);
result /= N;
return result;
}
complex<double> DFT(double in, int k)
{
double a = 0;
double b = 0;
int N = input.size();
for(int n = 0; n < N; n++)
{
a+= cos((2 * M_PI * k * n) / N) * input[n];
b+= -sin((2 * M_PI * k * n) / N) * input[n];
}
complex<double> temp(a, b);
return temp;
}
int main()
{
input.push_back(55);
input.push_back(15);
input.push_back(86);
input.push_back(24);
input.push_back(66);
input.push_back(245);
input.push_back(76);
for(int k = 0; k < input.size(); k++)
{
output.push_back(DFT(input[k], k));
cout << "#" << k << ":t" << input[k] << " t>> abs: " << abs(output[k]) << " >> phase: " << arg(output[k]) << endl;
}
for(int n = 0; n < output.size(); n++)
{
result.push_back(IDFT(n));
cout << result[n] << endl;
}
return 0;
}
您的傅立叶逆变换显然被破坏了:您忽略了复数output[k]
的自变量。
它应该是这样的:
double IDFT(size_t n)
{
const auto ci = std::complex<double>(0, 1);
std::complex<double> result;
size_t N = output.size();
for (size_t k = 0; k < N; k++)
result += std::exp((1. / N) * 2 * M_PI * k * n * ci) * output[k];
result /= N;
return std::abs(result);
}
编辑
如果你想明确地分离实部和虚部,你可以使用:
double IDFT(size_t n)
{
double a = 0;
size_t N = output.size();
for (size_t k = 0; k < N; k++)
{
auto phase = (2 * M_PI * k * n) / N;
a += cos(phase) * output[k].real() - sin(phase) * output[k].imag();
}
a /= N;
return a;
}
对于英特尔核心计算机:
有一个英特尔IPP
库。它提供了许多性能非常高的功能。由于它们使用的矢量运算,很难写出比它们的函数更快的东西。试试看:https://software.intel.com/en-us/intel-ipp
https://software.intel.com/en-us/articles/how-to-use-intel-ipp-s-1d-fourier-transform-functions
相关文章:
- 基于范围的变换以实现正常循环
- OpenCV 傅里叶变换复杂输出问题
- SFML 纹理变换(放大)
- 平面缓冲区可以利用向量中的 0 吗?还是其他小波比哈尔变换更好?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 在特征中显示仿射变换
- 离散傅立叶变换C++
- ICP变换矩阵平移和旋转
- 如何从2D数组为QHeightMapSurfaceDataProxy创建高度图以显示2D傅立叶变换结果
- 将 3D 变换转换为 2D
- 使用变换翻转地图,接收错误"type int unexpected"
- 指示 Qi 变换属性失败的适当方法是什么?
- 如何在 c++ 中将变换与对的向量一起使用
- 骨骼动画:变换矩阵(collada)之间的插值
- 函数已知时的傅里叶变换
- 与 fftw3 相比,错误的 2D CuFFT 逆变换
- DFT(离散傅里叶变换)与C++代码
- 3D 矢量 - 变换和减号
- 快速计算变换/旋转马里克斯4x4
- 如何在 CPU 上计算向量变换?