2012-05-03 3 views
3

Я пытаюсь вычислить DFT для этого массива x_1. Он должен быть мертвым простым, но мои ценности слишком низки. Что случилось с моим кодом?DFT (дискретное преобразование Фурье) с C++ STL

нет ссылки на другие примеры - просто поиск исправления для моего собственного кода.

#include <iostream> 
#include <complex> 
#include <cassert> 

int main() 
{ 
    const unsigned int N = 20; 

    const double x_1[N] = {0, 0.3, 0.6, 0.8, 1, 1, 0.9, 0.7, 0.5, 0.2, 0.2, 0.5, 0.7, 0.9, 1, 1, 0.8, 0.6, 0.3, 0}; 

    for(unsigned int k = 0; k < N; k++) 
    { 
     std::complex<double> sum(0.0,0.0); 
     for(unsigned int j = 0; j < N; j++) 
     { 
      int integers = -2*j*k; 
      std::complex<double> my_exponent(0.0, M_PI/N*(double)integers); 
      sum += x_1[j] * std::exp(my_exponent); 
     } 
     std::cout << abs(sum)/N << std::endl; 
    } 
    return 0; 
} 
+2

Вы знаете, какие ожидаемые выходные значения для данного входа? – sergico

+0

Да, я знаю их, и они намного выше. Поэтому я должен быть неправ. 11-е значение должно быть около 0,48. – Johannes

ответ

4
std::cout << abs(sum)/N << std::endl; 

Почему вы деления на N?

Коэффициенты не имеют деления. См. wiki.

Эти значения, которые я получаю с Matlab:

12.0000000000000 + 0.00000000000000i 
-0.971586454726535 - 0.153884176858763i 
-4.26246117974981 - 1.38495759172886i 
-0.0712959999079796 - 0.0363271264002681i 
-0.473606797749979 - 0.344095480117793i 
0.00000000000000 + 0.00000000000000i 
-0.237538820250189 - 0.326944137602412i 
0.0185095954079375 + 0.0363271264002681i 
-0.0263932022500213 - 0.0812299240582274i 
0.0243728592265771 + 0.153884176858763i 
0.00000000000000 + 0.00000000000000i  
0.0243728592265771 - 0.153884176858763i 
-0.0263932022500213 + 0.0812299240582274i 
0.0185095954079375 - 0.0363271264002681i  
-0.237538820250189 + 0.326944137602412i 
0.00000000000000 + 0.00000000000000i  
-0.473606797749979 + 0.344095480117793i 
-0.0712959999079796 + 0.0363271264002681i 
-4.26246117974981 + 1.38495759172886i 
-0.971586454726535 + 0.153884176858763i 

и я вижу, более или менее один и то же значение при печати с использованием зОго :: COUT < < < < суммы станд :: епсИ;

+0

Я сделаю это для своего упражнения. Это не может быть причиной ошибки. – Johannes

+0

Спасибо за попытку с помощью matlab, тогда расчет должен быть правильным ... Почему первое значение (12.0) такое высокое? – Johannes

+2

Значение постоянного тока представляет собой сумму всех значений. Если вы суммируете все значения, вы получите 12. – BertR

0

Я думаю, что линия integers = -2*j*k не должна иметь минус знак (-), так как это не обратное преобразование

Смежные вопросы