2010-05-08 82 views
6

我玩倍頻程的FFT功能,並且我真的不能弄清楚如何擴展其輸出:我用下面的(很短)的代碼來近似的函數:使用GNU八度FFT功能

function y = f(x) 
    y = x .^ 2; 
endfunction; 

X=[-4096:4095]/64; 
Y = f(X); 
# plot(X, Y); 

F = fft(Y); 
S = [0:2047]/2048; 

function points = approximate(input, count) 
    size = size(input)(2); 
    fourier = [fft(input)(1:count) zeros(1, size-count)]; 
    points = ifft(fourier); 
endfunction; 

Y = f(X); plot(X, Y, X, approximate(Y, 10)); 

基本上,它所做的是取一個函數,計算一個區間的圖像,然後保留一些諧波,然後計算結果。然而,我得到了一個垂直壓縮的情節(輸出的垂直範圍是錯誤的)。有任何想法嗎?

回答

3

你可能做錯了。您刪除代碼中的所有「負面」頻率。你應該保持積極和消極的低頻率。這裏是python中的代碼和結果。情節有正確的規模。

alt text http://files.droplr.com/files/35740123/XUl90.fft.png

代碼:

from __future__ import division 

from scipy.signal import fft, ifft 
import numpy as np 

def approximate(signal, cutoff): 
    fourier = fft(signal) 
    size = len(signal) 
    # remove all frequencies except ground + offset positive, and offset negative: 
    fourier[1+cutoff:-cutoff] = 0 
    return ifft(fourier) 

def quad(x): 
    return x**2 

from pylab import plot 

X = np.arange(-4096,4096)/64 
Y = quad(X) 

plot(X,Y) 
plot(X,approximate(Y,3)) 
+0

Olivier,你搖滾:)這正是我需要的,謝謝! – 2010-05-08 13:03:01

+0

雖然,使用negative-cutoff下標有什麼作用? – 2010-05-08 17:35:29

+0

CFP,很高興你喜歡它! 「cutoff」表示「截止到最後」索引,即「-1」表示最後一個索引。所以切片'[size/2,-cutoff]'意味着將所有內容都從一半中刪除,除了'cutoff'最後。一個更好的方法是:'fourier [cutoff + 1:-cutoff] = 0'。 – 2010-05-08 17:45:47

4

您正在拋出轉換的後半部分。對於實值輸入,變換是厄米特對稱,並且必須保留這些行。嘗試:

function points = approximate(inp, count) 
    fourier = fft(inp); 
    fourier((count+1):(length(fourier)-count+1)) = 0; 
    points = real(ifft(fourier)); %# max(imag(ifft(fourier))) should be around eps(real(...)) 
endfunction; 

逆變換將不可避免有一些微小的虛部由於數值計算誤差,因此real萃取。

請注意,inputsize是Octave中的關鍵字;用自己的變量來打破它們是一種很好的方式來獲得真正奇怪的錯誤!

+0

很好,謝謝!我現在明白了。你知道關於fft的好文檔嗎? – 2010-05-08 13:04:13