Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: fdatool в MATLab
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
KolyanV
Здравствуйте!
Использовал ранее утилиту fdatool в MATLAB 6.5 для рассчетов FIR фильтров. Тут понадобилось рассчитать несколько IIR (БИХ) фильтров. Взял для примера фильтр Баттервуорта. Задал параметры, указал порядок. Сгенерировал фильтр. Включил рассчет квантования, в дополнительных настройках квантования включил нормализацию Numerator и Denominator так, чтобы они не были больше 1.0.
Пересчитал фильтр. По АЧХ фильтр подошел, рассчитаные коэффициенты я подставил в код своей программы. При прогоне фильтра на тестовом сигнале с плавнорастущей частотой тона с 20Гц до 10кГц оказалось, что общий уровень выходного сигнала выше входного. Причем, уровень растет пропорционально количеству секций фильтра и рост составляет около 4.2 дБ на секцию фильтра. Т.е для фильтра 20-го порядка (10 секций), рост уровня состовляет более 42 дБ. При работе с FIR фильтрами рассчитанными в MATLAB-е сподобными проблемами не сталкивался. Сначала грешил на свой алгоритм фильтрации. Для теста взял коэффициены вычисленные с помощью утилиты CIIRF1.EXE (http://www.rid.mv.ru/iir/iir.htm). По коэффициентам выданными этой программой, выходной сигнал после обработки моим алгоритмом фильтрации получился совершенно корректным (без общего поднятия/опускания уровня) и соответсвовал заданной АЧХ. Кроме того, меня настораживает тот факт, что для фильтра Баттервуорта, независимо от его порядка и других параметров Numerator всех секций фильтра равны (0.25 0.50 0.25)
Пример:
Numerator
QuantizedCoefficients{1}{1} ReferenceCoefficients{1}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Повторюсь - коффициенты нормализуются к диапазону [-1;1]

Подскажите, в чем проблема? Кто сталкивался с подобным? Как рассчитать "правильные" коэфициенты?

P.S: Для режима БЕЗ нормализации до [-1;1] с параметрами квантования коэффициентов [16 14] картина абсолютна та же.
subver
Цитата(KolyanV @ Feb 13 2006, 00:35) *
Здравствуйте!
Использовал ранее утилиту fdatool в MATLAB 6.5 для рассчетов FIR фильтров. Тут понадобилось рассчитать несколько IIR (БИХ) фильтров. Взял для примера фильтр Баттервуорта. Задал параметры, указал порядок. Сгенерировал фильтр. Включил рассчет квантования, в дополнительных настройках квантования включил нормализацию Numerator и Denominator так, чтобы они не были больше 1.0.
Пересчитал фильтр. По АЧХ фильтр подошел, рассчитаные коэффициенты я подставил в код своей программы. При прогоне фильтра на тестовом сигнале с плавнорастущей частотой тона с 20Гц до 10кГц оказалось, что общий уровень выходного сигнала выше входного. Причем, уровень растет пропорционально количеству секций фильтра и рост составляет около 4.2 дБ на секцию фильтра. Т.е для фильтра 20-го порядка (10 секций), рост уровня состовляет более 42 дБ. При работе с FIR фильтрами рассчитанными в MATLAB-е сподобными проблемами не сталкивался. Сначала грешил на свой алгоритм фильтрации. Для теста взял коэффициены вычисленные с помощью утилиты CIIRF1.EXE (http://www.rid.mv.ru/iir/iir.htm). По коэффициентам выданными этой программой, выходной сигнал после обработки моим алгоритмом фильтрации получился совершенно корректным (без общего поднятия/опускания уровня) и соответсвовал заданной АЧХ. Кроме того, меня настораживает тот факт, что для фильтра Баттервуорта, независимо от его порядка и других параметров Numerator всех секций фильтра равны (0.25 0.50 0.25)
Пример:
Numerator
QuantizedCoefficients{1}{1} ReferenceCoefficients{1}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Повторюсь - коффициенты нормализуются к диапазону [-1;1]

Подскажите, в чем проблема? Кто сталкивался с подобным? Как рассчитать "правильные" коэфициенты?

P.S: Для режима БЕЗ нормализации до [-1;1] с параметрами квантования коэффициентов [16 14] картина абсолютна та же.



Обратите внимание на масштабирующие множители, в fdatool'е после кожффициентов секций идет строка Scalefactors. При масштабировании коэффициентов меняются эти значения и на входе каждой секции необходимо умножать сигнал на этот scalefactor.
KolyanV
Цитата(subver @ Feb 13 2006, 04:48) *
Обратите внимание на масштабирующие множители, в fdatool'е после кожффициентов секций идет строка Scalefactors. При масштабировании коэффициентов меняются эти значения и на входе каждой секции необходимо умножать сигнал на этот scalefactor.


Состряпал я Lowpass фильтр Баттервуорта на частоту дискретизации 44100 c частотой Fc=4000 c указанием 10-го порядка . Включил квантизацию, также нормализацию Nominator и Denominator к 1.
Вот что получилось:

Quantized Direct form II filter
------- Section 1 -------
Numerator
QuantizedCoefficients{1}{1} ReferenceCoefficients{1}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Denominator
QuantizedCoefficients{1}{2} ReferenceCoefficients{1}{2}
(1) 0.500000000000000 0.500000000000000000
(2) -0.549255371093750 -0.549252202933341090
(3) 0.152343750000000 0.152354879887407510
------- Section 2 -------
Numerator
QuantizedCoefficients{2}{1} ReferenceCoefficients{2}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Denominator
QuantizedCoefficients{2}{2} ReferenceCoefficients{2}{2}
(1) 0.500000000000000 0.500000000000000000
(2) -0.568603515625000 -0.568601676206647920
(3) 0.175323486328125 0.175336532479207410
------- Section 3 -------
Numerator
QuantizedCoefficients{3}{1} ReferenceCoefficients{3}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Denominator
QuantizedCoefficients{3}{2} ReferenceCoefficients{3}{2}
(1) 0.500000000000000 0.500000000000000000
(2) -0.609436035156250 -0.609439668222794500
(3) 0.223846435546875 0.223840413272505730
------- Section 4 -------
Numerator
QuantizedCoefficients{4}{1} ReferenceCoefficients{4}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Denominator
QuantizedCoefficients{4}{2} ReferenceCoefficients{4}{2}
(1) 0.500000000000000 0.500000000000000000
(2) -0.676300048828125 -0.676294202544486020
(3) 0.303253173828125 0.303244522121657700
------- Section 5 -------
Numerator
QuantizedCoefficients{5}{1} ReferenceCoefficients{5}{1}
(1) 0.250000000000000 0.250000000000000000
(2) 0.500000000000000 0.500000000000000000
(3) 0.250000000000000 0.250000000000000000
Denominator
QuantizedCoefficients{5}{2} ReferenceCoefficients{5}{2}
(1) 0.500000000000000 0.500000000000000000
(2) -0.776428222656250 -0.776419882488956330
(3) 0.422180175781250 0.422165257559741100

FilterStructure = df2
ScaleValues = [1.45584e-006 2 2 2 2]
NumberOfSections = 5
StatesPerSection = [2 2 2 2 2]
CoefficientFormat = quantizer('fixed', 'round', 'saturate', [16 15])
InputFormat = quantizer('fixed', 'floor', 'saturate', [16 15])
OutputFormat = quantizer('fixed', 'floor', 'saturate', [16 15])
MultiplicandFormat = quantizer('fixed', 'floor', 'saturate', [16 15])
ProductFormat = quantizer('fixed', 'floor', 'saturate', [32 30])
SumFormat = quantizer('fixed', 'floor', 'saturate', [32 30])



Т.е Вы предлагаете входной 16-ти разрядный сигнал умножать на 1.45584e-006 ?
Он же в чистый нуль превратится ...
Тут что-то не так ...
KolyanV
Неужели никто не сталкивался с таким и не использовал IIR фильтры рассчитанные в MatLab в своих программах ?
subver
Цитата(KolyanV @ Feb 16 2006, 12:45) *
Неужели никто не сталкивался с таким и не использовал IIR фильтры рассчитанные в MatLab в своих программах ?


Именно из-за масштабирующих множителей и возникают проблемы при квантовании БИХ фильтров.
Если делать вычисления с плавающей точкой, то фильтр будет вести себя так же как и расчитанный.
Как вариант можно попробовать использовать КИХ децимацию с последующей интерполяцией.
KolyanV
Цитата(subver @ Feb 16 2006, 09:08) *
Именно из-за масштабирующих множителей и возникают проблемы при квантовании БИХ фильтров.
Если делать вычисления с плавающей точкой, то фильтр будет вести себя так же как и расчитанный.
Как вариант можно попробовать использовать КИХ децимацию с последующей интерполяцией.

Похоже, это связано с методом рассчета БИХ фильтров матлабом. Чесно говоря, я ожидал большего от МатЛаба, достаточно мощная программа, а рассчитать коэфициенты с учетом их практического использования с 16-ти разрядными целыми не в сотстаянии. А вот например, вышеуказанная утилитка
CIIRF1.EXE (http://www.rid.mv.ru/iir/iir.htm) выдает готовый результат без масшабирующих коэфициентов, и что самое главное, в большинстве своем, они подходят для использования с 16-ти разряднымы целочисельным вычислениями.
SM
Цитата(KolyanV @ Feb 20 2006, 10:23) *
Похоже, это связано с методом рассчета БИХ фильтров матлабом. Чесно говоря, я ожидал большего от МатЛаба, достаточно мощная программа, а рассчитать коэфициенты с учетом их практического использования с 16-ти разрядными целыми не в сотстаянии.
Вообще-то при рассчетах обычных БИХов (баттерворт, чебышев, кауэр) любой софт делает билинейное преобразование (или инвар. имп. хар-ку). Как закажите. Матлаб не исключение. Но в матлабе есть толпа вариантов масштабирования секций фильтров и порядка собирания полюсов в секции. Вы воспользовались всего лишь одним вариантом. Возможно не самым удобным для Вас. Но, вероятно, оптимальным с какой либо другой точки зрения. Например по минимизации переполнений, или еще по чему нибудь. Играйтесь параметрами преобразования к секциям второго порядка и масштабирования, и добъетесь своего. Просто матлаб посложнее других программ, и это тоже надо понимать. В общем не было еще ни одного фильтра, который нельзя было бы так же синтезировать матлабом, как другой сторонней программой.

P.S. Правда фдатулом почти не пользуюсь, все больше ф-ции с командной строки набираю. Или m-файл делаю.
KolyanV
Цитата(SM @ Feb 22 2006, 01:02) *
В общем не было еще ни одного фильтра, который нельзя было бы так же синтезировать матлабом, как другой сторонней программой.

Это обнадеживает, хотелось бы вычислять разные виды фильтров из одной программы.

Цитата(SM @ Feb 22 2006, 01:02) *
Вообще-то при рассчетах обычных БИХов (баттерворт, чебышев, кауэр) любой софт делает билинейное преобразование (или инвар. имп. хар-ку). Как закажите. Матлаб не исключение. Но в матлабе есть толпа вариантов масштабирования секций фильтров и порядка собирания полюсов в секции. Вы воспользовались всего лишь одним вариантом. Возможно не самым удобным для Вас. Но, вероятно, оптимальным с какой либо другой точки зрения. Например по минимизации переполнений, или еще по чему нибудь. Играйтесь параметрами преобразования к секциям второго порядка и масштабирования, и добъетесь своего. Просто матлаб посложнее других программ, и это тоже надо понимать.

Игрался я с параметрами, игрался. Так и не нашел режима, в котором матлаб может подсчитать БИХ фильтр без использования масштабирующих коэффициентов (интегрируя масштабирование в сами коэффициенты). Господа знатоки, ткните носом, пожалуйста.
Alex_vod
Подскажите, можно ли в Матлабе (FDATool) собрать фильтр выполняющий адаптивное выравнивание сигнала. Если можно , то какой тип фильтра нужно использовать.
Doka
FDATool'ом врядли - если только какое-то конкретное состояние (с известными коэф)
а просто адаптивная фильтрация - смотрите функции

lms, signlms, normlms, varlms, rls, dfe, equalize
Alex_vod
Понятно , жалко что нельзя
Подскажите, пожалуйста есть ли возможность в матлабе сгенирить на автомате VHDL код, без использования FDATool.
Скажем если я воспользуюсь функцией equalize, можно ли получить фаил фильтра на VHDL?
Doka
ну не знаю, что все так привязались к этой фиче FDAToolа , начиная с 7й версии: если уж так надо - то реализуйте КИХ-фильтра заданного порядка и из FDATool конвертните в VHDL - потом ко всему этому делу только блок обновления коэф-тов написать (подавать вместо контант, прописанных в VHDL).
Хотя как раз в описании линейки сумматоров и умножителей не вижу ничего сложного.

PS: обратите внимание на эту тему: http://electronix.ru/forum/index.php?showtopic=29110
Alex_vod
Спасибо !!
Да вы правы , всё дело как раз в блоке , который будет расчитывать коэффициенты.
Думал всё будет проще с адаптивной фильтрацией.
Буду копать дальше.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.