簡體   English   中英

FFT值錯誤?

[英]FFT wrong value?

隨機構建一個非常簡單的聲譜分析儀。

給出以下python代碼:
http://rosettacode.org/wiki/Fast_Fourier_transform#Python
像這樣實現:

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"

我得到以下結果:

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發生意外的頻移

由於正弦波的偏移為+0.5,因此您顯然具有較大的DC分量 如果您使正弦波的均值為零(即+/- 0.5或+/- 1.0的范圍),則您的頻譜應在DC(0 Hz)端看起來更好。

還要注意,在FFT之前您沒有使用窗口函數 ,因此會出現頻譜泄漏頻譜 “拖尾”),這會加劇任何直流分量的影響。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM