В целях обучения возникла необходимость написать программу для студентов, для сравнения характеристик цифровых КИХ фильтров и какого-нибудь аналогового фильтра.
Пишу на java. Но трудности не в языке.
Вопрос в том, как получить реальные характеристики фильтра. Frequency response, step response и пр.
Алгоритм работы моей программы следующий:
1. Сгенерировать идеальную дискретную АЧХ.
2. Из АЧХ с помощью ifft получить коэффициенты фильтра.
3. Сгенерировать сигнал в виде суммы синусоид с заданными частотами.
4. Применить фильтра к сигналу, чтобы посмотреть форму сигнала на выходе.
5. Сделать fft сигнала до и после фильтра и посмотреть графики.
Возникает вопрос - как мне получить реальные характеристики фильта? Я пробовал сделать ifft коэффциентов и получил обратно идеальную характеристику фильтра (прямоугольное окно), что неудивительно.
Я же хочу увидеть вот такую картину.

Еще есть вопрос, если я генерирую коэффициенты с помощью ifft, а не через выведенную из аналитических преобразований формулу, то окно мне надо накладывать на дискретную АЧХ?
Есть еще пара вопросов, очень надеюсь на помощь, т.к. перечитал уже все что можно и все равно не знаю как сделать.
Попробовал сгенерировать коэффициенты с помощью формул, полученных через аналитическое преобразование, а потом сделать fft, получилась нужная мне картина.

Однако мне все же непонятно, как получить эту картину, если генерировать коэффициенты с помощью ifft.
Возможно я допустил какую-то ошибку при генерации дискретной АЧХ?

Ее я гененирую по заданной частоте среза.
Код
public static double[] getFreqResp(int N, long samplingFreq, long сutOffFreq) {
double[] output = new double[N];
long currentFreq;
for (int i = 0; i < N; i++) {
currentFreq = (samplingFreq/N)*i;
if ((currentFreq <= сutOffFreq) |
(currentFreq >= samplingFreq - сutOffFreq))
output[i] = 1.0;
else
output[i] = 0.0;
}
return output;
}
Я это делал по книжке Лайонса, может она все же должна быть симметричной относительно ноля оси частот?