Tôi có tệp âm thanh (.3gp) và khoảng ~ 1 phút. Tôi muốn nhận được tần số của tập tin âm thanh này trong mỗi 1/4 giây. Ý tưởng của tôi là nhận mẫu trong mỗi 1/4 giây từ tệp âm thanh và sử dụng FFT tôi có thể nhận được các giá trị tần số. Có cách nào để làm điều này không?Nhận tần suất của một tệp âm thanh trong mỗi 1/4 giây trong android
Thực ra tôi sẽ chia tệp âm thanh thành các tệp âm thanh mẫu 1/4sec (alwyas ghi đè lên tập tin âm thanh), sau đó sử dụng thuật toán FFT và phát hiện tần suất mà magintude là bigggest. Nhưng có thể có các giải pháp dễ dàng hơn tuy nhiên tôi không có một đầu mối làm thế nào để làm điều này hoặc.
*** UPDATE 2 - mã mới
tôi sử dụng mã này cho đến nay:
public class RecordAudio extends AsyncTask<Void, double[], Void> {
@Override
protected Void doInBackground(Void... arg0) {
try {
int bufferSize = AudioRecord.getMinBufferSize(frequency,
AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
//int bufferSize = AudioRecord.getMinBufferSize(frequency,
// channelConfiguration, audioEncoding);
AudioRecord audioRecord = new AudioRecord(
MediaRecorder.AudioSource.MIC, frequency,
channelConfiguration, audioEncoding, bufferSize);
short[] buffer = new short[blockSize];
//double[] toTransform = new double[blockSize];
audioRecord.startRecording();
// started = true; hopes this should true before calling
// following while loop
while (started) {
sampling++;
double[] re = new double[blockSize];
double[] im = new double[blockSize];
double[] newArray = new double[blockSize*2];
double[] magns = new double[blockSize];
double MaxMagn=0;
double pitch = 0;
int bufferReadResult = audioRecord.read(buffer, 0,
blockSize);
for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
re[i] = (double) buffer[i]/32768.0; // signed 16bit
im[i] = 0;
}
newArray = FFTbase.fft(re, im,true);
for (int i = 0; i < newArray.length; i+=2) {
re[i/2]=newArray[i];
im[i/2]=newArray[i+1];
magns[i/2] = Math.sqrt(re[i/2]*re[i/2]+im[i/2]*im[i/2]);
}
// I only need the first half
for (int i = 0; i < (magns.length)/2; i++) {
if (magns[i]>MaxMagn)
{
MaxMagn = magns[i];
pitch=i;
}
}
if (sampling > 50) {
Log.i("pitch and magnitude", "" + MaxMagn + " " + pitch*15.625f);
sampling=0;
MaxMagn=0;pitch=0;
}
}
audioRecord.stop();
} catch (Throwable t) {
t.printStackTrace();
Log.e("AudioRecord", "Recording Failed");
}
return null;
}
tôi sử dụng này: http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29
chuỗi Guitar vẻ đúng, nhưng âm thanh của riêng tôi không phải là tốt vì điều này:
Độ lớn của hai đỉnh thay đổi phần lớn thời gian và tôi luôn tìm ra mức lớn nhất để có được tần số cơ bản.
Xin chào, tôi có cùng một sự cố, tôi cần ghi lại thời gian thực thoại và tính tần suất trong mỗi 4ms, bạn đã đạt được điều này như thế nào? Bất kỳ mã mẫu nào với bạn? –
Xin chào, tôi đã không thành công để vượt qua vấn đề tuy nhiên âm thanh guitar của tôi là thích hợp 9 trên 10, nhưng giọng nói của tôi có thể là 7 trong số 10 .. –