首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Minim创建音频幅度数组

使用Minim创建音频幅度数组
EN

Stack Overflow用户
提问于 2016-01-26 11:05:44
回答 1查看 447关注 0票数 2

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

我遇到的问题是,我的功放made of floats充满了0.0;换句话说,它没有充满各种频率的振幅(尽管我对佐德音乐大加赞赏!)。

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

代码语言:javascript
复制
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。我相信人类能听到的最高声音是20 the (因此在for循环中的条件)。阵列应该每10 at有一个amp样本,因此amp7的amp值应该是70 at。我是否潜在地使用了错误的方法?我一直在阅读Minim here的文档,使用的是我正在使用的文档here的getFreq() FFT方法。

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-01-27 04:11:40

这是可行的。

MinimTest2:

代码语言:javascript
复制
    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();
   }


}

客户端(工作中):

代码语言:javascript
复制
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);
    }
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35006420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档