Полная версия этой страницы:
Цифровой фильтр
На сколько мне известно порядок фильтра характеризует коэффициент затухания. В цифровых фильтрах, как я убедился он то же влияет на коэффициент затухания. А зависит ли Порядок фильтра от количества выборок? Могу ли я поступить следующим образом:
- есть сигнал 100Гц;
- я оцифровую его с частотой 1000Гц;
- получаеться десять выборок;
- фильтр 8-го порядка;
Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ.
Может это все глупо, но я столкнулся с цифровыми фильтрами первый раз.
Не всё так просто. ЦФ бывают, как минимум, FIR и IIR... Ну а дальше - пошло-поехало. ;О)
ASVПо английски читаешь? Посмотри здесь, например
http://www.dspguru.com/info/faqs/index.htm
Цитата(ASV @ Dec 8 2005, 23:08)

Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ.
Как раз все 10 отсчетов и надо пропускать через фильтр. Ну а результат будет зависеть от вашего фильтра.
Цитата
Как раз все 10 отсчетов и надо пропускать через фильтр. Ну а результат будет зависеть от вашего фильтра
;О) я бы сказал, что не стоит ограничиваться только 10 отсчотами.
GrayCat
Dec 12 2005, 08:58
Цитата(ASV @ Dec 8 2005, 22:08)

На сколько мне известно порядок фильтра характеризует коэффициент затухания.
Скорее, наклон АЧХ (который в дБ/декаду или дБ/октаву).
Цитата
А зависит ли Порядок фильтра от количества выборок?
Конечно! Точнее, макс. порядок фильтра, который можно реализовать, зависит от кол-ва выборок.
Цитата
Могу ли я поступить следующим образом:
- есть сигнал 100Гц;
- я оцифровую его с частотой 1000Гц;
- получаеться десять выборок;
- фильтр 8-го порядка;
Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ.
Вообще, чем больше выборок -- тем лучше максимально достижимое "качество" фильтра. Обычно оно ограничено памятью и быстродействием имеющейся платформы :-\
Цитата
Может это все глупо, но я столкнулся с цифровыми фильтрами первый раз.
Ничего, все когда-то начинали!
Крик о помощи
Начальные условия : топик прочел ссылки изучил, литературу частично освоил (Гольденберг "ЦОС") =)
Тоже сюда задам свой вопрос:
каким образом могу я воспользоваться коэффициентами фильтра (импульсной хар-ки) чтобы по имеющемуся входному получить выходной сигнал.. или нужно еще что-то (требования к АЧХ подразумевается есть).. ?
во всей этой литре как-то дело и стопорится на получении коэффициентов... застрял на этом
если можно приведите коротенький пример
З.Ы.
Коэффициенты при слагаемых в передаточной функции и коэффициенты в уравнении связывающем вход. и выход. сигнал:
y(nT) = b0*x(nT) + b1*x((n-1)T) + b2*x((n-2)T) + .......
однии и теже ?
У меня задача следующая. Мне нужно померить напряжение и ток сети (пусковые). Хочеться не вешать на контроллер кучу обвязки, а сделать это красиво как в микросхемах счетчиков энергии при помощи фильтра: выпрямить и сгладить напряжение внутри контроллера. Почему 10 выборок? Да реализовать это все нужно на 18PIC-е который не очень быстрый и умеет быстро умножать только 8bit

. Спасибо всем за советы. Понемногу разобрался. Щас вот реализую и смотрю на результаты.
Цитата
и умеет быстро умножать только 8bit
Ну не стоит так огорчацца. Он, таки, может и 16Х16, например. В столбик. Как и большынство других 8-битников.
Цитата(mse @ Dec 21 2005, 01:43)

Цитата
и умеет быстро умножать только 8bit
Ну не стоит так огорчацца. Он, таки, может и 16Х16, например. В столбик. Как и большынство других 8-битников.
В том то и дело что в столбик, а не в строчку как это делают DSPIC-и.
Цитата
а не в строчку как это делают DSPIC-и.
Хех. Это уже из другой оперы. И по цене, и по потреблению...Сеть трынькать и ПИКа хватит с головой.
Цитата(mse @ Dec 21 2005, 01:54)

