|
Цифровой фильтр |
|
|
|
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
|
|
|