Phi*_*hil 9 python interpolation signal-processing generator matrix
我正在尝试为绘图目的插入一些数据.例如,给定N个数据点,我希望能够生成"平滑"图,由10*N左右的内插数据点组成.
我的方法是生成N×10*N矩阵并计算原始向量和我生成的矩阵的内积,得到1乘10*N向量.我已经计算出我想用于插值的数学运算,但我的代码非常慢.我对Python很陌生,所以我希望这里的一些专家可以给我一些关于如何加速我的代码的想法.
我认为问题的一部分是生成矩阵需要10*N ^ 2次调用以下函数:
def sinc(x):
import math
try:
return math.sin(math.pi * x) / (math.pi * x)
except ZeroDivisionError:
return 1.0
Run Code Online (Sandbox Code Playgroud)
(这来自采样理论.基本上,我试图从其样本中重新生成信号,并将其上采样到更高的频率.)
矩阵由以下生成:
def resampleMatrix(Tso, Tsf, o, f):
from numpy import array as npar
retval = []
for i in range(f):
retval.append([sinc((Tsf*i - Tso*j)/Tso) for j in range(o)])
return npar(retval)
Run Code Online (Sandbox Code Playgroud)
我正在考虑将任务分解成更小的部分因为我不喜欢坐在内存中的N ^ 2矩阵的想法.我可以将'resampleMatrix'变成一个生成器函数并逐行执行内部产品,但我不认为这会加速我的代码,直到我开始在内存中分页内容.
提前感谢您的建议!
这是上采样.有关示例解决方案,请参阅重新取样/上采样的帮助.
快速实现此目的(对于离线数据,如绘图应用程序)是使用FFT.这就是SciPy的原生resample()功能.但它假定是一个周期性信号,所以它并不完全相同.看到这个参考:
这是关于时域实信号插值的第二个问题,确实很重要.只有当原始x(n)序列在其全时间间隔内是周期性时,这种精确的插值算法才能提供正确的结果.
您的函数假定信号的样本在定义的范围之外都是0,因此这两种方法将偏离中心点.如果先用大量的零填充信号,它将产生非常接近的结果.在这里没有显示的情节边缘还有几个零:

对于重采样目的,立方插值不正确.这个例子是一个极端情况(接近采样频率),但正如你所看到的,三次插值甚至不是很接近.对于较低的频率,它应该非常准确.