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

 
 
> расчет БИХ фильтров в fdatool
shf_05
сообщение Apr 22 2008, 10:44
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992



написал прогу для реализации 32бит фильтра на ADSP2191
в fdatool спроектировал БИХ фильтр, отквантовал до 32бит,
необходимо получить все коэф матрицы SOS в формате 1,31 и привести коэффициент G к 1 для всех секций.
делаю как в справке по fdatool, но коэф не хочет приравниваться к 1.

помогите подогнать коэффициенты или подскажите, как рачсчитать в какой-л др проге
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Tue
сообщение Jun 19 2008, 18:51
Сообщение #2


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

Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340



1. Пожалуйста, всегда рад помочь.
2. Вот демки, которые есть у меня в матлабе. Посмотрите эту и эту демки
3. Действительно странно. Наверное я вас недопонимаю. Вы конвертируете фильтр в DFF1 уже после квантования фильтра, построенного со структурой по умолчанию (кажется df2sos) ? Возможно после перевода в другую структуру матлаб пересчитывает коэффициенты фильтра и заданная ранее разрядность уже неоптимальна для них, отсюда неустойчивость и неудовлетворительная АЧХ. АЧХ там выводится, основываясь на коэффициентах. Соответственно структура фильтра ни при чем. Структура фильтра будет влиять уже в процессе фильтрации (переполнения, предельные циклы и прочие неприятности рекурсивности в фикс. точке)

Пользоваться функциями filter design toolbox намного удобнее, быстрее и понятнее
Go to the top of the page
 
+Quote Post
shf_05
сообщение Jun 22 2008, 09:55
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 22-04-08
Из: г. Екатеринбург
Пользователь №: 36 992



Спасибо еще раз, внимательно изучу демки.
До этого работал с фильтрами с ПТ, жить было легко, использовал не более 5-6 команд из filter design.

чтобы Вам было понятно- вот как делааю фильтры сейчас:
1. запускаю fdattol
2. параметры фильтра fs=8000 Fpass=600 Fstop=800 Apass=1 Astop=30 min oder Butterworth (или др. тип)
3. file->convert to single section
4. file->convert structure-> DFF1
5. quantize coefs
6. fixed point (16 или даже 32 разряда для коэф-в)
7. отображение АЧХ исходного фильтра и вантованного не совпадают, фильтр нестабилен (stable NO)

насколько я помню из курса ЦОС- каскадный фильт тем и лучше, что его коэф-ты ближе к 1, чем у однокаскадного, поэтому ошибки окургления его коэф-в (не рез-в вычисления!) ок-т менее пагубное воздействие на его хар-ки, так ли это?

PS: буду лучше изучать filter design, (хватит пользоваться fdattol? она не дает всех возможностей, доступных для filter design?), хотел легко и быстро получить результат- коэф-ты, но без труда...)))
Go to the top of the page
 
+Quote Post
Tue
сообщение Jun 22 2008, 17:04
Сообщение #4


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

Группа: Свой
Сообщений: 166
Регистрация: 7-09-05
Из: Москва
Пользователь №: 8 340



Цитата(shf_05 @ Jun 22 2008, 13:55) *
насколько я помню из курса ЦОС- каскадный фильт тем и лучше, что его коэф-ты ближе к 1, чем у однокаскадного, поэтому ошибки окургления его коэф-в (не рез-в вычисления!) ок-т менее пагубное воздействие на его хар-ки, так ли это?
Да, я где-то это тоже читал. Вообщем-то это правильно. Тут имеется ввиду, что если коэффициент по модулю превышает единицу, то приходится выделять для него под целую часть целый бит, что нерационально. Лучше отдать его дробной части, чтобы поточнее представить нули/полюса фильтра. Поэтому лучше привести все коэффициенты к диапазону [-1; 1].
Цитата(shf_05 @ Jun 22 2008, 13:55) *
PS: буду лучше изучать filter design, (хватит пользоваться fdattol? она не дает всех возможностей, доступных для filter design?), хотел легко и быстро получить результат- коэф-ты, но без труда...)))
FDATool - это просто GUI для функций пакета filter design toolbox, в нем вполне можно работать, но как вы увидите в демках и в моем примере ниже, использование функций напрямую без GUI развязывает руки и можно проводить всесторонний анализ. Ниже привожу матлабовский скрипт, который рассчитывает по вашей спецификации фильтр, переводит его в фикс. точку, проводит анализ на переполнения:
Код
% All frequency values are in Hz.
Fs = 8000;  % Sampling Frequency

Fpass = 600;         % Passband Frequency
Fstop = 800;         % Stopband Frequency
Apass = 1;           % Passband Ripple (dB)
Astop = 30;          % Stopband Attenuation (dB)
match = 'passband';  % Band to match exactly

% Construct an FDESIGN object and call its BUTTER method.
h  = fdesign.lowpass(Fpass, Fstop, Apass, Astop, Fs);

% по умолчанию создается фильтр со структурой "прямая форма 2" в виде
% каскадно соединенных секций 2 порядка Hdf2sos:
Hdf2sos = design(h, 'butter', 'MatchExactly', match);

% создаем копию объекта фильтра:
Hdf1 = copy(Hdf2sos);
% и меняем структуру на df1:
Hdf1 = convert(Hdf1,'df1');
fvtool(Hdf2sos,Hdf1)
legend ('DF2SOS','DF1')
% в двойной точности АЧХ фильтров с разными структурами совершенно
% одинаковы.


% Переводим фильтр в фикс. точку
Hd.Arithmetic = 'fixed';
Hdf1.Arithmetic = 'fixed';

