Speex 中傅里叶变换spx_fft的秘密

Speex中用spx_fft将信号从时域转换到频域。

/** Forward (real to half-complex) transform */
void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out);

调用方式:

/* Convert x (echo input) to frequency domain */
        spx_fft(fft_table, x, &X[0]);

频域分析

采样率48k,10ms的数据480个点,处理buffer长度为960个点。
(这里暂时不解释帧移的情况)。
原始数据:


原始数据 960个点
matlab分析

用matlab进行傅里叶变换:
频域的值:


频域的值

可以看出除第一个元素(直流, Index=0)外和第481个元素(Index=480)为,其它均为复数。
并且,其它元素以第481个点进行对称,实部相同,虚部符号相反
比如:

对称举例

再比如第2到4个元素(Index: 1~3):

1   62.208 +     7.4152i
2   -57.477 +     49.925i
3   -6.7527 -      45.79i

与第958~960个元素(Index: 957~959)

957 -6.7527 +      45.79i
958 -57.477 -     49.925i
959 62.208 -     7.4152i

逐个对称。

由于对称性,其实第482~960个元素的值其实是没有必要保存的。

spx_fft分析
spx_fft分析结果
matlab vs spx_fft
matlab vs spx_fft

可以看出matlab是real to complex,而spx_fft是real to half-complex.
spx_fft的结果依次存的是实部和虚部。

查看spx_fft的定义:

/** Forward (real to half-complex) transform */
void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out);

到底 half-complex是什么呢?

The Halfcomplex-format DFT

以下介绍的Halfcomplex与spx_fft的思想相同,但在存储位置上是有区别的。

The Halfcomplex-format DFT

而spx_fft的存储顺序是这样的:

r0, r1, i1, r2, i2, ..., r(n+1)/2-1, i(n+1)/2-1, rn/2

References:

http://www.fftw.org/fftw3_doc/The-Halfcomplex_002dformat-DFT.html#The-Halfcomplex_002dformat-DFT

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、傅立叶变换的由来 关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚...
    constant007阅读 10,023评论 1 10
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,759评论 0 38
  • 阅尽繁华,返璞归真。有时我们在生活中,会遇到一种人。他们经历过大富贵,由于某些因由,于当下勉强维持着体面的生活。然...
    叔谦阅读 1,738评论 0 0
  • 2017年 11月 27日 (晴) 亲爱的简叔你好: 见字如面,相遇恨晚。因为我已经无可救药地爱上了简书,所以...
    追梦CEO阅读 3,318评论 22 22
  • 美国电视连续剧《House of Cards 》是2012年曾经风靡一时的美国热门剧集。 它入木三分地剖开了美国政...
    谜样男人阅读 5,281评论 5 2

友情链接更多精彩内容