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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> Цифровой фильтр
Stanislav
сообщение Jan 25 2006, 16:05
Сообщение #31


Гуру
******

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


--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
Go to the top of the page
 
+Quote Post
Johny
сообщение Jan 25 2006, 16:25
Сообщение #32


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

Группа: Свой
Сообщений: 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]
Go to the top of the page
 
+Quote Post
Johny
сообщение Jan 25 2006, 16:56
Сообщение #33


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

Группа: Свой
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Johny
сообщение Jan 26 2006, 07:52
Сообщение #34


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Johny
сообщение Jan 26 2006, 08:34
Сообщение #35


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

Группа: Свой
Сообщений: 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-разрядную)
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Jan 26 2006, 08:44
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 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'е, т.е. с теми же типами переменных, форматами и прочее.
Go to the top of the page
 
+Quote Post
skopus
сообщение Jan 26 2006, 11:17
Сообщение #37


Участник
*

Группа: Свой
Сообщений: 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 - выходной.
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Jan 26 2006, 13:12
Сообщение #38


Местный
***

Группа: Свой
Сообщений: 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. Тогда не понятно как вообще ваше устройство работало.
Go to the top of the page
 
+Quote Post
skopus
сообщение Jan 26 2006, 14:26
Сообщение #39


Участник
*

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



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

Если это не так, мне нужно по крайней мере аргументированно доказать, раз уж не получается воспользоваться его мат. аппаратом. sad.gif

И кстати, если убрать правую часть уравнения, получится цифровой резонатор
Go to the top of the page
 
+Quote Post
Dr.NoA
сообщение Jan 26 2006, 16:14
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 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 и фильтр получается измененный.

Попробуйте реализовать обычную биквадратную форму без этих хитростей, которые непонятно как работают.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 15:38
Рейтинг@Mail.ru


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