c++ - 离散傅立叶变换 C++

标签 c++ fft complextype

我正在尝试编写简单的 DFT 和 IDFT 函数,这将是我 future 项目的核心。麻烦的意思是 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;
}

关于c++ - 离散傅立叶变换 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51679516/

相关文章:

c++ - 这段代码有什么问题?斐波那契数列

c# - 将样本 float 数组转换为WAV文件格式

javascript - 振荡器的网络音频 FFT?

c++ - Eclipse 不会忘记之前的错误

c++ - 如何终止和停止TBB中的任务?

c++ - 将复杂数据从主机传输到设备的简单 CUDA 代码问题

grid - Kendo - 网格 - 复杂对象的聚合

c++ - ordered_map() 中 ‘.’ 标记之前的预期主表达式

ios - EZ音频 : How do you separate the buffersize from the FFT window size(desire higher frequency bin resolution).