FFT требует ~100 тактов на отсчёт, соответственно не жалко потратить ещё десяток тактов на отсчёт и сделать resampling, чтобы точек было всегда 512, ну или хотя бы просто нулями буфер дозабить по длине до 512 точек.
соответственно для 30 FFT * 512 точек * 100 тактов надо 1.5-2МГц, или 10мс при 168МГц.
если же надо именно ДПФ только для определённых частот, а для не всего спектра, можно Герцелем посчитать, почти без вычисления тригонометрии (там надо только один раз косинус посчитать для каждой частоты, а не для каждого отсчёта).
будет несколько тысяч тактов на отсчёт, но если надо только несколько частот, а не весь спектр, может быть быстрее чем через FFT
Код
float SpecPowerGoertzel(float * y, int num, float dt, float w){
const float K = 2.0 * cos(w * dt / num);
float s1 = 0, s2 = 0;
for (int i = 0; i < num; i++){
float s0 = y[i] + K * s1 - s2;
s2 = s1;
s1 = s0;
}
return (s2*s2 + s1*s1 - K * s1 * s2) / ((float)num * num);
}
только корень еще навеное взять надо и почему оно на длину выборки делилось, причём дважды, уже не вспомню.