Приведенный ниже код выполняет обратное 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)