2015-12-16 122 views
0

如何繪製麥克風的matplotlib輸入信號? 我試圖繪製plt.plot(框架),但幀是由於某種原因的字符串?如何使用matplotlib繪製pyaudio輸入?

a)爲什麼幀變量是一個字符串列表?

b)爲什麼數據變量字符串列表?

c)他們應該代表單個樣本的能量/幅度並且是整數嗎?

d)爲什麼數據長度爲2048時,我指定我想要塊大小1024?

(我猜是因爲我使用paInt16,但不能見猶它爲什麼不能成爲1024)

我爲麥克風輸入以下代碼:

import pyaudio 
import audioop 
import matplotlib.pyplot as plt 
import numpy as np 
from itertools import izip 
import wave 


FORMAT = pyaudio.paInt16    # We use 16bit format per sample 
CHANNELS = 1 
RATE = 44100 
CHUNK = 1024       # 1024bytes of data red from a buffer 
RECORD_SECONDS = 3 
WAVE_OUTPUT_FILENAME = "file.wav" 

audio = pyaudio.PyAudio() 

# start Recording 
stream = audio.open(format=FORMAT, 
        channels=CHANNELS, 
        rate=RATE, input=True, 
        frames_per_buffer=CHUNK) 

frames = [] 
for i in range(0, int(RATE/CHUNK * RECORD_SECONDS)): 
    data = stream.read(CHUNK) 
    frames.append(data) 
frames = ''.join(frames) 

stream.stop_stream() 
stream.close() 
audio.terminate() 
+0

你能用你的示例代碼包含你的導入語句嗎?此外,frames變量是一個字符串列表,因爲您將其聲明爲'frames =''.join(frames)'。你不需要那樣做,因爲你已經附加了你需要的所有幀,你有一個列表。 – Anonymous

+0

是的,我意識到這一點,但數據也是一個字符串。我認爲有一些需要完成的struct.unpack,但我不知道究竟是什麼。 –

+0

但你問爲什麼'frames'是一個字符串列表?無論如何,Stream.read()被_suppossed_返回一個字符串,如API文檔中所指定的: https://people.csail.mit.edu/hubert/pyaudio/docs/ – Anonymous

回答

2

一)爲什麼框架變量的字符串列表?

作爲b)的結果,這就是你如何在你的代碼中構建它。

b)爲什麼數據變量字符串列表?

它是一個字節字符串,它只是一個原始字節序列。這就是read()的回報。

c)他們應該代表單個樣本的能量/振幅,是整數嗎?

他們是。它們只是按字節序列打包,而不是Python整數。

d)爲什麼數據長度爲2048時,我指定我想要塊大小1024?

1024幀數。每個幀長度爲2個字節,因此您可以獲得2048個字節。

如何繪製麥克風的matplotlib輸入信號?我試圖用plt.plot(框架)進行繪圖,但是由於某種原因框架是一個字符串?

取決於你想要的情節。

fig = plt.figure() 
s = fig.add_subplot(111) 
amplitude = numpy.fromstring(frames, numpy.int16) 
s.plot(amplitude) 
fig.savefig('t.png') 

enter image description here

一個更有用的情節將是一個spectrogram

fig = plt.figure() 
s = fig.add_subplot(111) 
amplitude = numpy.fromstring(frames, numpy.int16) 
s.specgram(amplitude) 
fig.savefig('t.png') 

enter image description here

但只是原始幅度可以通過轉換字節串到numpy的陣列來獲得您可以根據需要修改振幅,現在您已有numpy陣列。

+0

爲什麼你必須聲明numpy有'dtype = int16'的數組? – Anonymous

+2

'numpy'不能從原始字節串中推導出哪種變量存儲在那裏,你必須明確指定它。由於數據讀取爲'pyaudio.paInt16',該字符串包含2字節有符號整數,這就是我告訴'numpy'讀取的內容。 – fjarri

+0

我明白了。我不是OP,我對音頻一無所知,但它是16位標準採樣大小,這意味着測量的強度值具有16位的精度?而且,「樣本」只是聲音的一個「單位」,其持續時間會產生一個離散的強度值? – Anonymous