Использование функций GNU Octave FFT

Я играю с функциями 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));

в принципе, то, что он делает, это взять функцию, вычислить изображение интервала, fft-it, затем сохранить несколько гармоник и ifft результат. Тем не менее, я получаю график, который вертикально сжат (вертикальный масштаб вывода неверен). Есть идеи?

2 ответов


вы, вероятно, делаете это неправильно. Вы удаляете все "отрицательные" частоты в своем коде. Вы должны сохранять как положительные, так и отрицательные низкие частоты. Вот код в python и результат. Сюжет имеет правильный масштаб.

alt текст 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))

вы выбрасываете вторую половину преобразования. Преобразование Эрмитово симметрично для вещественных входов, и вы должны сохранить эти линии. Попробуйте это:

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 извлечение.

отметим, что input и size ключевые слова в Октаве; clobbering их с вашими собственными переменными-хороший способ получить действительно странные ошибки дорога!