Цитата
а не в строчку как это делают DSPIC-и.
Хех. Это уже из другой оперы. И по цене, и по потреблению...Сеть трынькать и ПИКа хватит с головой.
Ага. В этом я уже убедился. Так же убедился в том, что показаним китайских мультиков верить нельзя.
nano
В MATLAB в DSP Blockset имеется Filter Realization Wizard там выбираешь тип фильтра, набиваешь свои коэффициенты м получаешь блок для Simulink. Затем собственно в самом Simulink делаешь с ним все что душе угодно.
Цитата(nano @ Dec 15 2005, 19:41)

Крик о помощи
Начальные условия : топик прочел ссылки изучил, литературу частично освоил (Гольденберг "ЦОС") =)
Тоже сюда задам свой вопрос:
каким образом могу я воспользоваться коэффициентами фильтра (импульсной хар-ки) чтобы по имеющемуся входному получить выходной сигнал.. или нужно еще что-то (требования к АЧХ подразумевается есть).. ?
во всей этой литре как-то дело и стопорится на получении коэффициентов... застрял на этом
если можно приведите коротенький пример
З.Ы.
Коэффициенты при слагаемых в передаточной функции и коэффициенты в уравнении связывающем вход. и выход. сигнал:
y(nT) = b0*x(nT) + b1*x((n-1)T) + b2*x((n-2)T) + .......
однии и теже ?
Гм, таки у Голденберга ничего не нашли? Тогда перечитайте вторую главу
Цитата(ASV @ Dec 8 2005, 23:08)

На сколько мне известно порядок фильтра характеризует коэффициент затухания. В цифровых фильтрах, как я убедился он то же влияет на коэффициент затухания. А зависит ли Порядок фильтра от количества выборок? Могу ли я поступить следующим образом:
- есть сигнал 100Гц;
- я оцифровую его с частотой 1000Гц;
- получаеться десять выборок;
- фильтр 8-го порядка;
Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ.
Может это все глупо, но я столкнулся с цифровыми фильтрами первый раз.
Через цифровой фильтр Вы можете прогнать сколько угодно отсчетов, так же, как и на аналоговый фильтр можно подавать сигнал сколь угодно долго. И более того, 10 отсчетов будет мало, так как 8 отсчетов надо только для переходного процесса в фильтре, чтобы он устаканился. В итоге Вы не получите даже одного периода полезного сигнала. Так что, чем больше отсчетов, тем лучше
skopus
Jan 23 2006, 16:52
Уважаемые, скажите пожалуйста насколько сильно может влиять постоянная составляющая в фильтруемом сигнале.
Я столкнулся с проблемой. У меня есть два полосных фильтра баттерворта 2го порядка. Один на частоту 316гц, другой на частоту 430гц. Я считываю сигнал с АЦП. Туда он подается с добавленной постоянной составляющей то есть Uвхода=Uсигнала+const.
Происходит следующий эффект : при подаче сигнала 316 гц значение на выходе 2го фильтра(который на 430гц) такое же, как и на расчетной частоте. На самом деле - даже немного больше. Все коэффициенты проверил по 100 раз. Подавление в полосе затухания -30дб. Алгоритмически все вроде верно (я использую одну и ту же функцию для 11 фильтров, расчитанных на разные частоты, подставляя просто разные коэффициенты - и все кроме одного заметно давят нерасчетные частоты). Может ли это быть обусловлено постояннной составляющей в сигнале или шумом, на высоких частотах? ( ФНЧ перед АЦП я не ставил пока)
Dr.NoA
Jan 23 2006, 20:54
Я правильно понял проблему? Вы подаете синус с амлитудой Авх и частотой 316 Гц на первый фильтр, который пропускает как раз 316 Гц, а все остальное подавляет, затем на второй фильтр, который делает тоже самое, но для частоты 430 Гц. В результате на выходе Авых>Aвх.
Посмотрите внимательно усиление обоих фильтров на частоте 316 Гц, возможно их последовательное соединение дает усиление больше 1.
skopus
Jan 24 2006, 05:02
нет. Вы не совсем правильно поняли. Фильтры не соединены последовательно. В моей системе возможно 11 сигналов вызова синусоидальной формы. Соответственно для каждого сигнала свой фильтр. Так вот фильтр, расчитанный на 430гц, одинаково хоро принимает и 430 и 316гц.
Доеду до работы, покажу вам картинки с графиками из своей программы
skopus
Jan 24 2006, 08:59
поисследовал ситуацию поподробнее и обнаружил, что сказанное выше справедливо и для других частот. То есть фильтр с такими, например, параметрами
FILTER COEFFICIENT FILE FILTER TYPE BAND PASS
ANALOG FILTER TYPE BUTTERWORTH
PASSBAND RIPPLE IN -dB -3.0000
STOPBAND RIPPLE IN -dB -30.0000
PASSBAND CUTOFF FREQUENCIES 426 434 HERTZ
STOPBAND CUTOFF FREQUENCIES 316 2080 HERTZ
SAMPLING FREQUENCY 4167 HERTZ
почему-то принимает крайнюю левую частоту полосы задерживания 316гц

