Как я могу установить диапазон частот для моего массива от KissFFT? Частота дискретизации составляет 44100, и мне нужно установить ее в свой массив realPartFFT. Понятия не имею, как это работает. Мне нужно построить график спектра, чтобы увидеть, правильно ли он рассчитывает. Когда я сейчас это делаю, у него все еще есть только 513 чисел на оси x без указанной частоты.
int windowCount = 1024;
float floatArray[windowCount], realPartFFT[(windowCount / 2) + 1];
kiss_fftr_cfg cfg = kiss_fftr_alloc(windowCount, 0, NULL, NULL);
kiss_fft_cpx cpx[(windowCount / 2) + 1];
kiss_fftr(cfg, floatArray, cpx);
for (int i = 0; i < (windowCount / 2) + 1; ++)
realPartFFT[i] = sqrtf(powf(cpx[i].r, 2.0) + powf(cpx[i].i, 2.0));
Прежде всего: KissFFT ничего не знает об источнике данных. Вы передаете ему массив вещественных чисел заданного размера N, и вы получаете взамен массив комплексных значений размера N/2+1
, Входной массив может быть прогнозом следующих N часов количества солнечных пятен за последние N дней. KissFFT не волнует.
Отображение обратно в реальный мир должно быть сделано вами, поэтому вы должны интерпретировать данные. Что касается фрагмента кода, вы передаете 1024 с плавающей запятой (я предполагаю, что floatArray
содержит входные данные). Затем вы получите массив из 513 (= 1024/2 + 1) пар чисел с плавающей точкой.
Если вы производите выборку с частотой 44,1 кГц и пропускаете фрагменты KissFFT из 1024 сэмплов (размер вашего окна), вы получите наивысшую частоту 22,05 кГц и наименьшую частоту около 43 Гц (44 100/1024). Вы можете стать еще ниже, передав большие куски в KissFFT, но имейте в виду, что время обработки будет расти (с четвертой степенью N, IIRC)!
Кстати: вы можете рассмотреть возможность сделать ваш windowSize
переменная const
, чтобы позволить компилятору сделать некоторые оптимизации. Оптимизации очень важны при обработке чисел. В этом случае эффект может быть незначительным, но это хорошая отправная точка.
Других решений пока нет …