2017-12-05 16 views
0

離散フーリエ変換を使用して関数を近似しようとしていますが、関数の2M + 1の値が与えられています。離散フーリエ変換を使用した三角関数補間

私は、係数と近似のためのいくつかの違った表情を見てきましたが、私はもともとしようとしていたものがあった(12)と私は、リンクをお詫び申し上げます* http://www.chebfun.org/docs/guide/guide11.html

のように(13)が、どうやらStackOverflowはラテックスをサポートしていません。

私は係数が与えられた近似値を計算する関数を持ち、係数を計算する関数を持っていますが、これも以前の関数を返します。私はいくつかの値でテストしましたが、結果はまったく同じではありませんでした。私はそれらの両方をnumpy.fft.fftと比較しました。係数が一致せず、最初の関数にfftを渡しても良好な近似が得られなかったので、係数だけが問題ではありません。私はあなたのコードを理解していない

def model(cks, x): 
n = len(cks) 
assert(n%2 == 1) 
M = (n-1)//2 
def soma(s): 
    soma = 0 
    for i in range(n): 
     m = -M + i 
     soma += cks[i]*cmath.exp(1j*m*s) 
    return soma 
soma = np.vectorize(soma) 
return soma(x) 

def fourier(y): 
n = len(y) 
assert(n%2 == 1) 
M = (n-1)//2 
def soma(k): 
    soma = 0 
    for i in range(n): 
     t = 2*math.pi*i/n 
     soma += y[i]*cmath.exp(-1j*k*t) 
    return (1/n)*soma 
cks = np.zeros(n, dtype='complex') 
for i in range(n): 
    j = -M + i 
    cks[i] = soma(j) 
return cks, (lambda x: model(cks,x)) 

答えて

0

ていますが、順方向と逆方向そこDFT持っているように、それは私になります

は、ここに私のコードです。それらの1つはpiを使用しませんが、それはすべきです。

補間サンプルを取得することに興味があれば、DFTを適用してゼロを埋め込み、逆DFTを計算することができます(MATLABコードを使用しています。これは私が知っているためですが、 )読みやすい:

f = randn(1,21);      % an input signal to be interpolated 
F = fft(f);       % forward DFT 
F = fftshift(F);      % shift zero frequency to middle of array 
F = [zeros(1,60),F,zeros(1,60)];  % pad with equal number of zeros on both sides 
F = ifftshift(F);     % shift zero frequency back to first array element 
fi = ifft(F) * length(fi)/length(f); % inverse DFT, normalize 
            % `fi` is the interpolated `f` 

% plotting 
x = linspace(1,length(fi)+1,length(f)+1); 
x = x(1:end-1); 
plot(x,f,'x'); 
xi = 1:length(fi); 
hold on 
plot(xi,fi); 

enter image description here

あなたはDFTを実装し、ゼロからDFTを逆、あなたはimplement the latter using the formerをできることを知っておく必要がありますようにあなたが感じた場合。

あなたはDFTの要素の振幅と位相によって与えられた _n A_NΦで、the equation for the Fourier seriesに従う、シフトされた正弦関数の和として連続関数を作成したい場合。