FFTW: сигнал состоит из шума после IFFT - PullRequest
8 голосов
/ 13 декабря 2010

После выполнения FFT и IFFT я слышу только шум в наушниках ... Вот код:

        double* spectrum = new double[n];

        fftw_plan plan;

        plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT10, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT01, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

Может быть, я выбрал неправильный тип FFT?
PS Данные исходныесигнал

ОБНОВЛЕНИЕ

Хорошо, теперь код равен

        fftw_complex* spectrum = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

        fftw_plan plan;

        plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

Проблема остается той же, мой массив данных поврежден.

ОБНОВЛЕНИЕ # 2

Итак, проблема в моем размере преобразования и нормализации.Если я использую реальные преобразования в реальные FFTW_REDFT10 и FFTW_REDFT01, какие размеры преобразования мне нужно использовать?2 * п?Или что-то другое?И тогда мне нужно нормализовать мой выходной сигнал, разделив каждый элемент на 2 * n?
Спасибо всем за ответ.

ОБНОВЛЕНИЕ # 3

Спасибо всем за повторный ответ.Я решил проблему с вашей помощью.Вот рабочий код:

        // FFT  
        fftw_complex* spectrum  = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);

        fftw_plan plan;

        plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);

        fftw_execute(plan);
        fftw_destroy_plan(plan);

        // some filtering here

        // IFFT
        plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
        fftw_execute(plan);
        fftw_destroy_plan(plan);

        // normalizing

        for (int i = 0; i < n; i++) {
            data[i] = data[i] / n;
        }

Ответы [ 2 ]

5 голосов
/ 13 декабря 2010

Я не вижу, где вы нормализуете свой вывод.Вы должны разделить свои выходные значения на количество элементов в массиве данных, чтобы нормализовать данные обратно к исходному диапазону значений.

См. Руководство FFTW 4.8.2, последний параграф (у меня есть руководство V3.2).

2 голосов
/ 13 декабря 2010

Вы выполняете БПФ от реального к реальному (на самом деле, БПФ вычисляет DCT или дискретное косинусное преобразование внутри, но это приводит к тому же самому).Будьте осторожны с количеством точек, которые вычисляются в массиве выходного спектра.Преобразование реального в действительное имеет только n / 2 + 1 фактических значений, помещенных в массив.

Если, как вы указали, вы вычисляете преобразование реального в сложное, вы сгенерируете обе стороныспектр (они являются комплексными конъюгатами друг друга), но размер выходного массива необходимо будет изменить, чтобы он соответствовал комплексным значениям плюс результат DC.

...