2013-05-01 144 views
0

我正在从事一项需要在程序中创建信号的项目,从头开始。信号存储在一个数组中,每个元素都是一个样本。它应该以44.1 kHz播放。由于该项目的其他方面,我正在使用pygame来实现这一点。 Pygame有一个功能,允许从一个numpy数组创建一个Sound对象,并将其播放为wav文件。初始化pygame.mixer时,我将频率设置为44100 Hz,但Sound对象正在播放大约10 kHz。pygame播放声音很慢

这是pygame中的一个错误,还是还有其他需要完成的操作来完成以给定速率播放数组吗?

def test_script(t): 
    bin_sig[0:8] = throttle(t) 
    bin_sig[8:28] = restofsignal() 
    bin_sig[28:32] = checksum(bin_sig) 

    print bin_sig 
    sig = create_audiosig(bin_sig)*60 

    pygame.mixer.init(44100,-16,1,2**16) 
    num_ary = numpy.array(sig) 
    plt.plot(num_ary) 
    plt.savefig('generated_signal.jpg') 

    if (sys.argv[1] == 'on'): 
     s = pygame.sndarray.make_sound(num_ary) 
     s.play() 

    plt.show() 

信号enter image description here

的返回的情节有以44.1KHz玩过长度6835. 60个脉冲,这应该采取9.3秒。但是,它需要37.2秒(11020 Hz)。

如果你需要看到更多的代码,你可以找到它here

回答

1

因为我已经解决了这个问题。但是,因为当我在论坛发帖时遇到与我一样的问题时,我所看到的只是“我已经解决了,感谢您的帮助,”我内心有些die,,我将发布答案。

当创建一个numpy数组时,显然它使用了一个64位数据类型的元素。创建声音对象时,它将使用init()(在本例中为16)期间指定的位数。当它从数组中读取数据类型时,它会为每个元素(64位元素中的4个16位值)读取4个值。为了解决这个问题,当调用numpy时指定dtype = numpy.dtype('int16')。数组()

numpy.array(sig, dtype=numpy.dtype('int16'))