Kiss FFT: обратное 2D-преобразование с последующим прямым преобразованием дает неверный результат - PullRequest
0 голосов
/ 10 июня 2019

Приведенный ниже код выполняет обратное 2D-БПФ массива частот 4x4 (с номерами гармоник), за которым следует прямое БПФ результата. Чтобы уменьшить результат, он должен быть равен исходным частотам. Некоторые из них действительно совпадают, но некоторые явно отличаются. Что я делаю не так?

#include <stdio.h>
#include "kiss_fftndr.h"

// function to print FFT output
void print_freq(kiss_fft_cpx* in, int n0, int n1){

    printf("\n");
    for(int y = 0; y < n0; y++){
        for(int x = 0; x < n1; x++){
            printf(" (%f, %f) ", in[y*n1+x].r, in[y*n1+x].i);
        }
        printf("\n");
    }
}

int main(){

    int dims[2] = {4,4};
    kiss_fftndr_cfg f_cfg = kiss_fftndr_alloc(dims, 2, 0, NULL, NULL);
    kiss_fftndr_cfg i_cfg = kiss_fftndr_alloc(dims, 2, 1, NULL, NULL);

    float signal[16];
    kiss_fft_cpx freq[12];

    for(int i = 0; i < 12; i++){
        freq[i].r = 1.0/(i+1);
        freq[i].i = 0.0;
    }

    printf("Before:\n");
    print_freq(freq, 4, 3);

    // inverse transform followed by transform
    kiss_fftndri(i_cfg, freq, signal);
    kiss_fftndr(f_cfg, signal, freq);

    // renormalize
    for(int i = 0; i < 12; i++){
        freq[i].r /= 16.0;
        freq[i].i /= 16.0;
    }

    printf("\nAfter:\n");
    print_freq(freq, 4, 3);
}

Выход

Before:

 (1.000000, 0.000000)  (0.500000, 0.000000)  (0.333333, 0.000000)
 (0.250000, 0.000000)  (0.200000, 0.000000)  (0.166667, 0.000000)
 (0.142857, 0.000000)  (0.125000, 0.000000)  (0.111111, 0.000000)
 (0.100000, 0.000000)  (0.090909, 0.000000)  (0.083333, 0.000000)

After:

 (1.000000, 0.000000)  (0.500000, 0.000000)  (0.333333, 0.000000)
 (0.175000, 0.000000)  (0.200000, 0.000000)  (0.125000, 0.000000)
 (0.142857, 0.000000)  (0.125000, -0.000000)  (0.111111, 0.000000)
 (0.175000, 0.000000)  (0.090909, 0.000000)  (0.125000, 0.000000)
...