Цитата(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" - порядок фильтра как правило меньше чем у Баттерворта. Правда за все приходится платить, в данном случае пульсации в полосе пропускания. Вообщем экспериментируйте.