通过python扩展/包装器传递浮点数组指针-SndObjlibrary

2024-09-29 22:19:24 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我觉得谷歌已经厌倦了在这方面帮我。在

到目前为止,我一直在尝试用SndObj库进行一些实验,更具体地说,是它的python包装器。在

这个库很好地包含了一个python示例,惟一的问题是如何让它正常工作。下面的最后一行给了我一个受伤的世界:

from sndobj import SndObj, SndRTIO, HarmTable, Oscili, SND_OUTPUT
from scipy import zeros, pi, sin, float32
import numpy

sine = numpy.array([256],float32)
for i in range(sine.size):
    sine[i] = 0.5 * sin((2 * pi * i) / sine.size)
    sine *= 32768

obj = SndObj()
obj.PushIn(sine,256)

在原始代码中是:

^{pr2}$

这给了我一个错误

TypeError: SndObj_PushIn() takes exactly 3 arguments (2 given)

好吧,很公平。我检查了(自动生成的)文档和web上的一些示例代码,发现它还需要一个整数size。说了又做了(我喜欢他们的方式,我猜至少是,示例中的过时代码)。在

总之,新参数;新错误:

TypeError: in method 'SndObj_PushIn', argument 2 of type 'float *'

我对c++一点经验都没有,我相信c++是这个库的“本机”语言(请原谅我没有合适的术语),但是我很确定我已经了解到它想要一个浮点数组/向量作为它的第二个参数(第一个参数是self)。然而,我很难做到这一点。我不是已经有一个浮点数组/向量了吗?我还尝试过在第一行使用float而不是float32,在第四行使用float(32768),但都没有效果。在

任何帮助,建议或建议将不胜感激!在

编辑: 对浮点向量/数组部分不太确定,再次转到自动文档:

int SndObj::PushIn  (   float *     vector,
int     size 
)

所以我认为至少c++需要一个float数组/向量,尽管我对python包装器的理解仍然是错误的。在

更新 根据Prune的请求(说错误消息不是要求浮点向量,而是说这是错误),我尝试输入不同的整数(intint32,等等)向量。但是,考虑到我仍然得到相同的错误消息,并记住上面的编辑,我认为它实际上应该是一个浮点向量。在

更新2 在saulspatz的一些提示之后,我改变了问题的标题和标签,以便更好地阐述我的问题。我也根据这个做了进一步的谷歌搜索,但还没有找到任何有用的东西。在

UDATE3已解决


Tags: 代码import示例参数size错误数组float
3条回答

我真的没有回答你的问题,但我有一些信息给你,这些信息太长了,不适合发表评论,我认为这些信息可能会有用。我查看了最新版本sndobj2.6.7的源代码。在SndObj.h中,PushIn的定义是

  int PushIn(float *in_vector, int size){
    for(int i = 0; i<size; i++){
      if(m_vecpos >= m_vecsize) m_vecpos = 0;
      m_output[m_vecpos++] = in_vector[i];
    }
    return m_vecpos;
  }

很明显,size是要推送的元素数。(我假设这是数组中的元素数,256是正确的。)float*表示指向float的指针;in_vector只是一个标识符。我读到错误消息的意思是,当函数期望一个指向float的指针时,它收到了一个float。在C++程序中,可以通过传递浮点数数组的名称传递一个指向浮点的指针,尽管这不是唯一的方法。

很抱歉,我不知道python扩展是如何编程的。在我看来,obj.PushIn(sine,256)看起来是对的,但这是一个天真的观点。

也许有了这些信息,你可以制定另一个问题(或者找到另一个标签),这将吸引那些知道在C/C++中编写Python扩展的人的注意。

我希望这有帮助。

实际上,问题恰恰相反:PushIn接受一个整数数组。错误消息是抱怨您给了它floats。试着用这个代替打电话给普欣

int_sine = numpy.array([256],int32)
int_sine = [int(x) for x in sine]

然后输入int_sine而不是sine到PushIn。

所以终于成功地让它工作起来了(在非常友好的包装作者的帮助下)!

原来在sandbox库中有一个floatArray类,用于将float数组传递给c++函数。我猜他们在婚礼之后也包括了-测试.py写的让我大吃一惊。

功能代码:

from sndobj import SndObj, SndRTIO, SND_OUTPUT, floatArray
from scipy import pi, sin

#                                      -
# Test PushIn

# Create 1 frame of a sine wave in a numpy array
sine = floatArray(256)
for i in range(256):
     sine[i] = float(32768*0.5 * sin((2 * pi * i) / 256))

obj = SndObj()
obj.PushIn(sine,256)

outp = SndRTIO(1, SND_OUTPUT)
outp.SetOutput(1, obj)

# Repeatedly output the 1 frame of sine wave
duration = outp.GetSr() * 2  # 2 seconds
i = 0
vector_size = outp.GetVectorSize()
while i < duration:
    outp.Write()
    i += vector_size

相关问题 更多 >

    热门问题