从numpy rfft手动恢复原始功能

时间:2019-08-26 15:04:29

标签: python numpy fft

我对函数执行了numpy.fft.rfft以获取傅立叶系数。由于the docs似乎不包含所使用的确切公式,因此我一直假设在我的教科书中找到一个公式:

S(x) = a_0/2 + SUM(real(a_n) * cos(nx) + imag(a_n) * sin(nx))

其中imag(a_n)是傅立叶系数n_th元素的虚部。

为了将其翻译成python语言,我实现了以下内容:

def fourier(freqs, X):
    # input the fourier frequencies from np.fft.rfft, and arbitrary X
    const_term = np.repeat(np.real(freqs[0])/2, X.shape[0]).reshape(-1,1)
    # this is the "n" part of the inside of the trig terms
    trig_terms = np.tile(np.arange(1,len(freqs)), (X.shape[0],1))
    sin_terms = np.imag(freqs[1:])*np.sin(np.einsum('i,ij->ij', X, trig_terms))
    cos_terms = np.real(freqs[1:])*np.cos(np.einsum('i,ij->ij', X, trig_terms))
    return np.concatenate((const_term, sin_terms, cos_terms), axis=1)

这应该给我一个[X.shape[0], 2*freqs.shape[0] - 1]数组,其中包含在条目i,j处的i_th的{​​{1}}元素,该元素是在傅立叶分解的X项下计算的( j_th项是奇数j_th的{​​{1}}项。

通过在傅立叶项的轴上求和该数组,我应该获得在sin中的j项处求值的函数:

i_th

enter image description here

无论如何,红线应该基本上在蓝线的顶部。在我对X返回值的假设中或在我的特定实现中,出了点问题,但是我很难找到该错误。谁能说明我在这里做错了什么?

0 个答案:

没有答案