fvtool(Hdf2sos,Hdf1)
legend ('DF2SOS Fixed-point','DF1 Fixed-point')
% На графике видно, что 16 бит для представления коэффициентов, выставляемые
% по умолчанию, явно недостаточно для фильтра со структурой "прямая форма 1" (DF1)


% пробуем увеличить разрядность коэффициентов, чтобы АЧХ пришла в норму
Hdf1.CoeffWordLength = 32;
fvtool(Hdf1)
legend ('DF1 Fixed-point')
% видимо 32-х бит вполне достаточно.

%%
% задаем входную разрядность
Hdf1.InputWordLength=16; % длина всего входного слова
Hdf1.InputFracLength=14; % число бит справа от запятой (дробная часть)

% создаем входной вектор из 3000 случайных значений в диапазоне входной
% разрядности фильтра. Этот вектор будем использовать для анализа фильтра
% на переполнения, которые могут возникать в процессе работы:
rand('state',5);
q = quantizer([Hdf1.InputWordLength,Hdf1.InputFracLength],'RoundMode','convergent');
xq = randquant(q,3000,1);
x = fi(xq,true,Hdf1.InputWordLength,Hdf1.InputFracLength);
% входной вектор готов к использованию.

fipref('LoggingMode', 'on', 'DataTypeOverride', 'ScaledDoubles');

% пропускаем через созданный фильтр входной вектор.
filter(Hdf1,x);
fipref('LoggingMode', 'off', 'DataTypeOverride', 'ForceOff');
qreport(Hdf1)
% из таблицы видно, что диапазон выходного сигнала немного не втискивается в
% установленный диапазон выходного слова

%%
% проводим автомасштабирование фильтра, чтобы устранить эту неприятность.
autoscale(Hdf1,x);
% Hdf1f.ScaleValueFracLength=Hdf1f.CoeffWordLength-2;
fipref('LoggingMode', 'on', 'DataTypeOverride', 'ForceOff');
% Вновь фильтруем:
filter(Hdf1,x);
fipref('LoggingMode', 'off');
qreport(Hdf1)

% Всё, фильтр готов. Дальше можно проанализировать его на шумы, вносимые
% округлением в полосе пропускания (да и в любой другой полосе), но это уже в
% след. серии :)

Если наберете команду info(Hdf1,'long'), то просто ужаснетесь от размеров умножителей и аккумулятора. Этот ужас вызван неадекватной разрядностью коэффициентов. Поэтому и применяют секции 2-го порядка. Если хотите использовать прямую форму 1, то лучше конечно, когда порядок фильтра гораздо меньше. При таком порядке, который у фильтра в примере "df1" - нецелесообразна. Я тут много наговорил, а вам ведь нужно все-таки сделать фильтр. Мой вам совет - забейте на пример в хелпе матлаба и на то, что у вас там не единица. Просто сделайте фильтр как в примере выше, но соответственно со структурой DF2SOS. Внимательно отмасштабируйте его по соответствующей норме, задайте ограничения на единице (unit) на масщтабирующие множители, проанализируйте. Можно также создавать фильтр не по Баттерворту, а например с использованием эллиптических функций. "Elliptic filter" - порядок фильтра как правило меньше чем у Баттерворта. Правда за все приходится платить, в данном случае пульсации в полосе пропускания. Вообщем экспериментируйте.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- shf_05   расчет БИХ фильтров в fdatool   Apr 22 2008, 10:44
- - Tue   Очень может быть, что коэффициент на выходе из сек...   May 5 2008, 14:12
|- - shf_05   Цитата(Tue @ May 5 2008, 20:12) Очень мож...   May 26 2008, 03:38
- - Tue   Дело в разрядности выходного коэффициента секции. ...   May 27 2008, 07:56
|- - shf_05   попробовал ваш совет, получил, что часть коэффицие...   Jun 2 2008, 13:55
- - Tue   Честно говоря, я совсем не в курсе с каким примеро...   Jun 3 2008, 12:29
|- - shf_05   насчет необходимости БИХ фильтра я уверен (ФЧХ не ...   Jun 4 2008, 08:22
- - Tue   Да, попробовал сам - действительно один из коэффиц...   Jun 7 2008, 07:32
|- - shf_05   Цитата(Tue @ Jun 7 2008, 13:32) Да, попро...   Jun 9 2008, 12:47
- - Tue   Чтож, похоже по поводу единичного полного коэффици...   Jun 16 2008, 06:16
|- - shf_05   Цитата(Tue @ Jun 16 2008, 12:16) Чтож, по...   Jun 17 2008, 13:01
|- - Tue   А каков порядок получается у вашего фильтра ? Обыч...   Jun 17 2008, 21:51
|- - shf_05   Цитата(Tue @ Jun 18 2008, 03:51) Кол-во б...   Jun 18 2008, 05:31
|- - Tue   Странный подход. Выберите структуру фильтра. Созда...   Jun 18 2008, 07:49
|- - shf_05   Цитата(Tue @ Jun 18 2008, 13:49) По повод...   Jun 19 2008, 13:28
- - Tue   Блин, долго искал как можно отредактировать сообще...   Jun 22 2008, 19:59
|- - shf_05   Цитата(Tue @ Jun 23 2008, 01:59) Блин, до...   Jun 23 2008, 13:10
- - Tue   Version 4.3 (R2008a)   Jun 23 2008, 19:46
- - shf_05   Цитата(Tue @ Jun 24 2008, 01:46) Version ...   Jun 24 2008, 05:01


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:02
Рейтинг@Mail.ru


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