首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解释KissFFT的kiss_fftr函数的结果

如何解释KissFFT的kiss_fftr函数的结果
EN

Stack Overflow用户
提问于 2011-11-01 21:09:22
回答 2查看 6.3K关注 0票数 3

我用KissFFT的实数函数来转换一些真实的音频信号。我很困惑,因为我输入了一个真正的信号与nfft样本,但结果是nfft/2+1复杂的频率箱。

来自KissFFT的自述:

真正的(即不复杂的)优化代码只适用于偶数长度fft。它并行地做两个半长的FFT(打包成real&imag),然后通过缠绕将它们结合起来。计算结果为nfft/2+1复频箱从直流到奈奎斯特。

因此,对于如何解释结果,我没有具体的知识。我的假设是数据被打包成r[0]i[0]r[1]i[1]...r[nfft/2]i[nfft/2],其中r是DC,i是第一个频率bin,r1是第二个,等等。是这种情况吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-02 11:15:57

是。kiss_fftr之所以只制作Nfft/2+1桶,是因为实信号的DFT是共轭对称的。负频率对应的系数( -pi:0或pi:2pi,无论从哪种角度来考虑它)都是[0:pi]的共轭系数。

注意,out和outNfft/2回收箱(DC和Nyquist)的虚部为零。我见过一些库在第一个复杂的部分中将这两个真实的部分组合在一起,但我认为这是一种违约,导致难以诊断、几乎正确的错误。

提示:如果您对数据类型(默认)使用浮点数,则可以将输出数组转换为浮点数* (c99)或std::complex* (c++)。kiss_fft_cpx结构的包装是兼容的。默认情况下,它不使用这些特性的原因是kiss_fft与浮点和双机以及缺乏这些特性的旧ANSI编译器的其他类型一起工作。

下面是一个精心设计的示例(假设c99编译器和type==float)

代码语言:javascript
复制
float get_nth_bin_phase(const float * in, int nfft, int whichbin )
{
  kiss_fftr_cfg st = kiss_fftr_alloc(1024,0,0,0);
  float complex * out = malloc(sizeof(float complex)*(nfft/2+1));
  kiss_fftr(st,in,(kiss_fft_cpx*)out);

  whichbin %= nfft;
  if ( whichbin <= nfft/2 ) 
    ph = cargf(out[whichbin]);
  else
    ph = cargf( conjf( out[nfft-whichbin] ) );
  free(out);
  kiss_fft_free(st);
  return ph;
}
票数 4
EN

Stack Overflow用户

发布于 2011-11-01 23:09:11

结果的r1and i1构成复向量。它们一起给出一个震级(两个分量平方和的平方和)和第一个频率桶的相位(通过atan2())。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7972952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档