修改音频播放器/文件播放器/音频样本的数据并播放

时间:2019-09-06 08:25:03

标签: java processing minim

我试图修改音频文件(mp3或wav无关紧要),然后播放修改后的音频文件,首先我分析FFT的声音,然后得到保存在json文件中的不同值,现在我剪切/设置一些频率/幅度,然后我想进行逆FFT以获得数据以创建修改后的音频文件,但是我该如何做最后一部分?我如何将这个修改后的值数组设置为音频文件才能播放?我在下面提供我的代码,以了解我如何保存数据。

void rawDatas() {
 values = new JSONArray();
 jingle = minim.loadSample("myrecording.wav", 2048);
 leftChannel = jingle.getChannel(AudioSample.LEFT);
}

void fftDatas() {
 fftSize = 1024;
 fftSamples = new float[fftSize];
 FFT fft = new FFT( fftSize, jingle.sampleRate() );
 totalChunks = (leftChannel.length / fftSize) + 1;
 spectra = new float[totalChunks][fftSize/2];
 JSONArray arrayIndex = new JSONArray();
 JSONArray arrayVal = new JSONArray();
 JSONArray arrayValdB = new JSONArray();

 for (int chunkIdx = 0; chunkIdx < totalChunks; ++chunkIdx)
 {
  int chunkStartIndex = chunkIdx * fftSize;
  int chunkSize = min( leftChannel.length - chunkStartIndex, fftSize );
  System.arraycopy(leftChannel, chunkStartIndex, fftSamples, 0, chunkSize);

if ( chunkSize < fftSize )
{
  java.util.Arrays.fill( fftSamples, chunkSize, fftSamples.length - 1, 0.0 );
}

fft.forward(fftSamples);

fftValdB = new FloatList(); 
fftVal = new FloatList();

for (int i = 0; i < fft.specSize()-1; i++) {
  fftValdB.append(20*((float)Math.log10(fft.getBand(i))));
  fftVal.append(fft.getBand(i));
}

for (int i = 0; i < fftVal.size(); i++) {
  arrayIndex.append(i);
  arrayVal.append(fftVal.get(i));
  arrayValdB.append(fftValdB.get(i));
}
println(chunkIdx);
}

jingle.close();
//datas.setJSONArray("id", arrayIndex);
datas.setJSONArray("val", arrayVal);
datas.setJSONArray("valdB", arrayValdB);
saveJSONObject(datas, "data/fft.json");
//exit();
}

0 个答案:

没有答案