|
Цифровой фильтр |
|
|
|
Dec 8 2005, 20:08
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 28-01-05
Пользователь №: 2 279

|
На сколько мне известно порядок фильтра характеризует коэффициент затухания. В цифровых фильтрах, как я убедился он то же влияет на коэффициент затухания. А зависит ли Порядок фильтра от количества выборок? Могу ли я поступить следующим образом: - есть сигнал 100Гц; - я оцифровую его с частотой 1000Гц; - получаеться десять выборок; - фильтр 8-го порядка; Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ. Может это все глупо, но я столкнулся с цифровыми фильтрами первый раз.
|
|
|
|
|
Dec 9 2005, 09:22
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976

|
Цитата(ASV @ Dec 8 2005, 23:08)  Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ. Как раз все 10 отсчетов и надо пропускать через фильтр. Ну а результат будет зависеть от вашего фильтра.
|
|
|
|
|
Dec 9 2005, 19:58
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата Как раз все 10 отсчетов и надо пропускать через фильтр. Ну а результат будет зависеть от вашего фильтра ;О) я бы сказал, что не стоит ограничиваться только 10 отсчотами.
|
|
|
|
|
Dec 12 2005, 08:58
|

Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 7-10-05
Из: UA
Пользователь №: 9 342

|
Цитата(ASV @ Dec 8 2005, 22:08)  На сколько мне известно порядок фильтра характеризует коэффициент затухания. Скорее, наклон АЧХ (который в дБ/декаду или дБ/октаву). Цитата А зависит ли Порядок фильтра от количества выборок? Конечно! Точнее, макс. порядок фильтра, который можно реализовать, зависит от кол-ва выборок. Цитата Могу ли я поступить следующим образом: - есть сигнал 100Гц; - я оцифровую его с частотой 1000Гц; - получаеться десять выборок; - фильтр 8-го порядка; Вопрос: имею ли я право пропустить через фильтр все 10 отсчетов? И что получиться. Фильтр НЧ с КИХ. Вообще, чем больше выборок -- тем лучше максимально достижимое "качество" фильтра. Обычно оно ограничено памятью и быстродействием имеющейся платформы :-\ Цитата Может это все глупо, но я столкнулся с цифровыми фильтрами первый раз. Ничего, все когда-то начинали!
--------------------
Gray©at
|
|
|
|
|
Dec 15 2005, 16:41
|
Участник

Группа: Новичок
Сообщений: 18
Регистрация: 8-09-05
Пользователь №: 8 383

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

Группа: Новичок
Сообщений: 43
Регистрация: 28-01-05
Пользователь №: 2 279

|
У меня задача следующая. Мне нужно померить напряжение и ток сети (пусковые). Хочеться не вешать на контроллер кучу обвязки, а сделать это красиво как в микросхемах счетчиков энергии при помощи фильтра: выпрямить и сгладить напряжение внутри контроллера. Почему 10 выборок? Да реализовать это все нужно на 18PIC-е который не очень быстрый и умеет быстро умножать только 8bit  . Спасибо всем за советы. Понемногу разобрался. Щас вот реализую и смотрю на результаты.
|
|
|
|
|
Dec 20 2005, 21:43
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата и умеет быстро умножать только 8bit Ну не стоит так огорчацца. Он, таки, может и 16Х16, например. В столбик. Как и большынство других 8-битников.
|
|
|
|
|
Dec 20 2005, 21:48
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 28-01-05
Пользователь №: 2 279

|
Цитата(mse @ Dec 21 2005, 01:43)  Цитата и умеет быстро умножать только 8bit Ну не стоит так огорчацца. Он, таки, может и 16Х16, например. В столбик. Как и большынство других 8-битников. В том то и дело что в столбик, а не в строчку как это делают DSPIC-и.
|
|
|
|
|
Dec 20 2005, 21:54
|
Знающий
   
Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693

|
Цитата а не в строчку как это делают DSPIC-и. Хех. Это уже из другой оперы. И по цене, и по потреблению...Сеть трынькать и ПИКа хватит с головой.
|
|
|
|
|
Dec 21 2005, 22:46
|
Участник

Группа: Новичок
Сообщений: 43
Регистрация: 28-01-05
Пользователь №: 2 279

|
Цитата(mse @ Dec 21 2005, 01:54)  Цитата а не в строчку как это делают DSPIC-и. Хех. Это уже из другой оперы. И по цене, и по потреблению...Сеть трынькать и ПИКа хватит с головой. Ага. В этом я уже убедился. Так же убедился в том, что показаним китайских мультиков верить нельзя.
|
|
|
|
|
Dec 22 2005, 12:34
|
Участник

Группа: Свой
Сообщений: 48
Регистрация: 23-07-04
Пользователь №: 365

