使用FFT获取频率分量

时间:2013-07-01 23:02:59

标签: java audio fft

所以我能够解决我的最后一个问题,但我已经发现了下一个问题。

所以我想制作一个简单的频谱图,但是为了做到这一点,我想了解FFT-libaries如何工作以及它们实际计算和返回的内容。 (FFT和信号处理是我有空的时候会遇到的第一个话题,但是现在,我只有时间在晚上进行一些编程练习。))

这里我总结了最重要的部分:

int framesPerSecond;
int samplesPerSecond;
int samplesPerCycle; // right now i want to refresh the spectogram every 

DoubleFFT_1D fft; 
WAVReader audioIn;

double audioL[], audioR[];
double fftL[], fftR[];

.....

framesPerSecond = 30;
audioIn= new WAVReader("Strobe.wav");
int samplesPerSecond = (int)audioIn.GetSampleRate();
samplesPerCycle = (int)(audioIn.GetSampleRate()/framesPerSecond);
audioL = new double[samplesPerCycle*2];
audioR = new double[samplesPerCycle*2];
fftL = new double[samplesPerCycle];
fftR = new double[samplesPerCycle];
for(int i = 0; i < samplesPerCycle; i++) { 
// don't even know why,... 
    fftL[i] = 0;
    fftR[i] = 0;
}
fft = new DoubleFFT_1D(samplesPerCycle);

.....

for(int i = 0; i < samplesPerCycle; i++) {
    audioIn.GetStereoSamples(temp);
    audioL[i]=temp[0];
    audioR[i]=temp[1];                        
}
fft.realForwardFull(audioL);  //still stereo
fft.realForwardFull(audioR);
System.out.println("Check");
for(int i = 0; i < samplesPerCycle; i++) { 
//storing the magnitude in the fftL/R arrays
    fftL[i] = Math.sqrt(audioL[2*i]*audioL[2*i] + audioL[2*i+1]*audioL[2*i+1]); 
    fftR[i] = Math.sqrt(audioR[2*i]*audioR[2*i] + audioR[2*i+1]*audioR[2*i+1]);
}

所以问题是,如果我想知道采样信号中有哪些频率,我该如何计算它们? (当我想打印fftL / fftR数组时,我会在数组的两端得到一些指数形式。)

Thx:)

1 个答案:

答案 0 :(得分:0)

所以我添加了Window功能,但没有任何改变。 (它有点好,但是你不能看到我认为某处存在问题。我只是发布我计算数组的部分以及打印它们的位置:

short temp[] = new short[2];
for(int i = 0; i < samplesPerCycle; i++) {
     audioIn.GetStereoSamples(temp);
     double multiplier = 0.5*(1 - Math.cos(2*Math.PI*i/(samplesPerCycle-1)));
     audioL[i]=multiplier*temp[0];
     audioR[i]=multiplier*temp[1];                        
}

fft.realForwardFull(audioL);
fft.realForwardFull(audioR);
for(int i = 0; i < samplesPerCycle; i++) {                        
    fftL[i] = Math.sqrt(audioL[2*i]*audioL[2*i] + audioL[2*i+1]*audioL[2*i+1]);
    fftR[i] = Math.sqrt(audioR[2*i]*audioR[2*i] + audioR[2*i+1]*audioR[2*i+1]);
    if(fftL[i] > maxValue) {
        maxValue = fftL[i]; 
    }
    if(fftR[i] > maxValue) {
        maxValue = fftR[i]; 
    }
}
repaint();

在这里我画它们

double dx = (double)this.getWidth()/samplesPerCycle;
for(int i = 0; i < samplesPerCycle; i++) {                            
    g.drawLine((int)(i*dx), this.getHeight(), (int)(i*dx),this.getHeight()-(int)((this.getHeight()*fftL[i])/maxValue));
}

这些是我得到的结果: http://www.pic-upload.de/view-19926382/FFTResult.jpg.html

我错过了重要的事情吗?