реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> fdatool в MATLab, трабла, помогите разобраться
KolyanV
сообщение Feb 12 2006, 18:35
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



Здравствуйте!
Использовал ранее утилиту 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] картина абсолютна та же.
Go to the top of the page
 
+Quote Post
subver
сообщение Feb 13 2006, 02:48
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата(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.
Go to the top of the page
 
+Quote Post
KolyanV
сообщение Feb 13 2006, 10:46
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



Цитата(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 ?
Он же в чистый нуль превратится ...
Тут что-то не так ...
Go to the top of the page
 
+Quote Post
KolyanV
сообщение Feb 16 2006, 06:45
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



Неужели никто не сталкивался с таким и не использовал IIR фильтры рассчитанные в MatLab в своих программах ?
Go to the top of the page
 
+Quote Post
subver
сообщение Feb 16 2006, 07:08
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 4-06-05
Из: Омск
Пользователь №: 5 726



Цитата(KolyanV @ Feb 16 2006, 12:45) *
Неужели никто не сталкивался с таким и не использовал IIR фильтры рассчитанные в MatLab в своих программах ?


Именно из-за масштабирующих множителей и возникают проблемы при квантовании БИХ фильтров.
Если делать вычисления с плавающей точкой, то фильтр будет вести себя так же как и расчитанный.
Как вариант можно попробовать использовать КИХ децимацию с последующей интерполяцией.
Go to the top of the page
 
+Quote Post
KolyanV
сообщение Feb 20 2006, 07:23
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



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

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

Сообщение отредактировал KolyanV - Feb 20 2006, 07:25
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 21 2006, 23:02
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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

P.S. Правда фдатулом почти не пользуюсь, все больше ф-ции с командной строки набираю. Или m-файл делаю.
Go to the top of the page
 
+Quote Post
KolyanV
сообщение Feb 22 2006, 13:01
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 91
Регистрация: 1-06-05
Пользователь №: 5 621



Цитата(SM @ Feb 22 2006, 01:02) *
В общем не было еще ни одного фильтра, который нельзя было бы так же синтезировать матлабом, как другой сторонней программой.

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

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

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

Сообщение отредактировал KolyanV - Feb 22 2006, 13:03
Go to the top of the page
 
+Quote Post
Alex_vod
сообщение Apr 11 2007, 14:22
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 123
Регистрация: 20-11-05
Пользователь №: 11 121



Подскажите, можно ли в Матлабе (FDATool) собрать фильтр выполняющий адаптивное выравнивание сигнала. Если можно , то какой тип фильтра нужно использовать.
Go to the top of the page
 
+Quote Post
Doka
сообщение Apr 11 2007, 17:08
Сообщение #10


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



FDATool'ом врядли - если только какое-то конкретное состояние (с известными коэф)
а просто адаптивная фильтрация - смотрите функции

lms, signlms, normlms, varlms, rls, dfe, equalize


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
Alex_vod
сообщение Apr 11 2007, 17:37
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 123
Регистрация: 20-11-05
Пользователь №: 11 121



Понятно , жалко что нельзя
Подскажите, пожалуйста есть ли возможность в матлабе сгенирить на автомате VHDL код, без использования FDATool.
Скажем если я воспользуюсь функцией equalize, можно ли получить фаил фильтра на VHDL?
Go to the top of the page
 
+Quote Post
Doka
сообщение Apr 11 2007, 21:05
Сообщение #12


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



ну не знаю, что все так привязались к этой фиче FDAToolа , начиная с 7й версии: если уж так надо - то реализуйте КИХ-фильтра заданного порядка и из FDATool конвертните в VHDL - потом ко всему этому делу только блок обновления коэф-тов написать (подавать вместо контант, прописанных в VHDL).
Хотя как раз в описании линейки сумматоров и умножителей не вижу ничего сложного.

PS: обратите внимание на эту тему: http://electronix.ru/forum/index.php?showtopic=29110


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
Alex_vod
сообщение Apr 12 2007, 09:51
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 123
Регистрация: 20-11-05
Пользователь №: 11 121



Спасибо !!
Да вы правы , всё дело как раз в блоке , который будет расчитывать коэффициенты.
Думал всё будет проще с адаптивной фильтрацией.
Буду копать дальше.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.02213 секунд с 7
ELECTRONIX ©2004-2016