首页 > 解决方案 > Kiss FFT:逆 2D 变换后跟前向变换给出错误的结果

问题描述

下面的代码对 4x4 频率数组(设置为谐波数)进行逆 2D FFT,然后对结果进行正向 FFT。缩小结果,它应该等于原始频率。其中一些确实匹配,但其中一些明显不同。我究竟做错了什么?

#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)

标签: fftkissfft

解决方案


推荐阅读