|
Цитата(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 отсчетов надо только для переходного процесса в фильтре, чтобы он устаканился. В итоге Вы не получите даже одного периода полезного сигнала. Так что, чем больше отсчетов, тем лучше
|
|
|
|
|
Jan 24 2006, 08:59
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
поисследовал ситуацию поподробнее и обнаружил, что сказанное выше справедливо и для других частот. То есть фильтр с такими, например, параметрами 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Не могу понять в чем может быть дело. Пожалуйста помогите!
|
|
|
|
|
Jan 24 2006, 15:08
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
фильтр на 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. Ее результат сомнений не вызывает
|
|
|
|
|
Jan 24 2006, 19:54
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976

|
Я бы все таки проверил характеристики фильтра в Matlab'е, потому как квантование может очень сильно влиять на БИХ-фильры. Задайте ваш формат коэффициентов и переменных и посмотрите что реально получается. Можно, конечно, полагаться на старую досовскую прогу и предыдущий проект, но, как говорится, "доверяй, но проверяй". Кстати, наверное, это опечатка, но мне кажется, что у коэффициентов A1 и A2 знаки должны быть противоположные.
|
|
|
|
|
Jan 25 2006, 07:06
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
я уже неоднократно проверял. И в матлабе, и в программе специально сделаной для построения ачх с учетом эффектов квантования. Вот так выглядит АЧХ для фильтра на 430гц. с 12 разрядными коэффициентами и 8-разрядными переменными в фильтре http://webfile.ru/768926. Почему-то работает мой фильтр прям как Highpass, а не Bandpass
|
|
|
|
|
Jan 25 2006, 08:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(skopus @ Jan 23 2006, 19:52)  Уважаемые, скажите пожалуйста насколько сильно может влиять постоянная составляющая в фильтруемом сигнале. Я столкнулся с проблемой. У меня есть два полосных фильтра баттерворта 2го порядка. Один на частоту 316гц, другой на частоту 430гц. Я считываю сигнал с АЦП. Туда он подается с добавленной постоянной составляющей то есть Uвхода=Uсигнала+const. Происходит следующий эффект : при подаче сигнала 316 гц значение на выходе 2го фильтра(который на 430гц) такое же, как и на расчетной частоте. На самом деле - даже немного больше. Все коэффициенты проверил по 100 раз. Подавление в полосе затухания -30дб. Алгоритмически все вроде верно (я использую одну и ту же функцию для 11 фильтров, расчитанных на разные частоты, подставляя просто разные коэффициенты - и все кроме одного заметно давят нерасчетные частоты). Может ли это быть обусловлено постояннной составляющей в сигнале или шумом, на высоких частотах? ( ФНЧ перед АЦП я не ставил пока) Ничего удивительного, что Ваш фильтр который на 430гц пропускает что и фильтр на 316гц, да еще и с большей амплитудой. В самом начале Вы оговаривали, что у Вас фильтры - НЧ, почему они должны работать по другому? Увеличение амплитуды происходит потому что 430гц больший частотный диапазон, чем 316гц. Вот если бы использовались селективные фильтры без перекрытия частотных диапазонов (316гц и 430гц), то ничего подобного не было бы ('пролаза'). Все зависило от полосы затухания фильтров. А постоянная составляющая здесь не причем, ее даже полезно вводить для того что бы на входе фильтра небыло нулевых значений. А перед АЦП необходимо ставить аналоговый фильтр, чтобы быть уверенным что полученные частоты при цифровом преобразовании превышающие диапазон аналогового фильтра являются шумами квантования. Иначе анализ бесмыслен...
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Jan 25 2006, 08:34
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
я не говорил что у меня НЧ фильтры. У меня узкополосные фильтры BandPass (с полосой пропускания порядка Частота настройки(+-)3гц). Пример АЧХ фильтра в файле, ссылка на который дал в предыдущем посте. http://webfile.ru/769075 - здесь приницпиальная схема устройства и уравнения по которым оно работает. Решение о приеме сигнала принимается по превышению интегратором Ui установленного порога
Сообщение отредактировал skopus - Jan 25 2006, 08:36
|
|
|
|
|
Jan 25 2006, 11:11
|
Участник

Группа: Свой
Сообщений: 61
Регистрация: 24-01-06
Пользователь №: 13 541

|
Вряд ли ты прав... Хотя точно сказать не могу...
|
|
|
|
|
Jan 25 2006, 14:54
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
Цитата(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?
|
|
|
|
|
Jan 25 2006, 15:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(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) у фильтра происходит возбуждение - отсюда и увеличение амплитуды выходного сигнала (это видно на эффекте модуляции), по всей видимости из за неустойчивости рекурсивной части звена. Что конкретно и почему сказать немогу. Попробуйте взять за основу уже работающую на практике модель фильтра (смена математической концепции)...
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Jan 25 2006, 16:05
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(BVU @ Jan 25 2006, 18:46)  ...Судя по картинкам (http://webfile.ru/766585) у фильтра происходит возбуждение - отсюда и увеличение амплитуды выходного сигнала (это видно на эффекте модуляции), по всей видимости из за неустойчивости рекурсивной части звена. Что конкретно и почему сказать немогу. Попробуйте взять за основу уже работающую на практике модель фильтра (смена математической концепции)... Да, я тоже считаю, что происходит самовозбуждение из-за недостаточной точности вычислений, хотя, чтобы утверждать точно, нужно моделировать, а на это нет времени. Для уменьшения эффекта нужно отодвинуть полюса фильтра внутрь единичной окружности (в Z-плоскости). Для этого достаточно модифицировать к-ты фильтра: A1 умножить на число 0,9<b<0.98, а А2 - на b^2. Сначала выберите b близким к 0,9. Если устойчивость не будет достигнута - причина ошибки в другом. Возможно, эффекты округления промежуточных данных и коэффициентов фильтра. Так что рекомендую прислушаться к совету - использовать матлаб. ЗЫ. Из-за постоянки такая беда тоже может быть. Попробуйте перед укладыванием числа в буфер, вычесть из него постоянку.
Сообщение отредактировал Stanislav - Jan 25 2006, 16:13
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Jan 25 2006, 16:25
|
Частый гость
 
Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792

|
Цитата(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]
|
|
|
|
|
Jan 25 2006, 16:56
|
Частый гость
 
Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792

|
Цитата(skopus @ Jan 25 2006, 17:54)  http://webfile.ru/769075 - это принципиальная схема. Там же на картинке 3 решаемых уравнения. Но на самом деле там есть спорный момент. По уравнениям я не вижу на втором сумматоре прибавления сигнала задержанного на 2 отсчета (который называется D2) . А если этого нет тогда то, что у меня называется "Рекурсивной частью звена", на самом деле - цифровой резонатор... Посмотрите пожалуйста! Если я прав, то этим можно объяснить то, что амплитуда сигнала частотой 316гц на выходе фильтра, расчитанного на эту частоту, в несколько раз превышает входной сигнал... Но почему тогда фильтр на 430гц одинаково резонирует как на 430 так и на 316? В схеме как мне кажется - та же ошибка со знаками - задержанный на два такта сигнал должен не суммироваться, а вычитаться. Уравнение 2. Uad = 4 * b0 * abs(D0-D2)
|
|
|
|
|
Jan 26 2006, 07:52
|
Частый гость
 
Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792

|
Еще раз о коэффициентах фильтра.
Если рассчитанные коэффициенты: 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, 08:18
|
|
|
|
|
Jan 26 2006, 08:34
|
Частый гость
 
Группа: Свой
Сообщений: 140
Регистрация: 18-10-05
Пользователь №: 9 792

|
Цитата(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-разрядную)
|
|
|
|
|
Jan 26 2006, 08:44
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976

|
Как я понял, при расчете в таком виде Цитата // 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'е, т.е. с теми же типами переменных, форматами и прочее.
|
|
|
|
|
Jan 26 2006, 11:17
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
Спасибо за совет. Но удивительное в том, что первоначально использовалась арифметика 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 - выходной.
|
|
|
|
|
Jan 26 2006, 13:12
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976

|
Наоборот, при такой записи уравнения Цитата 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. Тогда не понятно как вообще ваше устройство работало.
|
|
|
|
|
Jan 26 2006, 14:26
|

Участник

Группа: Свой
Сообщений: 65
Регистрация: 31-08-05
Из: Moscow
Пользователь №: 8 124

|
так в том-то и дело что этих b0 и b2 в уравнениях нет есть только левая часть, а правая почему-то вынесена за сумматор. Выход левой части 1. y=x[t]+a1*y[t-1]+a2*y[t-2]. 2. берется абсолютное значение y. И человек, который это придумал и написал предыдущую версию программы (мой шеф надо заметить), утверждает что с точки зрения математики это преобразование верно. И он доказал это работающим устройством. Если это не так, мне нужно по крайней мере аргументированно доказать, раз уж не получается воспользоваться его мат. аппаратом.  И кстати, если убрать правую часть уравнения, получится цифровой резонатор
|
|
|
|
|
Jan 26 2006, 16:14
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 22-10-05
Пользователь №: 9 976

|
Цитата(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 и фильтр получается измененный. Попробуйте реализовать обычную биквадратную форму без этих хитростей, которые непонятно как работают.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|