2013-05-01 175 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'))