【发布时间】:2013-12-27 11:57:18
【问题描述】:
我想对来自 pyaudio 的一些输入数据进行分段三次 Hermite 插值:
#input comes as string and is converted to int16
numpyData = numpy.fromstring(inData, dtype=numpy.int16)
#x positions of my y data
x = numpy.arange(len(numpyData))
#as i always want to interpolate to 4096 these are my indices
interpolationIndices = numpy.linspace(0, len(numpyData), num=4096, endpoint=False)
#my interpolator and print for testing
f = interpolate.PchipInterpolator(x, numpyData)
print f(interpolationIndices[0])
错误日志现在显示:
TypeError: array cannot be safely cast to required type
scipy.interpolate.PchipInterpolator 的文档说它应该是一个实数值数组,但我知道 int16 应该足够真实,而且我的 x-pos 数组也是单调排序的。
其他信息:
print numpyData
结果:
[3153 2362 5361 ..., 3206 -849 3241]
所以所有整数值都符合预期。
完整的跟踪:
Traceback (most recent call last):
File "/Users/myUser/Documents/workspace/myProject/AudioController.py", line 9, in callback
return self.file.getAudio(frame_count, scaleMethod()), pyaudio.paContinue
File "/Users/myUser/Documents/workspace/myProject/NewFileHandler.py", line 34, in getAudio
data = self.resample(data)
File "/Users/myUser/Documents/workspace/myProject/NewFileHandler.py", line 168, in resample
f = interpolate.PchipInterpolator(x, numpyData)
File "/Library/Python/2.7/site-packages/scipy/interpolate/polyint.py", line 932, in __init__
data[:,1] = PchipInterpolator._find_derivatives(xp, yp)
File "/Library/Python/2.7/site-packages/scipy/interpolate/polyint.py", line 982, in _find_derivatives
PchipInterpolator._edge_case(mk[0],dk[1], dk[0])
File "/Library/Python/2.7/site-packages/scipy/interpolate/polyint.py", line 947, in _edge_case
out[mask] = 1.0/(1.0/m0[mask]+1.0/d1[mask])
TypeError: array cannot be safely cast to required type
numpyData.dtype:
int16
numpy 版本:
print numpy.__version__
1.6.2
scipy 版本:
print scipy.__version__
0.13.2
【问题讨论】:
-
@alko 上面添加的附加信息。 pyaudio 将 int16 数据打包成字符串,然后通过 numpy 将其转换为可用数据。由于 numpyData 是普通的 int16,我认为这不应该导致问题。
标签: python numpy scipy interpolation type-conversion