C FFTW隔行零和#x27;输出中的s(非结束填充)

C FFTW隔行零和#x27;输出中的s(非结束填充),c,signal-processing,fft,fftw,C,Signal Processing,Fft,Fftw,我找不到记录在哪里或类似的问题,但当我使用超过2k个元素执行FFT时,我的输出交错零,例如,如果我将N加倍到4k,我的输出是4k个元素,2k个数据点与2k个零交替,即{…9413.5,0.0,9266.2,0.0,}。谁能解释一下我忽略了什么,谢谢 //testing the fftw compile with gcc fftw_test.c -lfftw3 -lm -o fftw_test #include <stdlib.h> #include <fftw3.h> #

我找不到记录在哪里或类似的问题,但当我使用超过2k个元素执行FFT时,我的输出交错零,例如,如果我将N加倍到4k,我的输出是4k个元素,2k个数据点与2k个零交替,即{…9413.5,0.0,9266.2,0.0,}。谁能解释一下我忽略了什么,谢谢

//testing the fftw compile with gcc fftw_test.c -lfftw3 -lm -o fftw_test
#include <stdlib.h>
#include <fftw3.h>
#include <math.h>

#define N 1024*4

int main(void)
{
    double input[N] = 
        {/*This is filled with 4k elements representing a basic sine wave*/};

    //declare
    double *in;
    fftw_complex *out;
    fftw_plan my_plan;

    //allocate and assign
    in = (double*) fftw_malloc(sizeof(double) * N);
    for (int i = 0; i < N; i++)
    {
        in[i] = input[i];
    }
    out = (fftw_complex*) fftw_malloc((sizeof(fftw_complex) * N) + 1);
    my_plan = fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);

    //execute
    fftw_execute(my_plan);

    //print magnitude
    FILE *log = fopen("log.txt", "w");
    for (int i = 0; i < N; i++)
    {
        input[i] = sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1]);
        fprintf(log, " %.01lf,", input[i]);
    }

    //exit
    fclose(log);
    fftw_destroy_plan(my_plan);
    fftw_free(in);
    fftw_free(out);
    return 0;
}
这是关键:

我意识到它只生成2k点,我只是复制了两次

您创建了一个正弦波信号,其周期不能均匀地划分信号长度。它的离散傅里叶变换具有所有频率的值,因此(如果它均匀地划分信号长度,在FFT中只会看到两个非零元素)。但是你复制了这个信号,实际上创建了一个信号,
N
正好是周期的两倍。因此,所有奇数
k
的频率内容为零


如果你复制了四份信号,你会在每个非零分量之间找到三个零。如果你复制8份,你会发现7个零。非零元素在所有这些情况下都是相同的,但按拷贝数缩放

请包括创建输入信号的代码。一个完美的正弦波,如果
N
是周期的倍数,在FFT中应该只返回两个非零元素。刚刚添加了脚本,它是用python编写的,我稍微操纵了一下波形,使其全部为正值,谢谢是的,就是这样,谢谢你的帮助!!那么,你的回答是否意味着不需要进行多次复制?@Stephen:复制输入阵列与对信号进行更长时间的采样不同。复制数据对FFT总是没有用处。@CrisLuengo如果我的信号是周期性的,那么对我的信号进行更长的采样是否与复制FFT数据相同?@StephenWong:只有当数据的周期性与采样窗口相同,因此采样两倍的时间才能产生与复制信号完全相同的结果。这不太可能是真的,特别是考虑到噪音将不一样,所以一般来说这些东西是不同的。
#this program generates a sine wave and prints it to sine.txt

import numpy as np
import matplotlib.pylab as plt
file = open("sine.txt","w")

x = np.linspace(0, 2048, 2048)
y = [2048]

plt.plot(np.int16(np.sin(x/16)*2048 + 2048))

for i in x:
    file.write(str(np.int16(np.sin(i/16)*2048+2048)))
    file.write(", ")
file.close()
plt.show()