Я потратил довольно много времени на изучение БПФ. Мне особенно интересно использовать KISSFFT, потому что это очень переносимая реализация C.
Мне все еще очень неясно, как превратить i[x] и r[x] в амплитуду частотного бина. Поэтому создал подписанную версию sin 16 int. У меня есть 512 образцов моей синусоидальной волны. Я ожидал увидеть один Bin с данными, а остальные — с нулями. Не так...
Вот мой код...
- (IBAction)testFFT:(id)sender{
NSLog(@"testFFT");
static double xAxis = 0;
static int sampleCount = 0;
static double pieSteps;
static double fullSinWave = 3.14159265*2;
static double sampleRate = 44100;
static double wantedHz = 0;
int octiveOffset;
char * globalString = stringToSend;
SInt16 dataStream[512];
// Notes: ioData contains buffers (may be more than one!)
// Fill them up as much as you can. Remember to set the size value in each buffer to match how
// much data is in the buffer.
for (int j = 0; j < 512; j++) {
wantedHz = 1000;
pieSteps = fullSinWave/(sampleRate/wantedHz);
xAxis += pieSteps;
dataStream[j] = (SInt16)(sin(xAxis) * 32768.0);
NSLog(@"%d) %d", j, dataStream[j]);
}
kiss_fft_cfg mycfg = kiss_fft_alloc(512,0,NULL,NULL);
kiss_fft_cpx* in_buf = malloc(sizeof(kiss_fft_cpx)*512);
kiss_fft_cpx* out_buf = malloc(sizeof(kiss_fft_cpx)*512);
for (int i = 0;i < 512;i++){
in_buf[i].r = dataStream[i];
in_buf[i].i = dataStream[i];
}
kiss_fft(mycfg,in_buf, out_buf);
for (int i = 0;i < 256;i++){
ix = out_buf[i].i;
rx = out_buf[i].r;
printfbar(sqrt(ix*ix+rx*rx)););
}
}
Я получаю результаты, которые выглядят так....
***** ********************* **************************** ********************* ************************ ********************* **************************** ********************* ***** ********************* **************************** ********************* ***************** ********************* **************************** ********************* ***** ********************* **************************** ********************* ************************ ********************* **************************** *********************
Read the FAQs
3) Если вы видите хорошие вопросы и ответы, проголосуйте за нихusing the gray triangles
, так как доверие к системе основано на репутации, которую пользователи получают, делясь знаниями. Также не забудьте принять ответ, который лучше решает вашу проблему,by pressing the checkmark sign
- person Dr. belisarius   schedule 02.06.2011