Цитата(Waso @ Jan 5 2012, 21:16)

Буфер - это пожалуйста. 20мс - это уйма времени чтоб сделать первое БПФ, а вот как потом его заставить скользить по буферу и делать вычисления не более чем за 0.5мс... Существуют ли оптимальные алгоритмы для такого скользящего по буферу БПФ?
Если шаг скольжения мелкий, как у вас - 0.5мс, то вместо БПФ возьмите обычное ДПФ, оно хорошо оптимизируется под скольжение. (в гугле - sliding dft). Я делал скользящий вариант ДПФ по приходу одного сэмпла, что естественно быстрее чем любое скользящее БПФ. Могу поискать ссылку на метод, объяснение на пальцах: каждая палка в спектре получается перемножением сигнала на синусоиду определённой частоты. То есть i-тая амплитуда это просто сумма A[i]=SUM( Sample[j]*Cos(i,j) ) по всем сэмплам j. По приходу сэмпла мы можем прибавить к палке число A[i]:=A[i]+Sample[Now]*Cos(i,j) и вычесть самое "старое" слагаемое A[i]:=A[i]+Sample[Now-128]*Cos(i,j). Так как старое произведение можно хранить в памяти, то на каждый сэмпл для каждой частоты только одно умножение по COS-компоненте. По второй компоненте так же. А дальше как для фурье - корни из сумм квадратов.
Если мелкий шаг не нужен, то можно целыми блоками. Будет быстро, но при росте размера блока алгоритм скользящего ДПФ станет в итоге медленнее, чем скользящего БПФ.