|
расчет БИХ фильтров в fdatool |
|
|
|
May 27 2008, 07:56
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340

|
Дело в разрядности выходного коэффициента секции. Обычно Матлаб выставляет для входного и выходного коэффициентов секции одну и ту же разрядность. Допустим выставил sfix16_En15 - означает число со знаком, 16 бит на всё число, 15 бит - на дробную часть, следовательно остается один бит на знак, а на целую часть не остается ничего. Отсюда и ошибка. Пусть N - полное число бит, FL - число бит справа после запятой (дробная часть) и если число со знаком, тогда диапзон чисел, которые вы можете представить такой: -2^(N-FL-1) <= число <= +2^(N-FL)-1 - 2(-FL) Следовательно, чтобы исправить эту ошибку отнимите от дробной части один бит и добавьте его к целой части, т.о. у вас получится разрядность sfix16_En14 - число со знаком, 16 бит на все число, 14 бит на дробную часть, один бит на знак и как раз один бит на целую часть, чтобы единица представлялась корректно. Такой трюк в общем случае конечно чуть снизит точность представления дробной части коэффициента, но поскольку он у вас равен "1" и никакой дробной части не содержит, то никакой потери в точности вы не получите. К сожалению в FDAtool поменять разрядность какого-либо конкретного коэффициента секции не представляется возможным, поэтому чтобы этого добиться - надо реализовать (RealizeMDL) его в Симулинк в виде основных элементов (Build model using basic elements) и уже в Симулинке вручную поменять разрядность нужного коэффициента. Можно даже вообще убрать коэффциент на выходе из секции, который точно равен "1", оставив лишь блок преобразования типа, конвертирующий в нужную разрядность выхода секции, т.о. вы избавитесь от лишнего умножителя.
|
|
|
|
|
Jun 2 2008, 13:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
попробовал ваш совет, получил, что часть коэффициентов больше 1, что и следовало ижидать. я хотел получить коэффициенты a,b в формате 1,31 с коэф масштабирования, четко равному 1 (т .е его можно исключить). в примере по fdatool есть такое решение (там создается фильтр с коэф 1,16 и без масштабир оэф при этом АЧХ Q фильтра довольно четко совпадает с АЧХ неквант фильтра) , ноо когда я ставлю все настройки как там, результат не тот- коэф масштабир никак не хочет быть 1.
|
|
|
|
|
Jun 4 2008, 08:22
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
насчет необходимости БИХ фильтра я уверен (ФЧХ не важна, необходим минимальный порядок фильтра). сейчас использую 16 разрядные БИХ фильтры, расчитанные с помощью qedesign v 1.0 (ужасно!!, но что дали старшие коллеги), я скачал v6.3.4, применил кряк, описанный на форуме http://www.telesys.ru/wwwboards/mcontrol/4...es/225467.shtml приводит ктому, что qued2000.exe не запускается. понадобилось использовать 32 разрядную линию задержки (при 16 разр слишком малый динамич диапазон фильтра). Вобщем, решил рассчитать коэф в матлабе, расчитал необх фильтр примерно из 4-5 секций 2-го порядка, отквантовал до 32 бит, пусть коэф тоже будут точнее. Для упрощения реализации и сниж вычислений на DSP секции второго порядка не должны содержать масштабирующих коэффициентов, линия задержки 32 битная. Полагаю такая реализация фильтра имеет право на существование. для приведения вектора G (масштаб коэф на вых каждой секции) к 1, использую опцию Edit->Reodering->Highest SNR. Для понимания происходящего прикрепляю файл
|
|
|
|
|
Jun 7 2008, 07:32
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340

