6

オクターブの 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 することです。それでも、垂直方向に圧縮されたプロットが表示されます (出力の垂直方向のスケールが間違っています)。何か案は?

4

2 に答える 2

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 のキーワードであることに注意してください。それらを独自の変数で上書きすることは、非常に奇妙なバグを将来発生させる良い方法です!

于 2010-05-08T10:06:56.357 に答える
3

あなたはおそらくそれを間違っています。コード内のすべての「負の」周波数を削除します。正と負の両方の低周波数を維持する必要があります。これはPythonのコードと結果です。プロットには適切な縮尺があります。

代替テキスト 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))
于 2010-05-08T10:07:43.707 に答える