fk0, легенда (26.05.2013 13:58, просмотров: 271) ответил йцукен на Да не так страшен этот чёрт. Берём массив длиной 4N, набиваем отсчётами АЦП с частотой 4F, умножаем на синус { 0, 1, 0, -1 } и косинус { 1, 0, -1, 0 }, берём корень из суммы квадратов. Чем больше N, тем лучше избирательность по частоте, но тем
Это алгоритм имени АОНа. В нём смысл для 8-битников без аппаратнонго умножения. Иначе можно не изобретать велосипед, а тупо умножать на синусы и косинусы, как написано в статье "Дискретное преобразование Фурье" в википедии. Будет сильно лучше (ибо квадратные тригонометрические функции +-1 в сумму квадратов наберут и гармоник, как я понимаю). Считать желательно для отрезка времени в который целое число периодов укладывается. Впрочем, при наличии умножения за 1 такт можно ещё таблицу для оконной функции завести. Поскольку и таблица синусов/косинусов и оконной функции перебирается при работе последовательно (оконной функции строго последовательно, синус/косинус возможно с шагом, зависящим от частоты), то можно сильно сэкономить и не хранить всё как есть, а хранить только разности между двумя соседними значениями (они максимум 2-3-4 бита занимают), а начальное значение известно (sin=0, cos=1, window=0) и, возможно, использовать алгоритм вроде ADPCM для кодирования разностей (это если 16-битная точность нужна, что вряд ли). Это даже будет короче и быстрей, чем извращения с хранением 1/4 таблицы синусов и т.п. Хотя сейчас объёмы памяти такие, что можно всё в открытом виде хотя бы в ОЗУ держать (а в ПЗУ упакованно, как я сказал).
[ZX]