如何使用FFT从PCM获取频率数据
我有一个传递给读者的音频数据:
recorder.read(audioData,0,bufferSize);
实例化如下:
AudioRecord recorder; short[] audioData; int bufferSize; int samplerate = 8000; //get the buffer size to use with this audio record bufferSize = AudioRecord.getMinBufferSize(samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT)*3; //instantiate the AudioRecorder recorder = new AudioRecord(AudioSource.MIC,samplerate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize); recording = true; //variable to use start or stop recording audioData = new short [bufferSize]; //short array that pcm data is put into.
我有一个我在网上找到的FFT课程和一个复杂的课程。 我已经尝试了两天在线查看,但audioData
如何循环存储在audioData
的值并将其传递给FFT。
这是我正在使用的FFT类: http : //www.cs.princeton.edu/introcs/97data/FFT.java ,这是一个复杂的类: http : //introcs.cs.princeton.edu /java/97data/Complex.java.html
假设audioData
数组包含原始音频数据,您需要从audioData
数组创建一个Complex[]
对象,如下audioData
:
Complex[] complexData = new Complex[audioData.length]; for (int i = 0; i < complexData.length; i++) { complextData[i] = new Complex(audioData[i], 0); }
现在,您可以将complexData
对象作为参数传递给FFT函数:
Complex[] fftResult = FFT.fft(complexData);
一些细节将取决于您的FFT的目的。
所需FFT的长度取决于您在分析中所希望的频率分辨率和时间精度(它们是反向相关的),其可能是也可能不是音频输入缓冲器长度附近的任何位置。 鉴于长度的差异,您可能必须组合多个缓冲区,分段单个缓冲区或两者的某种组合,以获得满足分析要求的FFT窗口长度。
PCM是编码数据的技术。 与使用FFT获取音频数据的频率分析无关。 如果使用Java解码PCM编码数据,您将获得原始音频数据,然后可以将其传递到FFT库。
- Android Xml属性android:onClick =“…”如何在幕后工作?
- android.view.ViewRoot $ CalledFromWrongThreadException:
- 错误:java.lang.ClassNotFoundException:未找到类org.openjdk.jdi.ReferenceType
- 如何在Android中解析“yyyy-MM-dd’T’HH:mm:ss.SSSXXX”日期格式到简单?
- Android – 将ImageView设置为URL
- android将3位图保存为1
- 我们可以为所有屏幕尺寸制作一种布局类型
- 检查Android中的Typeface对象的系列
- 在使用多个dex文件时,是否有必要将同一个包的类保留在同一个dex中