Версия языка Common LISP:
(defun ! (n) (reduce #'* (loop for i from 2 below (+ n 1) collect i)))
, Кажется, довольно быстр.
* (! 42)
1405006117752879898543142606244511569936384000000000
Простейший вариант - это фильтр "оконного sinc":
fs = 44100;
cutoff = 250;
t = -256:256; % This will be a 513-tap filter
r = 2*cutoff/fs;
B = sinc(r*t).*r .* blackman(length(t))';
freqz(B);
Длина фильтра (см. t = ...
) управляет шириной полосы перехода. . пороговое значение
в данном случае составляет -6 дБ. blackman
- это имя популярного окна. Вы можете проверить эту страницу Википедии для получения дополнительной информации об оконных функциях. В основном они имеют разные компромиссы между шириной полосы перехода и подавлением полосы задерживания.
Если вам не нужна другая форма амплитудного спектра, сделайте точно так, как предлагал Сэллибитце, только замените функцию sinc действительной частью обратного преобразования Фурье желаемой амплитудной характеристики ( с задержкой для получения причинно-следственной симметричной импульсной характеристики).