Python 如何使用scipy.fftpack(DST、DCT)计算光谱导数

Python 如何使用scipy.fftpack(DST、DCT)计算光谱导数,python,fft,trigonometry,Python,Fft,Trigonometry,scipy.fftpack包提供了大量与离散傅里叶变换相关的例程。我只需要使用DST(DCT)计算函数的一阶和二阶导数。但是,该包包含使用FFT返回第k个导数的diff例程 有人知道如何使用DST获得一阶和二阶导数吗?这是我的草稿: import numpy as np import matplotlib.pyplot as plt from scipy.fftpack import dst, idst, dct, idct L = 10 N = 100 a = 0.4 x =

scipy.fftpack包提供了大量与离散傅里叶变换相关的例程。我只需要使用DST(DCT)计算函数的一阶和二阶导数。但是,该包包含使用FFT返回第k个导数的diff例程

有人知道如何使用DST获得一阶和二阶导数吗?这是我的草稿:

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import dst, idst, dct, idct

L   = 10
N   = 100
a   = 0.4
x   = np.linspace(0,L,N)
# function
u   = np.sin(2*np.pi*x/L)*np.exp(-a*x)

# exact 1st derivative
du  = np.exp(-a*x)*(-a*np.sin(2*np.pi*x/L) + np.cos(2*np.pi*x/L)*2*np.pi/L)

# get 1st derivative
dufft = idst(-dct(u))

plt.figure()
plt.plot(x,u)
plt.plot(x,du)
plt.figure()
plt.plot(x,dufft)
plt.show()

dct(u)
将应用于信号
u
。第三类离散余弦变换与第二类离散余弦变换相反。对于缩放,它写道:

因此,即使在零附近,周期T的信号
u
也被写入周期T/j的余弦的加权和。在坐标x=(2i+1)T/4N处对值u[i]进行采样。因此,信号可以描述为:

其衍生产品为:

一旦在同一点取样,它看起来几乎像III型DST:

尽管如此,总和指数的变化仍需符合以下惯例:

下面是一个使用DCT II和IDST II计算偶偶信号奇偶导数的示例:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从scipy.fftpack导入dst、idst、dct、idct
N=100
x=np.linspace(0100,N)
u=np.linspace(0100,N)
hatu=dct(u,类型=2)
#乘以频率,减号
对于范围(N)中的i:
哈图[i]=-(i)*哈图[i]
#左移
hatu[0:N-1]=hatu[1:N]
hatu[N-1]=0。
#dst类型III,或同等IDST类型II。
dotu=idst(hatu,类型=2)
dotu=dotu/(2*N)
plt.图()
plt.plot(x,u,label='the function')
plt.plot(x,dotu,label='其导数')
plt.legend()
#plt.图()
#plt.绘图(x,dufft)
plt.show()
输入信号是一个斜坡,它展开为一个三角形周期信号(偶数符号)。因此,计算出的导数几乎是平的,它展开成方波

三角形信号中的高频被混叠到N以下的频率。计算导数会放大高频。因此,估计的导数受到一些高频振荡的困扰

如果输入信号被严重的白噪声破坏,则DFT/DST/DCT导数具有巨大的高频噪声。更糟糕的是,更高的导数会再次放大高频。为了避免这种不必要的行为,导数就像斜坡滤波器一样,可以组合到低通滤波器以衰减噪声。这是一种广泛使用的技术,与其他技术一样。请参阅不同过滤器的测试