我試圖記錄比賽自行車的聲音並分析錄製的音頻與FFT並找到引擎頻率。 如果我只吹口哨,一切正常,我可以看到一個清晰的圖形,它對應着我的呼嘯聲低和高,等等。我使用不同的顏色創建了一個熱圖,用於獲取頻率與時間的FFT的不同幅度。 音頻被記錄是這樣的:Android:麥克風音量級別(可能),自動增益,FFT,巴特沃斯,Audacity
private class RecordAudio extends AsyncTask<Void, float[], Void> {
@Override
protected Void doInBackground(Void... params) {
try {
int bufferSize = AudioRecord.getMinBufferSize(sampleRateMain,
channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.DEFAULT, sampleRateMain,
channelConfiguration, audioEncoding, bufferSize);
short[] buffer = new short[blockSize];
audioRecord.startRecording();
float[] audioData = new float[blockSize];
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String currentDateandTime = sdf.format(new Date());
BufferedWriter writer;
String pathtemp = Environment.getExternalStorageDirectory().getAbsolutePath();
String filename ="/"+currentDateandTime;
path = pathtemp +filename;
writer = new BufferedWriter (new FileWriter(path,false));
int i2=0;
while (started) {
if(i2==10){
datastructures tempdata = new datastructures();
i2=0;
audioRecord.read(buffer, 0, blockSize);
float sum = 0;
for (int i = 0; i < blockSize; i++) {
audioData[i] = (float) (buffer[i]);
writer.write(audioData[i]+" ");
if (audioData[i] <= 0) {
audioData[i] = audioData[i] * (-1);
}
sum = sum + audioData[i];
}
writer.newLine();
tempdata.freqsum = sum;
mainData.add(tempdata);
}
i2++;
}
writer.close();
}
catch(IOException e){
e.printStackTrace();
}
audioRecord.stop();
} catch (Throwable t) {
Log.e(TAG, "Audio recording Failed");
}
return null;
}
}
,所以我存儲在SD卡上的audiodata。爲了減少通過i2循環的數據並且僅在i2 = 0 ... 10中記錄一次; 在應用程序的下一部分中,我讓用戶剪下一部分音頻數據,並只將該部分加載到名爲trimmed的矢量中。 然後我做了這些頻率的FFT。但似乎只有數據過載。
記錄時是否可以觸發麥克風的自動增益?
我該如何將記錄和保存的audiodata加載到Audacity中? (我嘗試了不同的進口設置了原始數據,但它似乎沒有工作) Here is an example file
我實現了一個巴特沃斯濾波器,如果我得到這個權利過濾器應FFT之前被應用?
只是一個想法,是否足以在while(啓動)循環中觸發audiorecord.start audiorecord.stop以從麥克風獲得增益?沒有嘗試,我認爲這會導致速度問題。 – user1222353
回答我的評論:它太慢,不幸 – user1222353