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