こんにちは、後で分析するために、マイク経由で録音されたオーディオ ストリームを int (または float など) の配列に変換したいと考えています (fft など)。しかし、私の現在の方法は少し非効率的で、メモリ割り当ての遅延が散発的に発生していると思います。
ossaudiodev はほとんどの Linux ディストリビューションで動作しなくなったため、alsaaudio を使用していますが、それほど重要ではありません。デバイスから出力されるオーディオ ストリームは、1024 個の 16 ビット オーディオ フレームに対応する 2048 文字の文字列です。「配列」が文字列をintの配列に変換する最良の方法であると考えましたが、各ループの最後に、次のラウンドのデータのために配列をクリアする必要がdel
あり、時間を見るとループ内部が実行されるのに時間がかかります(読み取りは含まれません)4番目または5番目(散発的)のループごとにはるかに時間がかかることがわかります。私の質問は、メモリ割り当てに関して私の現在の戦略は効率的ですか?
オーディオ デバイスは次のように設定されています。
import array
import alsaaudio as alsa
audio_data = array.array("h")
ain = alsa.PCM(alsa.PCM_CAPTURE,alsa.PCM_NORMAL,card='default')
ain.setchannels(1)
ain.setrate(rate)
ain.setformat(alsa.PCM_FORMAT_S16_LE)
ain.setperiodsize(1024)
次に、ループ内でこれを行います
Nsamples,astream = ain.read()
audio_data.fromstring(astream)
## some analysis is done (FFT, plot whatever)
# i.e.
Freq = np.abs(sy.fft(audio_data))
# clear the audio data array for next segment
del audio_data[:]