иллюстрации в файле по адресу
http://webfile.ru/766585Не могу понять в чем может быть дело. Пожалуйста помогите!
Dr.NoA
Jan 24 2006, 10:54
Какие-то странные графики. Почему, например, для фильтра на 316 Гц выходной сигнал больше входного, хотя должно быть затухание порядка 30 дБ?
Как вы реализовываете фильры? Возможно, при переводе в цифру АЧХ "плывет" и отличается от расчетного аналогового варианта.
skopus
Jan 24 2006, 15:08
фильтр на 316гц по идее должен пропускать частоту 316, не усиливая и не подавляя. А этот результат я объяснить никак не могу.
Филтр реализуется такой вот функцией на языке Си++ в IAR C для Atmel AVR (3 версия)
// 1. Вычисление результата в рекурсивной ветви звена:
// D10 = Uadc + D11*a11 + D12*a12
void MyChannelClass::FilterOne(MyChannelClass *pntr)
{
//формат коэффициентов 4.12
//формат переменных фильтров 8.8
pntr->D10 = pntr->ADC_buffer;
//ывделяем из формата 12.20 число в формате 8.8
pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D11, pntr->a11)>>12 );
pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D12, pntr->a12)>>12 );
pntr->D12 = pntr->D11;
pntr->D11 = pntr->D10;
}
далее выполняется
// 2. Детектирование и сглаживание сигнала (амплитудное детектирование
// Цикл выборки НЧ в 16 раз больше периода квантования
// Uad1 = 4*b10*abs(D10)
(умножение на 4 из-за сдвига на 2 разряда влево, чтобы убрать знак, хранящийся в старших разрядах 2байтной переменной D10 - это было в предыдущей программе для другого МК)
Сейчас это написано на Си так.
pntr->Uad1 = SignedToUnsigned(pntr->D10);
pntr->Uad1 = int( fmuls16x16_32( pntr->Uad1, pntr->b10)>>12 ); //8.8 x 4.12 = 12.20 -> 8.8
pntr->Uad1 = (pntr->Uad1)*4;
функция fmuls16x16_32 реализует умножение двухбайтных чисел и дает 4 байтный результат (арифметика с фиксированной точкой)
для фильтра на 430гц
1.584584 /* section 1 A1 */
-0.987981 /* section 1 A2 */
0.006009 /* section 1 B0 */
-0.006009 /*section 1 B2 */
здесь имеется ввиду уравнение
x[t] +a1*x[t-1] + a2*x[t-2] = b0*y[t] +b2*y[t-2]
на практике остается только левая часть, а правая выносится как бы за сумматор (простите, что без картинки - если надо, сделаю).
Используемый коэффициент b0=0.3308.
Это значение было подобрано так, чтобы все работало. И оно действительно работает в предыдущей версии устройства (его делал не я, и программу тоже не я писал, но сомнений в том, что это так не возникает). Подбирался он из следующих соображений : результат не должен был переполнять разрядную сетку. А если вынести коэффициенты b0 и b2 за сумматор, то значение фильтра будет равно абсолютному значению рекурсивной ветви звена.
я заподозрил что что-то не так, когда увидел что среднее значение после детектирования подчиняется закономерности, которую я описывал выше, и от этого предположения перешел к предыдущему шагу, о чем здесь и спрашиваю.
забыл сказать что речь идет о рекурсивном фильтре с бесконечной импульсной характеристикой (IIR). Рачет выполняет в старой проге методом Bilinear Transformation , работающей под DOS. Ее результат сомнений не вызывает
Dr.NoA
Jan 24 2006, 19:54
Я бы все таки проверил характеристики фильтра в Matlab'е, потому как квантование может очень сильно влиять на БИХ-фильры. Задайте ваш формат коэффициентов и переменных и посмотрите что реально получается. Можно, конечно, полагаться на старую досовскую прогу и предыдущий проект, но, как говорится, "доверяй, но проверяй".
Кстати, наверное, это опечатка, но мне кажется, что у коэффициентов A1 и A2 знаки должны быть противоположные.
skopus
Jan 25 2006, 07:06
я уже неоднократно проверял. И в матлабе, и в программе специально сделаной для построения ачх с учетом эффектов квантования. Вот так выглядит АЧХ для фильтра на 430гц. с 12 разрядными коэффициентами и 8-разрядными переменными в фильтре
http://webfile.ru/768926.
Почему-то работает мой фильтр прям как Highpass, а не Bandpass
Цитата(skopus @ Jan 23 2006, 19:52)

