使用离散傅立叶变换的三角插值

时间:2017-12-05 23:42:43

标签: interpolation dft

我试图使用离散傅里叶变换近似函数,给出函数的2M + 1个值。

我已经看到系数和近似的几个不同的表达式,但我最初尝试的那些是(12)和(13),如http://www.chebfun.org/docs/guide/guide11.html

*我为链接道歉,但显然StackOverflow不支持Latex。

我有一个函数用于计算给定系数的近似值,另一个函数用于计算系数,但它也返回此前一个函数。我已经测试了一些值,但结果并未完全接近。我将它们与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))

1 个答案:

答案 0 :(得分:0)

我不确定我理解你的代码,但它看起来像你有一个前向和反向DFT。其中一个不使用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

如果要创建连续函数作为移位正弦函数的总和,请跟随the equation for the Fourier series,其中 A_n Φ_n由幅度和相位给出DFT的要素。