2

我正在开发一个基于 Minim 的音频可视化项目。对于这个项目的一部分,我需要一个频率放大器阵列(我将使用这个阵列来确定监视器条的高度)。我以前从未使用过 Minim,所以我提前为我对这个主题的有限知识道歉。音频源是来自我的 PC 的任何输出声音的虚拟音频电缆的输入。

我遇到的问题是我的 amp[] (由浮点数制成)充满了 0.0 ;换句话说,它并没有充满各种频率的幅度(尽管我对 Zedd 音乐的爆破!)。

这是我的代码(用 Eclipse 编写):

import processing.core.*;
import java.awt.*;
import ddf.minim.signals.*;
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;

public class MinimTest2 extends PApplet {

Minim minim;
FFT fft;
AudioInput in;
float[] amp = new float[2000];

public void settings() {
  size(800, 600);
}

   public MinimTest2()
  {
   minim = new Minim(this);
   in = minim.getLineIn(Minim.STEREO, 2048); 
   fft = new FFT(in.bufferSize(), in.sampleRate()); 
   fft.logAverages(30, 5); 
  }

   public float[] getAmps(){
    int index = 0;
    for (int k=0; k<20000; k+=10){
        amp[index]=fft.getFreq(k);
        index++;
    }
    return amp;
   }

}

当客户端类调用/打印 getAmps() 时,会打印 0.0。我相信人类能听到的最高声音是 20kHz(因此是 for 循环中的条件)。数组应该每 10Hz 有一次 amp 采样,所以 amp[7] 的 amp 值应该是 70Hz。我可能使用了错误的方法吗?我一直在这里阅读 Minim 的文档,这里记录我使用的 getFreq() FFT 方法。

感谢您的耐心和指导!这是我第一次遇到堆栈溢出。

更新!我现在有一个工作的音频可视化器(至少,当你拖动鼠标时(当我处理其他部分时占位符)。请参阅代码的答案。

4

1 回答 1

0

这行得通。

最小测试2:

    import processing.core.*;
    import java.awt.*;
    import ddf.minim.signals.*;
    import ddf.minim.*;
    import ddf.minim.analysis.*;
    import ddf.minim.effects.*;

public class MinimTest2 extends PApplet {

Minim minim;
FFT fft;
AudioInput in;
float[] amp = new float[430];
float[] temp;

public void settings() {
      size(800, 600);
    }

   public MinimTest2()
  {
       minim = new Minim(this);
       in = minim.getLineIn();                    
       fft = new FFT(in.bufferSize(), in.sampleRate());               
  }

   public float[] getAmps(){
        fft.forward(in.left);
        amp = new float[430];
        temp = new float[fft.specSize()];
        int index = 0;
        for (int k=0; k<fft.specSize(); k++){
            temp[index]=fft.getBand(k);
            index++;
        }
        for (int i=0; i<amp.length; i++)
                amp[i]=temp[i];
        return amp;
   }
   public int getFFTSize(){
       return fft.specSize();
   }


}

客户(进行中):

import objectdraw.*;
import java.awt.*;

public class Client extends WindowController{
    MinimTest2 listener = new MinimTest2();
    float[] amps = new float[430];
    FilledRect[] bars = new FilledRect[430];

    public void begin(){
        resize(430,430);
            System.out.println(canvas.getWidth());
        System.out.println(canvas.getHeight());
}

public void onMouseDrag(Location point){
    canvas.clear();
    graphAmps();
    listAmps();
}

public void ampUp(){
    amps=listener.getAmps();
}

public void listAmps(){
    ampUp();
    for (int k=0; k<amps.length; k++)
        System.out.println(amps[k]);
}

public void graphAmps(){
    ampUp();
    double xPos =0;
    double rectWidth = canvas.getWidth()/430;
    for (int k=0; k<430; k++){
        bars[k] = new FilledRect (xPos, (canvas.getHeight()-(amps[k])*5) , rectWidth, (amps[k])*5, canvas);
        xPos+=rectWidth;
        bars[k].setColor(Color.BLUE);
    }
}

}

于 2016-01-26T20:11:39.510 回答