我正在做一个基于Minim的音频可视化项目。对于这个项目的一部分,我需要一个频率放大器数组(我将使用这个数组来确定监视器条的高度)。我以前从来没有使用过Minim,所以我为我在这个主题上的有限知识提前道歉。音频源是来自虚拟音频电缆的输入,它从我的PC返回任何输出声音。
我遇到的问题是,我的功放made of floats充满了0.0;换句话说,它没有充满各种频率的振幅(尽管我对佐德音乐大加赞赏!)。
下面是我的代码(用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。我相信人类能听到的最高声音是20 the (因此在for循环中的条件)。阵列应该每10 at有一个amp样本,因此amp7的amp值应该是70 at。我是否潜在地使用了错误的方法?我一直在阅读Minim here的文档,使用的是我正在使用的文档here的getFreq() FFT方法。
感谢您的耐心和指导!这是我第一次使用堆栈溢出。
更新!我现在有一个可以正常工作的音频可视化工具(至少,当你拖动鼠标时(占位符,而我正在处理其他部分))。有关代码,请参阅答案。
发布于 2016-01-27 04:11:40
这是可行的。
MinimTest2:
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);
}
}}
https://stackoverflow.com/questions/35006420
复制相似问题