2013-07-01 4 views
0

, так что я смог решить мою последнюю проблему, но я уже окунулся в следующую.Получение частотных компонентов с FFT

Итак, я хочу сделать простой спектрограмм, но в другом случае я хочу понять, как работают FFT-библиотеки, и что они на самом деле вычисляют и возвращают. (БПФ и обработка сигналов - это тема номер 1, в которую я войду, как только у меня будет время, но прямо сейчас, у меня есть только время для некоторых упражнений по программированию вечером.))

Здесь я просто подвел итоги части:

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, я получаю некоторые экспоненциальный FORMES на обоих концах массива.)

Thx :)

+0

возможно дубликат [Как я могу получить DFT/FFT выходные частоты в Hertz?] (http://stackoverflow.com/questions/17390677/how-can-i-get-dft-fft-output-frequencies-in-hertz/17391353#17391353), [Как получить частоту от FFT result] (http://stackoverflow.com/questions/4364823/how-to-get-frequency-from-fft-result/4371627#4371627), * et al * ... –

+0

Я нашел из этих тем, но это не помогло. Я вообще в праве писать свои аудио-образцы в первых нескольких слотах массива, а затем получать RE и IM часть в местах 2i 2d + 1? (Я получаю что-то вроде показанного здесь, но я почему-то сомневаюсь, это то, что я хочу иметь. Http://cnx.org/content/m12554/latest/?collection=col10253/1.7) –

+0

Ну, вам нужна функция окна до БПФ, и вам нужно вычислить * величину * выхода FFT для первых N/2 бункеров, а затем найти пики. С какой частью вы испытываете трудности? –

ответ

0

Поэтому я добавил функцию окна, но ничего действительно меняется. (Это немного лучше, но, как вы не можете видеть, что я думаю, что есть проблема где-то я просто выкладываю части, где я вычисляю массивы и где я распечатать их:.

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

ли я пропустил что-то важное здесь

Смежные вопросы