Уважаемые, скажите пожалуйста насколько сильно может влиять постоянная составляющая в фильтруемом сигнале.
Я столкнулся с проблемой. У меня есть два полосных фильтра баттерворта 2го порядка. Один на частоту 316гц, другой на частоту 430гц. Я считываю сигнал с АЦП. Туда он подается с добавленной постоянной составляющей то есть Uвхода=Uсигнала+const.
Происходит следующий эффект : при подаче сигнала 316 гц значение на выходе 2го фильтра(который на 430гц) такое же, как и на расчетной частоте. На самом деле - даже немного больше. Все коэффициенты проверил по 100 раз. Подавление в полосе затухания -30дб. Алгоритмически все вроде верно (я использую одну и ту же функцию для 11 фильтров, расчитанных на разные частоты, подставляя просто разные коэффициенты - и все кроме одного заметно давят нерасчетные частоты). Может ли это быть обусловлено постояннной составляющей в сигнале или шумом, на высоких частотах? ( ФНЧ перед АЦП я не ставил пока)
Ничего удивительного, что Ваш фильтр который на 430гц пропускает что и фильтр на 316гц, да еще и с большей амплитудой. В самом начале Вы оговаривали, что у Вас фильтры - НЧ, почему они должны работать по другому? Увеличение амплитуды происходит потому что 430гц больший частотный диапазон, чем 316гц. Вот если бы использовались селективные фильтры без перекрытия частотных диапазонов (316гц и 430гц), то ничего подобного не было бы ('пролаза'). Все зависило от полосы затухания фильтров. А постоянная составляющая здесь не причем, ее даже полезно вводить для того что бы на входе фильтра небыло нулевых значений.
А перед АЦП
необходимо ставить аналоговый фильтр, чтобы быть уверенным что полученные частоты при цифровом преобразовании превышающие диапазон аналогового фильтра являются шумами квантования. Иначе анализ бесмыслен...
skopus
Jan 25 2006, 08:34
я не говорил что у меня НЧ фильтры. У меня узкополосные фильтры BandPass (с полосой пропускания порядка Частота настройки(+-)3гц). Пример АЧХ фильтра в файле, ссылка на который дал в предыдущем посте.
http://webfile.ru/769075 - здесь приницпиальная схема устройства и уравнения по которым оно работает.
Решение о приеме сигнала принимается по превышению интегратором Ui установленного порога
Для выяснения причин данной проблемы нужно подать на вход системы (АЦП) синус 316гц, и контролировать, что получается на выходе фильтра 316гц и 430гц. Так же синус и для 430гц. Если будет 'пролаз' значит фильтры не работают, как полосовые или имеют не расчетную полосу, а на много больше. Так же характеристику фильтра можно снять при помощи анализатора спектра (Брюль и Кьер например или другой...), что еще комфортней для анализа и настройки фильра.
michael34
Jan 25 2006, 11:11
Вряд ли ты прав... Хотя точно сказать не могу...
Цитата(michael34 @ Jan 25 2006, 14:11)

