Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FIR frequency response
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Boris_B
В целях обучения возникла необходимость написать программу для студентов, для сравнения характеристик цифровых КИХ фильтров и какого-нибудь аналогового фильтра.
Пишу на 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;
    }


Я это делал по книжке Лайонса, может она все же должна быть симметричной относительно ноля оси частот?
thermit
Частотные характеристики вычисляются через z-преобразование, путем замены z на exp(j*omega).
V_G
Вы генерируете "идеальную" дискретную АЧХ, и при ifft импульсной характеристики естественно получаете ее же, т.к. импульсная и частотная характеристика связаны через ДПФ.
Если хотите выяснить, что представляет из себя ЧХ вашего фильтра между заданными точками, дополните импульсную характеристику нулями и сделайте ifft.
Если задать ЧХ более часто, получите более длинную ИХ. В пределе это бесконечная функция sin(x)/x. Именно поэтому идеальный фильтр нереализуем: его ИХ продолжается до бесконечности как в прямую, так и в обратную стороны.
Boris_B
Цитата(thermit @ Apr 2 2013, 17:03) *
Частотные характеристики вычисляются через z-преобразование, путем замены z на exp(j*omega).

К сожалению, ничего пока не читал про z преобразование. Но спасибо, надеюсь, разберусь.
А как правильно наложить окно, если вычислять коэффициенты через ifft?

2 V_G Насчет идеальной АЧХ - это я, как и написал, мне неудивительно. Удивительно было, что ни в одной книге не нашел, как же получить реальные характеристики фильтра, рассчитанного этим методом.

Цитата(thermit @ Apr 2 2013, 17:03) *
Частотные характеристики вычисляются через z-преобразование, путем замены z на exp(j*omega).

Почитал про z-преобрвазование на википедии. Свертку на джаве сделать смогу. Не очень понятнно только что вместо j подставлять в формулу? На джаве мниной единицы нет. Но есть написанный отдельно класс Complex.
Правильно ли понимаю, что мне тогда надо написать метод exp возводящий комплексное число в степень а в качестве j использовать комплексное число с реальной частью равной 0 и мнимой равной 1? А потом возводить его с помощью этого метода в степень?
thermit
Цитата
Boris_B:
Почитал про z-преобрвазование на википедии. Свертку на джаве сделать смогу. Не очень понятнно только что вместо j подставлять в формулу? На джаве мниной единицы нет. Но есть написанный отдельно класс Complex.
Правильно ли понимаю, что мне тогда надо написать метод exp возводящий комплексное число в степень а в качестве j использовать комплексное число с реальной частью равной 0 и мнимой равной 1? А потом возводить его с помощью этого метода в степень?


exp(j*omega) = cos(omega)+j*sin(omega). Возведение в степень - умножение omega на эту степень.

Вообще говоря, если b[k] - к-ты ких фильтра,

H(omega)=sum(b[k]*cos(k*omega)) - j*sum(b[k]*sin(k*omega)) k = 0 ... N-1
АЧХ - модуль (корень из суммы квадратов)
Boris_B
Цитата(thermit @ Apr 2 2013, 17:51) *
exp(j*omega) = cos(omega)+j*sin(omega). Возведение в степень - умножение omega на эту степень.

Вообще говоря, если b[k] - к-ты ких фильтра,

H(omega)=sum(b[k]*cos(k*omega)) - j*sum(b[k]*sin(k*omega)) k = 0 ... N-1
АЧХ - модуль (корень из суммы квадратов)

Так это вы мне формулу ДПФ написали же, не?
Если я его выполню, то опять получу идеальную характеристику же...
thermit
Цитата
Boris_B:
Так это вы мне формулу ДПФ написали же, не?
Если я его выполню, то опять получу идеальную характеристику же...


Дпф вычисляет значения чх в дискретных точках (бинах). Частотная х-ка - непрерывная функция частоты. Задайте 100500 точек и вычислите в них частотную х-ку. Получите картинку далекую от идеала.
Boris_B
Цитата(thermit @ Apr 2 2013, 18:02) *
Дпф вычисляет значения чх в дискретных точках (бинах). Частотная х-ка - непрерывная функция частоты. Задайте 100500 точек и вычислите в них частотную х-ку. Получите картинку далекую от идеала.

А... Т.е. H(omega) - это частотная характеристика. И я могу вычислить в сколько угодно точках и получу реальную характеристику фильтра?
В принципе, у меня уже получилось вычислить коэффициенты через аналитические выражения. И с помощью fft получить из коэффициентов реальную АЧХ.
Но, возможно, когда-нибудь пригодится =)
Спасибо большое за помощь!
thermit
Цитата
И с помощью fft получить из коэффициентов реальную АЧХ.


ЧХ можно получить дополнив к-ты нулями до нужного числа точек и выполнив с полученной последовательностью дпф.
Boris_B
Цитата(thermit @ Apr 2 2013, 23:56) *
ЧХ можно получить дополнив к-ты нулями до нужного числа точек и выполнив с полученной последовательностью дпф.

Т.е. если я коэффициенты получу через ifft он идеальной дискретной АЧХ, а потом дополню их нулями, то получу реальную АЧХ?
Сейчас я так и делаю с коэффициентами, полученными из аналитических преобразований. Надо попробовать с ifft.
Boris_B
Все получилось. Какой фильтр взять в качестве образцового аналогового?
Мне показалось, что КИХ фильтр честнее всего сравнивать с фильтром Бесселя, т.к. у них обоих линейные ФЧХ, из-за чего КИХ фильтры обычно и выбирают (по-крайней мере такое читал).


Формулу передаточной характеристики нашел.







Как мне из нее получить АЧХ, ФЧХ и переходную характеристику? Заранее извиняюсь за ламерские вопросы, но больше спросить-то даже не у кого. А садится читать с нуля книжку по фильтрам, к сожалению, уже нет времени.
Нашел какие-то библиотеки на Си
библиотеки
Не уверен, что разберусь в них и смогу портировать на java...

Я в принципе могу и обычный LC фильтр взять за образец, но хочется сделать хотя бы что-то стоящее для студентов (я сам студент, если что =) )
Еще как вариант рассматриваю приведение типовых характеристик аналоговых фильтров для сравнения с получившимся КИХ фильтром. Возможно, можете подсказать, где взять.
Boris_B
dsf
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.