|
Да, попробовал сам - действительно один из коэффициентов не хочет приравниваться единице. То, что я писал выше про фиксированную точку - справедливо, когда коэффициент равен единице, а при переводе в фикс. точку уже не единица. Почему при масштабировании он изначально не равен единице - непонятно. Может баг, а может фича  По поводу 32 бит для представления коэффициентов вы не погорячились ? Конечно из-за рекурсивности БИХ требует меньше коэффциентов, задержек и прочего, но есть методы, позволяющие проектировать достаточно эффективные КИХ, которые гораздо проще и в анализе влияния фикс. точки, и в реализации. Поскольку вы собираетесь реализовывать свой фильтр на процессоре, то надо будет еще выбрать структуру фильтра таким образом, чтобы вычислительная эффективность не падала из-за сложных методов обращения к памяти данных/коэффициентов.
|
|
|
|
|
Jun 9 2008, 12:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
Цитата(Tue @ Jun 7 2008, 13:32)  Да, попробовал сам - действительно один из коэффициентов не хочет приравниваться единице. То, что я писал выше про фиксированную точку - справедливо, когда коэффициент равен единице, а при переводе в фикс. точку уже не единица. Почему при масштабировании он изначально не равен единице - непонятно. Может баг, а может фича  По поводу 32 бит для представления коэффициентов вы не погорячились ? Конечно из-за рекурсивности БИХ требует меньше коэффциентов, задержек и прочего, но есть методы, позволяющие проектировать достаточно эффективные КИХ, которые гораздо проще и в анализе влияния фикс. точки, и в реализации. Поскольку вы собираетесь реализовывать свой фильтр на процессоре, то надо будет еще выбрать структуру фильтра таким образом, чтобы вычислительная эффективность не падала из-за сложных методов обращения к памяти данных/коэффициентов. для меня важны не линии задержки и связанные с ними затраты памяти, а задержка в смысле групповой задержки (критична для моего приложения) фильтра- при БИХ фильтрации получаем тот же спад АЧХ при меньшем порядке фильтра => при меньшей задержке. насчет эффективности программы- написана на асме требует конечно в 3 раза больше вычислит затрат, чем при одинарной точности, но приходится идти на это- надо динамич диапазон фильтр состоит из секций второго порядка, программа готова, даже проверял ее работу- фильтрует как надо, одна проблема- расчет коэф.
|
|
|
|
|
Jun 18 2008, 05:31
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
Цитата(Tue @ Jun 18 2008, 03:51)  Кол-во бит для представления коэфф-тов и элементов задержек вообщем случае не связаны. я имел ввиду, если коэф 32 разрядные, то и накопитель имеетсмысл делать 32 ращзрядным. ну это вовсе не заморочка. насчет формы 1, то попробую конечно, хотя я пробовал изменить форму с каскадной на DFF1 прямо в fdatool, сразу исказилась АЧХ фильтра, так что я сразу ее отмел, может я поспешил с этим решением? параметры примерно такие ФНЧ, Fs=8000Hz, полоса 500Гц, может 100Гц, или до 2000Гц (всякие разные), порядок от 5-го до 12-го.
|
|
|
|
|
Jun 18 2008, 07:49
|
Частый гость
 
Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340

|
Странный подход. Выберите структуру фильтра. Создайте фильтр в двойной точности. Отквантуйте коэффициенты фильтра минимальным количеством бит, необходимым для того, чтобы АЧХ совпадала с исходным (неквантованным фильтром). Убедитесь в устойчивости фильтра, при необходимости увеличьте разрядность коэффициентов. Задайте входную/выходную и прочие разрядности. Создайте входной вектор, прогоните через фильтр, посмотрите где происходят переполнения (очень хороший туториал по переводу БИХ-фильтров в фикс. точку показан в демке "Floating-Point to Fixed-Point Conversion of IIR Filters"). Если и дальше хотите нормально создавать/анализировать цифровые фильтры лучше сразу привыкайте пользоваться функциями Filter Design Toolbox. По поводу: Цитата(shf_05 @ Jun 18 2008, 09:31)  я имел ввиду, если коэф 32 разрядные, то и накопитель имеетсмысл делать 32 ращзрядным. ну это вовсе не заморочка. не совсем понятно. Разрядность коэффициентов в конечном итоге определяет то, насколько АЧХ квантованного фильтра будет похожа на исходную и 32 бита - это явный перебор. Если у вас коэффициенты 32 разрядные, то это еще не значит что накопитель у вас будет 32 разрядным. При разрядности входного слова, скажем, 16 бит у вас только умножитель должен быть (32+16) бит, а накопитель еще больше (+4/6 бит). В вашем процессоре есть умножители и накопители такой разрядности ? Конечно это все справедливо, если вы хотите округлять/усекать разрядность только на выходе секции/фильтра, а не в процессе промежуточных вычислений для минимизации шума квантования По поводу: Цитата(shf_05 @ Jun 18 2008, 09:31)  насчет формы 1, то попробую конечно, хотя я пробовал изменить форму с каскадной на DFF1 прямо в fdatool, сразу исказилась АЧХ фильтра, так что я сразу ее отмел, может я поспешил с этим решением? Вы создайте одну спецификацию фильтра, а потом по этой спецификации создайте разные объекты фильтров с разными структурами. Анализ покажет какая подходит вам лучше.
|
|
|
|
|
Jun 19 2008, 13:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992

|
Цитата(Tue @ Jun 18 2008, 13:49)  По поводу: Вы создайте одну спецификацию фильтра, а потом по этой спецификации создайте разные объекты фильтров с разными структурами. Анализ покажет какая подходит вам лучше. 1. спасибо я Вас понял, 2. не смог найти эту демку 3. странно, может я не так делаю, задаю необходимые хар-ки фильтра в fdatool, конвертирую в фильтр стр-ры DFF1, задаю квантование 32 бита, (формат 1.31 !!!) в итоге фильтр 9-го порядка нестабильный и АЧХ его искажается, конечно, если задать режим "best prec. fraqt. length", то этого может и не будет, но формат представления в проце 1,16 можно расширить до 1,31 (конечно там можно поупражняться с ПТ, но это не решение((( ). Вы рекомендуете пользоваться преимущественно пакетом filter design, он дает больше возможностей, чем fdatool?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|