Вряд ли ты прав... Хотя точно сказать не могу...
Посоветуйте конкретно что-нибудь получше, здесь Вам за это будут только благодарны...!
skopus
Jan 25 2006, 14:54
Цитата(BVU @ Jan 25 2006, 13:20)

Для выяснения причин данной проблемы нужно подать на вход системы (АЦП) синус 316гц, и контролировать, что получается на выходе фильтра 316гц и 430гц. Так же синус и для 430гц. Если будет 'пролаз' значит фильтры не работают, как полосовые или имеют не расчетную полосу, а на много больше. Так же характеристику фильтра можно снять при помощи анализатора спектра (Брюль и Кьер например или другой...), что еще комфортней для анализа и настройки фильра.
http://webfile.ru/766585 в этом файле картинки с показаниями со входов и выходов фильтров.
Да фильтр 430гц пропускает и 316 гц. Да он не работает. Вопрос ПОЧЕМУ??? Рачетные коэффициенты верны, программная реализация верна. Почему же он не работает. Может дело в математике?
http://webfile.ru/769075 - это принципиальная схема. Там же на картинке 3 решаемых уравнения.
Но на самом деле там есть спорный момент. По уравнениям я не вижу на втором сумматоре прибавления сигнала задержанного на 2 отсчета (который называется D2) . А если этого нет тогда то, что у меня называется "Рекурсивной частью звена", на самом деле - цифровой резонатор...
Посмотрите пожалуйста!
Если я прав, то этим можно объяснить то, что амплитуда сигнала частотой 316гц на выходе фильтра, расчитанного на эту частоту, в несколько раз превышает входной сигнал... Но почему тогда фильтр на 430гц одинаково резонирует как на 430 так и на 316?
Цитата(skopus @ Jan 25 2006, 17:54)

Цитата(BVU @ Jan 25 2006, 13:20)

