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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
Tue
сообщение Jun 19 2008, 18:51
Сообщение #16


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

Группа: Свой
Сообщений: 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
Сообщение #17


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

Группа: Свой
Сообщений: 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
Сообщение #18


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

Группа: Свой
Сообщений: 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
Tue
сообщение Jun 22 2008, 19:59
Сообщение #19


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

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



Блин, долго искал как можно отредактировать сообщение - не нашел. Обнаружил небольшую опечатку. Там где
Цитата
% Переводим фильтр в фикс. точку
Hd.Arithmetic = 'fixed';
Hdf1.Arithmetic = 'fixed';
Вместо Hd должно быть Hdf2sos
Go to the top of the page
 
+Quote Post
shf_05
сообщение Jun 23 2008, 13:10
Сообщение #20


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

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



Цитата(Tue @ Jun 23 2008, 01:59) *
Блин, долго искал как можно отредактировать сообщение - не нашел. Обнаружил небольшую опечатку. Там где
Вместо Hd должно быть Hdf2sos


Весьма благодарю за Вашу помощь.
если не секрет, то какая версия filter design toolbox у Вас?
Go to the top of the page
 
+Quote Post
Tue
сообщение Jun 23 2008, 19:46
Сообщение #21


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

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



Version 4.3 (R2008a)

Сообщение отредактировал Tue - Jun 23 2008, 19:47
Go to the top of the page
 
+Quote Post
shf_05
сообщение Jun 24 2008, 05:01
Сообщение #22


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

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



Цитата(Tue @ Jun 24 2008, 01:46) *
Version 4.3 (R2008a)


Вы бы очень помогли, если бы ответили на http://electronix.ru/forum/index.php?showtopic=49111
Go to the top of the page
 
+Quote Post

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

 


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


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