實現思路:
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...