Для выяснения причин данной проблемы нужно подать на вход системы (АЦП) синус 316гц, и контролировать, что получается на выходе фильтра 316гц и 430гц. Так же синус и для 430гц. Если будет 'пролаз' значит фильтры не работают, как полосовые или имеют не расчетную полосу, а на много больше. Так же характеристику фильтра можно снять при помощи анализатора спектра (Брюль и Кьер например или другой...), что еще комфортней для анализа и настройки фильра.
http://webfile.ru/766585 в этом файле картинки с показаниями со входов и выходов фильтров.
Да фильтр 430гц пропускает и 316 гц. Да он не работает. Вопрос ПОЧЕМУ??? Рачетные коэффициенты верны, программная реализация верна. Почему же он не работает. Может дело в математике?
http://webfile.ru/769075 - это принципиальная схема. Там же на картинке 3 решаемых уравнения.
Но на самом деле там есть спорный момент. По уравнениям я не вижу на втором сумматоре прибавления сигнала задержанного на 2 отсчета (который называется D2) . А если этого нет тогда то, что у меня называется "Рекурсивной частью звена", на самом деле - цифровой резонатор...
Посмотрите пожалуйста!
Если я прав, то этим можно объяснить то, что амплитуда сигнала частотой 316гц на выходе фильтра, расчитанного на эту частоту, в несколько раз превышает входной сигнал... Но почему тогда фильтр на 430гц одинаково резонирует как на 430 так и на 316?
Судя по картинкам (http://webfile.ru/766585) у фильтра происходит возбуждение - отсюда и увеличение амплитуды выходного сигнала (это видно на эффекте модуляции), по всей видимости из за неустойчивости рекурсивной части звена. Что конкретно и почему сказать немогу. Попробуйте взять за основу уже работающую на практике модель фильтра (смена математической концепции)...
Stanislav
Jan 25 2006, 16:05
Цитата(BVU @ Jan 25 2006, 18:46)

...Судя по картинкам (http://webfile.ru/766585) у фильтра происходит возбуждение - отсюда и увеличение амплитуды выходного сигнала (это видно на эффекте модуляции), по всей видимости из за неустойчивости рекурсивной части звена. Что конкретно и почему сказать немогу. Попробуйте взять за основу уже работающую на практике модель фильтра (смена математической концепции)...
Да, я тоже считаю, что происходит самовозбуждение из-за недостаточной точности вычислений, хотя, чтобы утверждать точно, нужно моделировать, а на это нет времени. Для уменьшения эффекта нужно отодвинуть полюса фильтра внутрь единичной окружности (в Z-плоскости). Для этого достаточно модифицировать к-ты фильтра: A1 умножить на число 0,9<b<0.98, а А2 - на b^2. Сначала выберите b близким к 0,9. Если устойчивость не будет достигнута - причина ошибки в другом. Возможно, эффекты округления промежуточных данных и коэффициентов фильтра. Так что рекомендую прислушаться к совету - использовать матлаб.
ЗЫ. Из-за постоянки такая беда тоже может быть. Попробуйте перед укладыванием числа в буфер, вычесть из него постоянку.
Цитата(skopus @ Jan 24 2006, 18:08)

для фильтра на 430гц
1.584584 /* section 1 A1 */
-0.987981 /* section 1 A2 */
0.006009 /* section 1 B0 */
-0.006009 /*section 1 B2 */
здесь имеется ввиду уравнение
x[t] +a1*x[t-1] + a2*x[t-2] = b0*y[t] +b2*y[t-2]
на практике остается только левая часть, а правая выносится как бы за сумматор (простите, что без картинки - если надо, сделаю).
Используемый коэффициент b0=0.3308.
Это значение было подобрано так, чтобы все работало. И оно действительно работает в предыдущей версии устройства (его делал не я, и программу тоже не я писал, но сомнений в том, что это так не возникает). Подбирался он из следующих соображений : результат не должен был переполнять разрядную сетку. А если вынести коэффициенты b0 и b2 за сумматор, то значение фильтра будет равно абсолютному значению рекурсивной ветви звена.
я заподозрил что что-то не так, когда увидел что среднее значение после детектирования подчиняется закономерности, которую я описывал выше, и от этого предположения перешел к предыдущему шагу, о чем здесь и спрашиваю.
Полагаю, что х - это входной сигнал, а у - выходной.
Из написанного уравнения следует: y[t]=(x[t]+a1*x[t-1]+a2*x[t-2]-b2*y[t-2])/b0
поскольку сумма коэффициентов при х не равна 0, это значит, что данный фильтр как минимум пропускает постоянную составляющую.
Есть большое подозрение, что запись исходного уравнения (для приведенных выше коэффициентов) неверна. Оно должно выглядеть так:
y[t] +a1*y[t-1] + a2*y[t-2] = b0*x[t] +b2*x[t-2]
а конечная рассчетная формула фильтра:
y[t] = b0*x[t]+b2*x[t-2]-a1*y[t-1]-a2*y[t-2]
Цитата(skopus @ Jan 25 2006, 17:54)

http://webfile.ru/769075 - это принципиальная схема. Там же на картинке 3 решаемых уравнения.
Но на самом деле там есть спорный момент. По уравнениям я не вижу на втором сумматоре прибавления сигнала задержанного на 2 отсчета (который называется D2) . А если этого нет тогда то, что у меня называется "Рекурсивной частью звена", на самом деле - цифровой резонатор...
Посмотрите пожалуйста!
Если я прав, то этим можно объяснить то, что амплитуда сигнала частотой 316гц на выходе фильтра, расчитанного на эту частоту, в несколько раз превышает входной сигнал... Но почему тогда фильтр на 430гц одинаково резонирует как на 430 так и на 316?
В схеме как мне кажется - та же ошибка со знаками - задержанный на два такта сигнал должен не суммироваться, а вычитаться. Уравнение
2. Uad = 4 * b0 * abs(D0-D2)
Еще раз о коэффициентах фильтра.
Если рассчитанные коэффициенты:
A1=1.584584
A2=-0.987981
B0=-B2=0.006009
То для рассчетных формул вида:
1. D0=x[t]+a1*D1[t]+a2*D2[t]
2. y[t]=b0*(D0-D2)
где D1[t]=D0[t-1], D2[t]=D1[t-1], x[t] - входной сигнал, y[t] - выходной.
Коэффициенты в целочисленных процессорах коэффициенты обычно сдвигают так, чтобы максимальный из них занимал все значащие разряды.
В нашем случае, для 16-разрядной арифметики сдвиг на 14 разрядов,
a1=25961 (6569h)
a2=-16187 (С0С5h)
b0=98 (62h)
конечный результат надо сдвинуть на 14 разрядов вправо
Надо еще внимательно посмотреть на разрядность D0,D1,D2, чтобы не было переполнений. В любом cлучае, результат умножения a1*D1 и a2*D2 - как минимум 32-разрядный, для дальнейших вычислений младшие 16 бит отбрасываются.
Возможно, для оптимизации разрядности промежуточных результатов, сдвигать надо не на 14 бит, а на 13 или 12 (соответственно рассчитанные целочисленные коэффициенты сдвинуть на 1 или 2 бита вправо).
Цитата(Johny @ Jan 26 2006, 10:52)

Надо еще внимательно посмотреть на разрядность D0,D1,D2, чтобы не было переполнений. В любом cлучае, результат умножения a1*D1 и a2*D2 - как минимум 32-разрядный, для дальнейших вычислений младшие 16 бит отбрасываются.
Почему-то не смог отредактировать. У результата умножения a1*D1 и a2*D2 не отбрасываются младшие 16 бит, он сдвигается вправо на 14 бит.
Кстати, надо следить за разрядностью входного сигнала. Если хотите, чтобы сумматоры были 16-разрядными, входной сигнал навскидку должен быть не более 14 разрядов. Иначе надо переходить на более высокоразрядную арифметику (например на 32-разрядную)
Dr.NoA
Jan 26 2006, 08:44
Как я понял, при расчете в таком виде
Цитата
// 1. Вычисление результата в рекурсивной ветви звена:
// D10 = Uadc + D11*a11 + D12*a12
void MyChannelClass::FilterOne(MyChannelClass *pntr)
{
//формат коэффициентов 4.12
//формат переменных фильтров 8.8
pntr->D10 = pntr->ADC_buffer;
//ывделяем из формата 12.20 число в формате 8.8
pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D11, pntr->a11)>>12 );
pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D12, pntr->a12)>>12 );
pntr->D12 = pntr->D11;
pntr->D11 = pntr->D10;
}
далее выполняется
// 2. Детектирование и сглаживание сигнала (амплитудное детектирование
// Цикл выборки НЧ в 16 раз больше периода квантования
// Uad1 = 4*b10*abs(D10)
реально вы получаете фильтр с коэффициентами b0=x, b1=0, b2=0, а не b0=x, b1=0, b2=-x. В результате АЧХ, конечно, изменяется, но описываемых вами чудес не наблюдается.
Посмотрел еще в FDATool как сказываются эффекты квантования на характеристики фильтра на 430 Гц. При формате коэффициентов 4.12 все нормально при условии использования режима переполнения wrap. Если же использованить saturate фильтр становится неустойчивым. А если верить FDATool переполнения случаются. Возможно, причина глюков в этом.
Если есть сомнения в программной реализации, попробуйте проверить ее в Simulink. Сделайте ваш фильтр как S-function и расчет делайте точно также как вы делаете в AVR'е, т.е. с теми же типами переменных, форматами и прочее.
skopus
Jan 26 2006, 11:17
Спасибо за совет. Но удивительное в том, что первоначально использовалась арифметика 8.8. В этом случае из-за эффектов квантования B0=-B2=0.006009 на самом деле равнялось 0. Но устройство, в основе которог лежит эта программа, работает и серийно выпускается и насколько я знаю неплохо справляется со своими функциями. Странно что при небольшом увеличении разрядности, фильтры перестали работать..
Stanislav: Постоянку уже вычитаю. Все картинки - из модифицированной программы.
Johny: похоже разностное уравнение я немного переврал, а вот за "2. Uad = 4 * b0 * abs(D0-D2)" я вам благодарен. Мне тоже не нравится исходное уравнение, попробую изменить
Вопрос: может ли отсутствие ФНЧ так сильно оказывать влияние, при условии, что сигнал амплитуды -21дб идет из звуковой карты компьютера?
Цитата(Johny @ Jan 25 2006, 19:25)

