我在我的Android手机上录制了麦克风数据[1024]数据,通过实际数据的1D前向DFT(再设置1024位为0).我将数组保存到文本文件中,并重复了8次.
我收到了16384的结果.我在Excel中打开了文本文件并制作了一个图表以查看它的外观(x =数组索引,y =返回的数字大小).有大量的尖峰(正面和负面)大约在110,232左右,并且小尖峰继续以这种方式持续到1817年和1941年左右,尖峰再次变大,然后再次下降.
我的问题是,无论我在哪个主题上寻求帮助,它都会提到实数和虚数,我只有一维数组,我从Piotr Wendykier的类中使用的方法得到了回复:
DoubleFFT_1D.realForwardFull(audioDataArray); // from the library JTransforms.
Run Code Online (Sandbox Code Playgroud)
我的问题是:我需要对此数据做什么才能返回频率?录制的声音是我在吉他的底弦(第五音品)上演奏'A'(大约440Hz).
我有一个传递给读者的音频数据:
recorder.read(audioData,0,bufferSize);
Run Code Online (Sandbox Code Playgroud)
实例化如下:
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.
Run Code Online (Sandbox Code Playgroud)
我有一个我在网上找到的FFT课程和一个复杂的课程.我已经尝试了两天在线查看,但无法解决如何循环存储的值audioData并将其传递给FFT.
这是我正在使用的FFT类:http: //www.cs.princeton.edu/introcs/97data/FFT.java ,这是一个复杂的类:http://introcs.cs.princeton.edu /java/97data/Complex.java.html
之前,我问过使用FFT和Complex类获取频率wav音频的问题,
在那里,我需要从AudioRecord输入计算FFT值 - >从麦克风,我以某种方式设法获得FFT值...
现在我需要从之前保存的*.wav音频文件中计算FFT值,我将音频保存在我项目'res'文件夹内'raw'文件夹中
我仍然使用相同的FFT类:http://www.cs.princeton.edu/introcs/97data/FFT.java
与它一起使用的复杂类:http://introcs.cs.princeton.edu/java/97data/Complex.java.html
我使用这种方法从我的原始文件中读取音频文件,然后我调用方法calculateFFT来使用它
private static final int RECORDER_BPP = 16;
private static final int RECORDER_SAMPLERATE = 44100;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_STEREO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;
private void asli(){
int counter = 0;
int data;
InputStream inputStream = getResources().openRawResource(R.raw.b1);
DataInputStream dataInputStream = new DataInputStream(inputStream);
List<Integer> content = new ArrayList<Integer>();
try {
while ((data = dataInputStream.read()) != -1) {
content.add(data);
counter++; }
} …Run Code Online (Sandbox Code Playgroud) 我正在 android 中做声音分析器应用程序。我可以使用 AudioTrack Api 生成 18 khz 到 20 khz 的超声波。我可以使用 AudioRecord Api 录制音频。但我不知道如何计算麦克风输入数据的频率。我看到了多个问题如何从fft结果中获取频率?并使用 FFT 和 Complex 类获取频率 wav 音频它没有给出正确的频率。请帮助我。对不起,我的沟通。
这是我的频率计算代码
int bufferSizeInBytes = 1024;
short[] buffer = new short[bufferSizeInBytes];
class Recording extends Thread {
@Override
public void run() {
while (true) {
bufferReadResult = audioInput.read(buffer, 0, bufferSizeInBytes); // record data from mic into buffer
if(bufferReadResult > 0){
calculate();
}
}
}
public void calculate() {
DoubleFFT_1D fft1d = new DoubleFFT_1D(bufferSizeInBytes);//using JTransforms lib
double[] fftBuffer …Run Code Online (Sandbox Code Playgroud)