में प्रत्येक 1/4 सेकंड में ऑडियो फ़ाइल की आवृत्ति प्राप्त करें मेरे पास एक ध्वनि फ़ाइल (.3 जीपी) है और इसकी लगभग ~ 1 मिनट है। मैं हर 1/4 सेकंड में इस ध्वनि फ़ाइल की आवृत्ति प्राप्त करना चाहता हूं। मेरा विचार ऑडियो फ़ाइल से प्रत्येक 1/4 सेकंड में नमूने प्राप्त करना और एफएफटी I का उपयोग करना आवृत्ति मान प्राप्त हो सकता है। क्या इसे करने का कोई तरीका है?एंड्रॉइड
दरअसल मैं ध्वनि फ़ाइल को 1/4sec नमूने ध्वनि फ़ाइलों (अलवीस को पूर्ववत ओवरराइटिंग) में विभाजित करता हूं, फिर एफएफटी एल्गोरिदम का उपयोग करके आवृत्ति का पता लगाता हूं जहां मैग्निट्यूड सबसे बड़ा है। लेकिन आसान समाधान हो सकते हैं हालांकि मुझे कोई संकेत नहीं है कि यह कैसे करें।
*** अद्यतन 2 - नए कोड
मैं इस कोड अब तक का उपयोग करें:
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;
}
मैं इस का उपयोग करें: http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29
गिटार तार सही लगते हैं, लेकिन अपने ही ध्वनि नहीं है इस वजह से अच्छा:
दो चोटियों की परिमाण ज्यादातर समय बदलती है और मुझे मौलिक आवृत्ति प्राप्त करने के लिए हमेशा सबसे बड़ी मिलती है।
हाय, मुझे एक ही समस्या है, मुझे ध्वनि वास्तविक समय रिकॉर्ड करने और हर 4ms में आवृत्ति की गणना करने की आवश्यकता है, आपने इसे कैसे प्राप्त किया? आपके साथ कोई नमूना कोड? –
हाय, मैं समस्या से निपटने में सफल नहीं हुआ, हालांकि मेरी गिटार की आवाज 10 में से 9 थी, लेकिन मेरी आवाज शायद 10 में से 7 थी .. –