首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFT值错误?

FFT值错误?
EN

Stack Overflow用户
提问于 2013-10-04 10:08:47
回答 1查看 715关注 0票数 0

随机建立一个非常简单的声谱分析仪。

给定这个python代码:

transform#Python

实施方式如下:

代码语言:javascript
复制
import math
from cmath import exp, pi

def fft(x):
    N = len(x)
    if N <= 1: return x
    even = fft(x[0::2])
    odd =  fft(x[1::2])
    return ([even[k] + exp(-2j * pi * k / N) * odd[k] for k in xrange(N / 2)] + 
            [even[k] - exp(-2j * pi * k / N) * odd[k] for k in xrange(N / 2)])

#res = fft([1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0])
res = [math.sin(k) / 2.0 + 0.5 for k in xrange(64)]  # positive sine wave
res = fft(res)

for k in xrange(64/2):
    # get the amplitude...
    sqr = math.sqrt(res[k].real * res[k].real + res[k].imag * res[k].imag)
    if sqr > 0:
        print 20 * math.log10(sqr)  # ...in decibels
    else:
        print "-INF"

我得到了以下结果:

代码语言:javascript
复制
30.1160980385
-22.9398603241
-18.5295301528
-15.0005952198
-11.9809319241
-9.15035811436
-6.26269080991
-3.05038111824
0.930742121289
6.85461898041
23.4890109499 <-- PEAK
11.1462405429
4.62796511517
1.22261338459
-1.03611868864
-2.69639200998
-3.98905968693
-5.03263380282
-5.89570135908
-6.62130526828
-7.23808293566
-7.76594168565
-8.21919399668
-8.60840088318
-8.94151058446
-9.22459042752
-9.46231245749
-9.6582838436
-9.81527579404
-9.93538377539
-10.0201395611
-10.070588143

挺好的。我有一个23 dB的峰值,应该在输入正弦波的频率上,一切看起来都很好。

唯一的问题是,第一个值是什么:30.1160980385?这是一个非常响亮的低音吗?或者更有可能是算法中的缺陷。在这种情况下,我该如何解决这个问题。

最后一个问题。fft可以用负值作为输入吗?在上面的例子中,我使用了正弦波,这个正弦波的范围总是在0,1。如果我想传递范围在-1,1的值,我会把所有的东西都搞砸吗?

编辑:

我删除了编辑,因为它是非主题的。你可以读懂这里的内容:

窗函数应用后FFT意外频移

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-04 10:25:18

很明显,由于正弦波的偏移量为+0.5,所以直流分量很大。如果你使正弦波的平均值为零(例如,+/- 0.5或+/- 1.0),那么你的光谱在直流(0赫兹)端应该会更好。

还请注意,您还没有使用窗口函数之前的快速傅立叶变换,所以你将得到光谱泄漏 (光谱的“涂抹”),这会加剧任何直流成分的影响。

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

https://stackoverflow.com/questions/19178611

复制
相关文章

相似问题

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