Android中實時獲取聲音頻率

2021-06-26 12:15:41 字數 1071 閱讀 5666

實現思路:

1. 通過audiorecord類讀取mic傳入的資料

2. 對讀取的資料進行快速傅利葉變換

3. 計算出進過計算後的複數的模即為需要的頻率

第一步很好實現,new 乙個audiorecord即可實現讀取mic的輸入,簡略版**如下:

audiorecord audiorecord = new audiorecord(mediarecorder.audiosource.mic,

samplerate, audioformat.channel_configuration_mono,

audioformat.encoding_pcm_16 bit, samplerate * 6);

audiorecord.startrecording();

byte bufferread = new byte[read_buffersize];

while (audiorecord.read(bufferread, 0, read_buffersize) > 0)

這裡的samplerate取的是44100,stackoverflow上說audiorecord的引數根據不同的機器可能不同,這一點通過遍歷可能的引數新建audiorecord類,具體可以參見stackoverflow上的這個問答。

bufferread為讀取資料儲存的容器。

currentfrequency即為通過快速傅利葉變換計算出的聲音頻率。

processsampledate為呼叫的本地方法,因為已經有人用c實現了快速傅利葉變換,通過傳入引數即可計算出聲音的頻率。

當然,在使用mic讀取資料之前需要加上相應的許可權。

關於 android如何通過ndk編譯c語言的教程網上也有很多,在linux下很方便,在windows上就比較麻煩了,需要通過安裝cygwin模擬linux的環境,呼叫gcc編譯檔案。

這篇 部落格的教程

講得還是很詳細的,建議沒有用過ndk的可以參考一下。

這樣就能計算出實時的聲音頻率了。

所有這個過程的原始碼都可以在我的

github

上面找到,如有任何問題歡迎**。

Android 實時採集聲音的頻率和大小

注 筆者本不是專業人士,通過查了幾篇資料和請教軟體部門的同學搭的demo 如有不正確之處,請及時指出 1.原理 聲音大小省略,網上可以很好搜到 使用audiorecord類採集聲音資訊,通過傅利葉轉換,獲取聲音的頻率 2.audiorecord類說明 param audiosource 採集聲音源 ...

Android中SoundPool放聲音

1 建立乙個soundpool物件 new soundpool int maxstreams,int streamtype,int srcquality 第乙個引數為soundpool可以支援的聲音數量,這決定了android為其開設多大的緩衝區,第二個引數為聲音型別,最後引數為聲音品質,品質越高,...

從聲音中獲取號碼

前天吃飯時看報紙,偶看到一篇新聞 聽音破密碼 盜走卡上99800元 讓我想起了以前看的一本書,上面是有介紹的,書名叫,是matlab它爸寫的.其中有很多好玩的,就包括分析 聲音的.開啟matlab,ncmgui就可以了.其中的touchtone就是關於 按鍵的.按鍵的聲音主要是從7個基頻率得到的.f...