Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C IFFT后虚部的冲突_C_Matlab_Signal Processing_Fft_Ifft - Fatal编程技术网

C IFFT后虚部的冲突

C IFFT后虚部的冲突,c,matlab,signal-processing,fft,ifft,C,Matlab,Signal Processing,Fft,Ifft,我只想知道IFFT后在想象中的冲突背后的原因 对于我的C/C++实现和Matlab实现,我都在执行以下相同的步骤 我的信号x的维数为Mx1,我对该信号执行N点FFT(其中N=2*M)以获得频域中的N点信号 在此频域信号上应用自定义滤波器(实部和虚部在步骤中都会发生变化) 执行N点逆FFT C/C++和Matlab实现生成的结果完全相同,除了逆IFFT步骤之后,虚部不匹配,但实部匹配 如果跳过上面的步骤2,两个实现的IFFT输出将匹配,没有任何问题。 我的IFFT输入信号(即步骤2滤波器后)不需要

我只想知道IFFT后在想象中的冲突背后的原因

对于我的C/C++实现和Matlab实现,我都在执行以下相同的步骤

  • 我的信号x的维数为Mx1,我对该信号执行N点FFT(其中N=2*M)以获得频域中的N点信号
  • 在此频域信号上应用自定义滤波器(实部和虚部在步骤中都会发生变化)
  • 执行N点逆FFT
  • C/C++和Matlab实现生成的结果完全相同,除了逆IFFT步骤之后,虚部不匹配,但实部匹配

    如果跳过上面的步骤2,两个实现的IFFT输出将匹配,没有任何问题。 我的IFFT输入信号(即步骤2滤波器后)不需要共轭对称。事实上,该信号甚至可能不是厄米/对称信号

    目前,我使用的是FFT/IFFT的C实现,定义为一个函数
    smbFft

    任何线索,为什么会发生这种情况

    PS:如果有人能给我指出一个C/C++中的FFT实现,那就太好了,它与相应的Matlab实现完全一致

    谢谢


    编辑:我刚刚测试了FFTW实现,而不是
    smbFfT
    (我上面提到过)。FFTW实现也有同样的问题,这表明这两个经过测试的C实现都使用厄米对称设置执行IFFT。我需要在C中执行与Matlab对IFFT(…,'nonsymmetric')相同的IFFT如果你想要一个严格的实数结果(虚部都等于零),那么你需要在IFFT之前使向量完全共轭对称(实部镜像,虚部反向镜像)


    Matlab和C对数组的索引0或1的处理方式不同。确保你的过滤器也考虑到了这一点。

    如果你想要一个严格的实数结果(虚部都等于零),那么你需要在IFFT之前使向量完全共轭对称(实部镜像,虚部反向镜像)


    Matlab和C对数组的索引0或1的处理方式不同。确保你的过滤器也考虑到了这一点。

    发布你的代码。特别要注意的是Matlab
    操作符,它应用了一个复杂的共轭函数try FFT->IFFT,而没有对这两个代码进行其他更改。请确认C代码中的逆运算是正确的。结果应该等于输入值(考虑数值精度)@Sebastien我刚刚在上面编辑过,我跳过了上面的第2步,IFFT的输出与Matlab的IFFT匹配。@LuisMendo感谢您的指针。我知道这项操作。您在这两种情况下使用完全相同的过滤器吗?我曾经使用fftw作为C代码。非常高效和健壮。发布您的代码。特别要注意的是Matlab
    操作符,它应用了一个复杂的共轭函数try FFT->IFFT,而没有对这两个代码进行其他更改。请确认C代码中的逆运算是正确的。结果应该等于输入值(考虑数值精度)@Sebastien我刚刚在上面编辑过,我跳过了上面的第2步,IFFT的输出与Matlab的IFFT匹配。@LuisMendo感谢您的指针。我知道这项操作。您在这两种情况下使用完全相同的过滤器吗?我曾经使用fftw作为C代码。非常高效和健壮。谢谢你的指点。我的IFFT输入信号(即步骤2滤波器后)不需要共轭对称。因此,我知道后IFFT不会产生零的虚部。这不是问题所在。问题是,在IFFT之后,虚部对我来说仍然很重要。但是C实现(我上面提到过)计算的虚值与Matlab.IFFT实现相比有所不同。换句话说,这两个IFFT实现在处理相同的输入非对称信号时发生冲突。感谢您的指点。我的IFFT输入信号(即步骤2滤波器后)不需要共轭对称。因此,我知道后IFFT不会产生零的虚部。这不是问题所在。问题是,在IFFT之后,虚部对我来说仍然很重要。但是C实现(我上面提到过)计算的虚值与Matlab.IFFT实现相比有所不同。换句话说,这两种IFFT实现在处理相同的输入非对称信号时存在冲突。