Здравствуйте! Требуется построить 4-х разрядный КИХ-фильтр в Matlab и привести его выходные коэффициенты к целочисленному виду.
Существует ли функция, позволяющая перевести коэффициенты с плавающей точкой, которые выдаёт матлаб, в целочисленные, и наоборот?
Синтез целочисленного цифрового фильтра малой разрядности
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Синтез целочисленного цифрового фильтра малой разрядности
а floor, round не подходят?
Re: Синтез целочисленного цифрового фильтра малой разрядности
Нет, мне нужны целочисленные коэффициенты для дальнейшей реализации на ПЛИС.
Возможно, что от этих коэффициентов, которые в формате fixed point, нужно к целочисленным переходить, умножая на 2^3, но я не уверена. После квантования получаются очень маленькие коэффициенты (я квантую до 3 бит, т.к. один бит знаковый), к тому же их остаётся всего 3 ненулевых из 57. Поэтому у меня возникает вопрос, можно ли в матлабе синтезировать "приличные" фильтры малой разрядности, и какая наименьшая разрядность допустима для дальнейшей реализации? Можно ли синтезировать фильтры ВЧ и НЧ с нелинейной фазой или несимметричной импульсной характеристикой в матлаб?
Ещё интересно, что же именно за формат с фиксированной точкой здесь используется.
Помогите с этим разобраться, пожалуйста!
Возможно, что от этих коэффициентов, которые в формате fixed point, нужно к целочисленным переходить, умножая на 2^3, но я не уверена. После квантования получаются очень маленькие коэффициенты (я квантую до 3 бит, т.к. один бит знаковый), к тому же их остаётся всего 3 ненулевых из 57. Поэтому у меня возникает вопрос, можно ли в матлабе синтезировать "приличные" фильтры малой разрядности, и какая наименьшая разрядность допустима для дальнейшей реализации? Можно ли синтезировать фильтры ВЧ и НЧ с нелинейной фазой или несимметричной импульсной характеристикой в матлаб?
Ещё интересно, что же именно за формат с фиксированной точкой здесь используется.
Помогите с этим разобраться, пожалуйста!
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Синтез целочисленного цифрового фильтра малой разрядности
Квантовать можно хоть до одного бита, но это сказывается на качестве фильтра. Если у вас исходный фильтр 57 коэффициентов посчитан в матлабе с плавающей точкой, то после квантования до 4 бит его характеристика сильно исказится и да многие коэффициенты обнулятся. С этим сложно что-то поделать кроме как поднять разрядность представления.
Re: Синтез целочисленного цифрового фильтра малой разрядности
Спасибо!
Можно ещё один вопрос? Попробовала каскадную реализацию на коэффициентах, полученных после реализации моего фильтра в fdatool, и АЧХ не совпадают. Помогите, пожалуйста, понять, что делаю неправильно.
Порядок ФНЧ - 56, переходная полоса 225-320 кГц, частота дискретизации 1 кГц.
В полосе подавления пропускания затухание дБ, в полосе пропускания - дБ,
Соответственно веса в методе equiripple для каждой полосы рассчитываю так:
,
,
где - отклонение частотной характеристики от идеальной АЧХ.
Затем вес, равный единице присваиваю полосе с наибольшим максимально допустимым отклонением, у меня это полоса подавления , а вес для полосы пропускания получаю: .
После квантования получается АЧХ:
https://ibb.co/eFmCvR
Код для каскадного фильтра ниже:
b=[-0.000057 0.000045 0.00016 -0.00023 -0.00026 0.00064 0.00025 -0.0014 0.00014 0.002465 -0.00126 -0.00367 0.003535 0.004524 -0.0073 -0.0042 0.01275 0.0016 -0.0197 0.0049 0.0275 -0.0176 -0.0353 0.0411 0.04203 -0.0914 -0.04657 0.3132 0.5482 0.3132 -0.0466 -0.0914 0.04203 0.0411 -0.0353 -0.0176 0.0275 0.0049 -0.0197 0.0016 0.01275 -0.0042 -0.0073 0.0045 0.003535 -0.00367 -0.00126 0.002465 0.00014 -0.0014 0.00025 0.0006435 -0.00026 -0.00023 0.00016 0.000045 -0.000057];
a=[1];
[s,G]=tf2sos(b,a)
Hd1=dfilt.df1sos(s,G)
set(Hd1,'Arithmetic','fixed')
set(Hd1,'CoeffWordLength',3)
%K=normalize(Hd1)
s=get(Hd1,'sosMatrix')
G=get(Hd1,'ScaleValues')
save Hd1
h=fvtool(Hd1)
Получается АЧХ:
https://ibb.co/nNRvFR
Можно ещё один вопрос? Попробовала каскадную реализацию на коэффициентах, полученных после реализации моего фильтра в fdatool, и АЧХ не совпадают. Помогите, пожалуйста, понять, что делаю неправильно.
Порядок ФНЧ - 56, переходная полоса 225-320 кГц, частота дискретизации 1 кГц.
В полосе подавления пропускания затухание дБ, в полосе пропускания - дБ,
Соответственно веса в методе equiripple для каждой полосы рассчитываю так:
,
,
где - отклонение частотной характеристики от идеальной АЧХ.
Затем вес, равный единице присваиваю полосе с наибольшим максимально допустимым отклонением, у меня это полоса подавления , а вес для полосы пропускания получаю: .
После квантования получается АЧХ:
https://ibb.co/eFmCvR
Код для каскадного фильтра ниже:
b=[-0.000057 0.000045 0.00016 -0.00023 -0.00026 0.00064 0.00025 -0.0014 0.00014 0.002465 -0.00126 -0.00367 0.003535 0.004524 -0.0073 -0.0042 0.01275 0.0016 -0.0197 0.0049 0.0275 -0.0176 -0.0353 0.0411 0.04203 -0.0914 -0.04657 0.3132 0.5482 0.3132 -0.0466 -0.0914 0.04203 0.0411 -0.0353 -0.0176 0.0275 0.0049 -0.0197 0.0016 0.01275 -0.0042 -0.0073 0.0045 0.003535 -0.00367 -0.00126 0.002465 0.00014 -0.0014 0.00025 0.0006435 -0.00026 -0.00023 0.00016 0.000045 -0.000057];
a=[1];
[s,G]=tf2sos(b,a)
Hd1=dfilt.df1sos(s,G)
set(Hd1,'Arithmetic','fixed')
set(Hd1,'CoeffWordLength',3)
%K=normalize(Hd1)
s=get(Hd1,'sosMatrix')
G=get(Hd1,'ScaleValues')
save Hd1
h=fvtool(Hd1)
Получается АЧХ:
https://ibb.co/nNRvFR
- Бахурин Сергей
- Администратор
- Сообщения: 1116
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: Синтез целочисленного цифрового фильтра малой разрядности
Не совсем понял в чем суть преобразования в секции второго порядка КИХ фильтра?
Вообще фильтр такого большого порядка разложить на множители довольно сложно, потому что процедура оценки нулей фильтра является потенциально неустойчивой. Т.е. при больших порядках фильтра округления арифметических операций в формате double будут приводить к непредсказуемым искажениям формы АЧХ и ФЧХ.
Кроме того я посмотрел картинки исходного фильтра и фильтра после округления, и они совершенно различны. Я бы не стал использовать такой фильтр. Лучше уж какой нибудь CIC фильтр + короткий корректор использовать вместо того что получилось у вас.
Вообще фильтр такого большого порядка разложить на множители довольно сложно, потому что процедура оценки нулей фильтра является потенциально неустойчивой. Т.е. при больших порядках фильтра округления арифметических операций в формате double будут приводить к непредсказуемым искажениям формы АЧХ и ФЧХ.
Кроме того я посмотрел картинки исходного фильтра и фильтра после округления, и они совершенно различны. Я бы не стал использовать такой фильтр. Лучше уж какой нибудь CIC фильтр + короткий корректор использовать вместо того что получилось у вас.