Полагаю, что х - это входной сигнал, а у - выходной.
Из написанного уравнения следует: y[t]=(x[t]+a1*x[t-1]+a2*x[t-2]-b2*y[t-2])/b0
поскольку сумма коэффициентов при х не равна 0, это значит, что данный фильтр как минимум пропускает постоянную составляющую.
Есть большое подозрение, что запись исходного уравнения (для приведенных выше коэффициентов) неверна. Оно должно выглядеть так:
y[t] +a1*y[t-1] + a2*y[t-2] = b0*x[t] +b2*x[t-2]
а конечная рассчетная формула фильтра:
y[t] = b0*x[t]+b2*x[t-2]-a1*y[t-1]-a2*y[t-2]
На самом деле все скорее вот так:
x[kT]+a1*x[(k-1)T]+a2*x[(k-2)T]=bo*y[kT]+b1*y[(k-1)T]+b2*y[(k-2)T]
уравнение для классического биквадратного звена
в моем случае b1=0
поэтому уравнение запишется как:
x[kT] + a1*x[(k-1)T] + a2*x[(k-2)T] = bo*y[kT] + b2*y[(k-2)T], где x - входной сигнал, y - выходной.
Dr.NoA
Jan 26 2006, 13:12
Наоборот, при такой записи уравнения
Цитата
x[kT]+a1*x[(k-1)T]+a2*x[(k-2)T]=bo*y[kT]+b1*y[(k-1)T]+b2*y[(k-2)T]
x-ВЫХОД, y-ВХОД
Кроме того, если коэффициенты b0=b1=b2=0, то получается, что выход не зависит от входа, на выходе фильтра всегда будет 0. Тогда не понятно как вообще ваше устройство работало.
skopus
Jan 26 2006, 14:26
так в том-то и дело что этих b0 и b2 в уравнениях нет
есть только левая часть, а правая почему-то вынесена за сумматор. Выход левой части
1. y=x[t]+a1*y[t-1]+a2*y[t-2].
2. берется абсолютное значение y.
И человек, который это придумал и написал предыдущую версию программы (мой шеф надо заметить), утверждает что с точки зрения математики это преобразование верно. И он доказал это работающим устройством.
Если это не так, мне нужно по крайней мере аргументированно доказать, раз уж не получается воспользоваться его мат. аппаратом.

И кстати, если убрать правую часть уравнения, получится цифровой резонатор
Dr.NoA
Jan 26 2006, 16:14
Цитата(skopus @ Jan 26 2006, 17:26)

так в том-то и дело что этих b0 и b2 в уравнениях нет
есть только левая часть, а правая почему-то вынесена за сумматор. Выход левой части
1. y=x[t]+a1*y[t-1]+a2*y[t-2].
Есть тут b0, только b0=1, а вот b2, действительно, равно 0. Просто при такой записи выполнено масштабирование на b0.
Математика вообщем-то правильная, только вот, как я уже говорил, у меня подозрение, что при описанных вами уравнениях b2=0 и фильтр получается измененный.
Попробуйте реализовать обычную биквадратную форму без этих хитростей, которые непонятно как работают.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.