Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цифровой Фильтр на ATmega
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2
SasaVitebsk
bb-offtopic.gif Да не на что она не намекает. Заниматься такой оптимизацией никто не будет. По нескольким причинам. Во-первых пока провели данное исследование, выйдет новый проц, в котором, банально, изменят предсказатель ветвлений. И всё будет по-диагонали. Во-вторых такого рода исследования, похоже даже мелкософт не делает. Разве только при отладке ядра. Ну а втретьих AVR-PIC-MSP и младшим моделям ARM остаётся только мечтать о таких ошибках. smile.gif
DRUID3
Цитата(SasaVitebsk @ Jan 24 2010, 13:09) *
Заниматься такой оптимизацией никто не будет. По нескольким причинам. Во-первых пока провели данное исследование, выйдет новый проц, в котором, банально, изменят предсказатель ветвлений. И всё будет по-диагонали.
Во-вторых такого рода исследования, похоже даже мелкософт не делает. Разве только при отладке ядра. Ну а втретьих AVR-PIC-MSP и младшим моделям ARM остаётся только мечтать о таких ошибках. smile.gif

Ну я бы так не сказал. Я конечно не спец по ядру Win нисколечки, но, думаю, что как раз в таком гигантском и необозримо-нелинейном куске кода как ядро ОС выполнить оптимизацию для того или иного автомата кэша - бесполезно да и невозможно...

...выигрыш ощутим как раз когда ~90% занимают циклические операции "влоб" - в FIR, FFT, FCT, FWT(а особенно многомерных случаях этих преобразований), различной работе с матрицами, etc.. И действительно - кэши ужасно непредсказуемы(и при этом прозрачны) от производителя к производителю и дать универсальный совет невозможно. Но... зачем я вообще бросил эту ссылку - как-то раньше подумать не мог(хоть и читал статью Касперского) что разница может быть столь существенной. Просто это нужно знать! Для утилиток просмотра фото это действительно никто учитывать не будет. Но если кто что считает "по-серьезному"(вот как эти ребята) то и парк машин у них обычно фиксирован - и есть повод для творчества.

Думаю форумчанам нелишне будет быть проинформированными, что для "больших ЭВМ" просто перестроив слегка код в сторону большей детерминированности можно поднять производительность своего кода на порядки(!!!)...
Andrew34
Вечер добрый господа электронщики!)
У меня проблема с программой для цифрового фильтра на 16й меге.(
Задача в следующем осуществлять цифровую фильтрацию, но АЦП мне
не требуется, т.к. использую стандартную функцию rand() [пишу на CodeVisionAvr].
На выходе ЦАП (после контроллера) ачх фнч я не наблюдаю....
Вышеописанную тему прочитал, но свою прогу пока не переделывал...
Прилагаю злощастную прогу ...
("Я - не волшебник. Я только учусь..." не ругайте сильно)

CODE
#include <mega16.h> /* Подключение файла содержащего информацию о
физических адресах регистров микроконтроллера */

#include <stdlib.h>
#include <delay.h>

#define WR PORTD.5
#define CS PORTD.6

#define c0 2.467011f // Коэффициенты цифрового
#define c1 4.9348022f // ФНЧ ,
#define c2 2.4674011f // описываемого уравнением
#define d1 0.00099788f // y[k]=c0*x[k]+c1*x[k-1]+c2*x[k-2]+
#define d2 -0.071176655f // +d1*y[k-1]+d2*y[k-2]
unsigned char x0, x1, x2, x3, y2, y1, y0, yN;
void main (void)
{
DDRA = 0xFF; // настройка порта А на выход
DDRD = 0xFF; // настройка порта D на выход


//-------------------------------------------------------------------------------------------------------
CS = 0; // #CS - Chip Select - enable
delay_ms (10);
WR = 0; // #WR - Write Input - enable
delay_ms (10);

x0 = rand (); // первый входной отсчёт ЦФ:x0
// delay_ms (10);

PORTA = c0 * x0; // первый выходной отсчёт ЦФ:y0
y0 = PORTA; // т.к. ЦФ - рекурсивный
// delay_ms (10);

WR = 1; // #WR - Chip Select - disable
delay_ms (10);
CS = 1; // #CS - Write Input - disable
delay_ms (10);

//---------------------------------------------------------------------------------------------------------

CS = 0; // #CS - Chip Select - enable
delay_ms (10);
WR = 0; // #WR - Write Input - enable
delay_ms (10);

x1 = rand (); // второй входной отсчёт ЦФ:x1
PORTA = c0*x1 + c1*x0 + d1*y0; // второй выходной отсчёт ЦФ:y1
y1 = PORTA;

WR = 1; // #WR - Chip Select - disable
delay_ms (10);
CS = 1; // #CS - Write Input - disable
delay_ms (10);

//---------------------------------------------------------------------------------------------------------
CS = 0; // #CS - Chip Select - enable
delay_ms (10);
WR = 0; // #WR - Write Input - enable
delay_ms (10);

x2 = rand(); // третий входной отсчёт ЦФ:x2
PORTA = c0*x2 + c1*x1 + c2*x0 + d1*y1 + d2*y0; // третий выходной отсчёт ЦФ:y2
y2 = PORTA;

CS = 1; // #CS - Chip Select - enable
delay_ms (10);
WR = 1; // #WR - Write Input - enable
delay_ms (10);

//---------------------------------------------------------------------------------------------------------

while (1)
{

CS = 0; // #CS - Chip Select - enable
delay_ms (10);
WR = 0; // #WR - Write Input - enable
delay_ms (10);

x3 = rand (); // {x3.....xN} входной отсчёт ЦФ

PORTA = c0*x3 + c1*x2 + c2*x1 + d1*y2 + d2*y1; //{y3.....yN} выходной отсчёт ЦФ
yN = PORTA; // временнАя переменная для хранения самого старшего выходного отсчёта


CS = 1; // #CS - Chip Select - enable
delay_ms (10);
WR = 1; // #WR - Write Input - enable


x1 = x2;
x2 = x3;
y1 = y2;
y2 = yN;

}
}
RedD
Для SasaVitebsk.
Интересует тема, не могу написать Вам личное сообщение, не могли бы ВЫ скинуть мне на redd@samtel.ru пустое письмо, я Вам отвечу.
Нужно для отладки одной вещи, ....

Вот что не понятно, см первую страницу.
1.Постоил фильтр в проге приложенной
2.Округлил коэффициенты
3. У автора
Итак X коэфф. фильтра будут выглядеть так:
0.0625*(X0+X4)-0.125*X2 = ((X0+X4)>>4)-(X2>>3)

Y коэф. будут выглядеть так
-(-1.875*Y1+2*Y2-1.0625*Y3+0.3125*Y4) = 1.875*Y1-2*Y2+1.0625*Y3-0.3125Y4 = 2*Y1-0.125*Y1-2*Y2+Y3+0.0625*Y3-0.3125*Y4
= (Y1<<1)-(Y1>>3)-(Y2<<1)+Y3+(Y3>>4)-(Y4>>2)-(Y4>>4)

Далее он упрощает до

Итого общая формула (1):
Y0 = ((X0+X4)>>4)-(X2>>3)+(Y1<<1)-(Y1>>3)-(Y2<<1)+Y3+(Y3>>4)-(Y4>>2)-(Y4>>4)

Для понимания дальнейшего я перепишу по другому первых 2 члена
((X0+X4)>>4)-(X2>>3) = ((X0+X4)>>1)-X2)>>3

Далее записывает в виде

Temp = (X0+X4+Y3-Y4)>>1; // все члены со сдвигом 4 = 1,7,9
Temp += (-X2-Y1); // ... 3 = 2,4 Естественно лучше записать Temp -= X2+Y1;
Temp >>= 1;
Temp += (-Y4); // .... 2 = 8 Опять таки Temp -= Y4;
Temp >>= 2; // Поскольку у нас нет членов со сдвигом >>1
Temp += (Y1<<1)-(Y2<<1)+Y3;

Непонятно где и как используются коэффициенты полученные при построении фильтра, куда они делись ??????

Ибо в результате он получил вот это

Итак, будет выглядеть так:

X4=X3; // Новый сэмпл сдвигает значения
X3=X2;
X2=X1;
X1=X0;
X0=ADCH;
Temp = (X0+X4+Y3-Y4)>>1; // все члены со сдвигом 4 = 1,7,9
Temp += (-X2-Y1); // ... 3 = 2,4 Естественно лучше записать Temp -= X2+Y1;
Temp >>= 1;
Temp += (-Y4); // .... 2 = 8 Опять таки Temp -= Y4;
Temp >>= 2; // Поскольку у нас нет членов со сдвигом >>1
Temp += (Y1<<1)-(Y2<<1)+Y3;
Y4=Y3; // Новый сэмпл сдвигает значения
Y3=Y2;
Y2=Y1;
Y1=Y0;
Y0=Temp;

Где этих коэффициентов то нет совсем ???? А ведь ими сам фильтр то и задаётся ???? Или я чего то не понял ?

Подскажи как АРУ реализовано, ну хотя бы намекни )
Herz
RedD, Вы обратили внимание на то, как выглядит Ваш пост после отправки?
RedD
Цитата(Herz @ Jan 1 2016, 18:52) *
RedD, Вы обратили внимание на то, как выглядит Ваш пост после отправки?

Извиняюсь ежели что не так, я человек эмоциональный, если оскорбил чем ВАШ форум
Скажи что не так
Исправимся

Гена Завидовский вижу на форуме, ПРИВЕТ на Питер )
Herz
Цитата(RedD @ Jan 1 2016, 21:26) *
Извиняюсь ежели что не так, я человек эмоциональный, если оскорбил чем ВАШ форум
Скажи что не так
Исправимся

Вы бы Правила почитали перед регистрацией...
А что не так - неужели не заметно? Ваш пост (и второй тоже) состоит из повторений и самоцитирования. Аккуратней бы надо.
Нажимать на кнопочку "предварительный просмотр" для надёжности не повредит. И высыпаться после встречи Нового Года. rolleyes.gif
Да, и ещё. У нас тут повелось с собеседниками на "Вы". Буду рад, если поддержите традицию.
RedD
Цитата(Herz @ Jan 1 2016, 22:34) *
Вы бы Правила почитали перед регистрацией...
А что не так - неужели не заметно? Ваш пост (и второй тоже) состоит из повторений и самоцитирования. Аккуратней бы надо.
Нажимать на кнопочку "предварительный просмотр" для надёжности не повредит. И высыпаться после встречи Нового Года. rolleyes.gif
Да, и ещё. У нас тут повелось с собеседниками на "Вы". Буду рад, если поддержите традицию.


Я ВАС понял.
Так по подбору коэффициентов то подскажите вот например 0.673 разбираем на (Х0>>1+X0>>3+X0>>5+X0>>6)=X0*0.673
потом группируем по сдвигам и упрощаем вынося за скобки так ?
RedD
Вобщем правильно, вручную проверил,
Но все равно не понятно кое что SasaVitebsk ты где ?
Да про АРУ тоже интересно очень )

Шикарная тема )
RedD
Слесарь да я смотрю ты местный,
Не знаешь как с СашейВитебск списаться ?
Alexashka
Цитата(RedD @ Jan 2 2016, 12:49) *
Я ВАС понял.
Так по подбору коэффициентов то подскажите вот например 0.673 разбираем на (Х0>>1+X0>>3+X0>>5+X0>>6)=X0*0.673
потом группируем по сдвигам и упрощаем вынося за скобки так ?

Может чего не понял (всю тему читать лень), но такие махинации со сдвигами (особенно если Х0 длиннее 8 бит, а контроллер не поддерживаем сдвиг на нужное число разрядов за раз) займут хучу тактов. Я бы делал проще сначала Х0 умножаем на 172, а потом откидываем один правый байт (т.е делим на 256), итого получаем коэффициент 0,671875 sm.gif т.е тот же самый, что и в Вашей формуле (Х0>>1+X0>>3+X0>>5+X0>>6).
RedD
Цитата(Alexashka @ Jan 9 2016, 00:15) *
Может чего не понял (всю тему читать лень), но такие махинации со сдвигами (особенно если Х0 длиннее 8 бит, а контроллер не поддерживаем сдвиг на нужное число разрядов за раз) займут хучу тактов. Я бы делал проще сначала Х0 умножаем на 172, а потом откидываем один правый байт (т.е делим на 256), итого получаем коэффициент 0,671875 sm.gif т.е тот же самый, что и в Вашей формуле (Х0>>1+X0>>3+X0>>5+X0>>6).

Да вы немного не поняли, это только один коэффициент, так раскладываются все ну смотря какой фильтр, допустим 7 штук, потом раскрываем скобки,
потом упрощаем вынося за скобки, допустим вынесли за скобки >>2 И потом >>1.
Оставшееся раскладываем по сдвигам и записываем как
темр=все с 1 сдвигом
темр=все с 2 сдвигами
и т д
а потом
темр=темр + (что за скобкой1) >>2
темр=темр + (что за скобкой2) >>1
И наконец
темр=темр+целая часть

Хотя можно и немного по другому, записать
Итого все на сдвигах, да в том то и прикол что для приемлемой точности более 7 сдвигов то и не нужно
Там когда график строишь сразу округляешь чтобы поменьше сдвигов было, график то конечно похуже но на практите это даж не заметно
особо, а кода меньше и выполняется быстрее, я бы сказал красивое решение )
Цитата(Alexashka @ Jan 9 2016, 00:15) *
Может чего не понял (всю тему читать лень), но такие махинации со сдвигами (особенно если Х0 длиннее 8 бит, а контроллер не поддерживаем сдвиг на нужное число разрядов за раз) займут куеву хучу тактов. Я бы делал проще сначала Х0 умножаем на 172, а потом откидываем один правый байт (т.е делим на 256), итого получаем коэффициент 0,671875 sm.gif т.е тот же самый, что и в Вашей формуле (Х0>>1+X0>>3+X0>>5+X0>>6).

Хотя и Ваш вариант нада попробовать )))) и сравнить ))))
Alexashka
Цитата
Итого все на сдвигах, да в том то и прикол что для приемлемой точности более 7 сдвигов то и не нужно

Ну мой вариант это тоже по сути сдвиг максимум на 8 разрядов. Только я снова Вас спрашиваю, сколько тактов уходит на сдвиг на 7 бит? Или Вы не оцениваете вычислительные затраты в тактах, тогда о какой эффективности алгоритма идет речь? Непонятно.
Цитата
а кода меньше и выполняется быстрее
Кода меньше, чем где?
RedD
Цитата(Alexashka @ Jan 10 2016, 11:24) *
Ну мой вариант это тоже по сути сдвиг максимум на 8 разрядов. Только я снова Вас спрашиваю, сколько тактов уходит на сдвиг на 7 бит? Или Вы не оцениваете вычислительные затраты в тактах, тогда о какой эффективности алгоритма идет речь? Непонятно.
Кода меньше, чем где?

ДЛя avr один сдвиг в право один такт (LSR, Logical Shift Right (asm)), если семь сдвигов то семь тактов, не считая временных буферов для X,Y.
Хотя и это можно посчитать

А если округлять то вообще не более 4-х тактов выходит на фильтр )
Правда там еще сложения есть, в итоге вместе с буфером больше конечно будет
А вообще на ПЛИС это реализуется похоже еще интереснее ....
RedD
Цитата(Alexashka @ Jan 10 2016, 11:24) *
Кода меньше, чем где?

Кода меньше если округлять с подбором, визуально контролируя АЧХ.
Допустим если округлять до двух знаков да еще с подбором на мин количество сдвигов, то и сдвигов меньше и слагаемых меньше,
а результат будет чуть чуть похуже, а на практике и не заметен вообще, ну это если сделать измерения ....

Оно конечно когда там полноценный DSP или STM то можно и не заморачиваться и делать по полной программе, а на avr так не получится, там каждый такт на счету )
Alexashka
Цитата(RedD @ Jan 10 2016, 14:31) *
ДЛя avr один сдвиг в право один такт (LSR, Logical Shift Right (asm)), если семь сдвигов то семь тактов,

С отрицательными числами тоже? (извините, плохо знаю AVR)
И потом нужно еще принимать во внимание разрядность исходных данных. Всё хорошо когда они 8-битные, но сейчас даже самый плохенький АЦП в контроллере уже имеет разрядность 10+, так что это уже 2 байта.
И потом, если Вы вдруг решите изменить частоту среза фильтра это же все коэффициенты и их группировки нужно пересчитывать (и возможно вводить новые сдвиги). Это весь текст ЦФ надо править. sad.gif
RedD
Цитата(Alexashka @ Jan 10 2016, 18:49) *
С отрицательными числами тоже? (извините, плохо знаю AVR)
И потом нужно еще принимать во внимание разрядность исходных данных. Всё хорошо когда они 8-битные, но сейчас даже самый плохенький АЦП в контроллере уже имеет разрядность 10+, так что это уже 2 байта.
И потом, если Вы вдруг решите изменить частоту среза фильтра это же все коэффициенты и их группировки нужно пересчитывать (и возможно вводить новые сдвиги). Это весь текст ЦФ надо править. sad.gif



Все ответы здесь ....
https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%...%BA%D0%BE%D0%B9

В том числе и алгоритм, это всего лишь ЦОС, если посмотреть на схему и алгоритм то один в один, остальное тоже там, обычный институтский курс
RedD
А вообще меня интересовала практическая реализация вот этого вот
Трехполосный эквалайзер + компрессор в полосе 0,3 - 3,4 кГц.
На маломощном avr )
Alexashka
Цитата(RedD @ Jan 10 2016, 23:24) *
Все ответы здесь ....
https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%...%BA%D0%BE%D0%B9

В том числе и алгоритм, это всего лишь ЦОС, если посмотреть на схему и алгоритм то один в один, остальное тоже там, обычный институтский курс

Вы не поняли, я про то, что изменение даже одного коэффициента влечет переписывание алгоритма обработки в целом (число сдвигов, группировки по сдвигам и т.д.)
Про ЦФ я кое что знаю, первый фильтр я написал еще когда учился в 6 классе rolleyes.gif , не совсем фильтр конечно, а систему разностных уравнений для получения эффекта вращающихся галактик, но не суть. Писалось это на БК0010, с его быстродействием 300тыс.оп./cек и работало в реальном времени. К слову всё делалось безо всяких википедий и учебников smile3046.gif
Цитата
А вообще меня интересовала практическая реализация вот этого вот
Раньше это делалось чисто аналоговым путем (обычный АРУ на пиковом детекторе) безо всяких процессоров, в чем преимущество цифрового метода?
Цитата
Работоспособность компрессора динамического диапазона подтверждена результатами MATLAB-моделирования.
интересно бы еще узнать мнение целевой аудитории.
RedD
Ну то что я хотел сделать я почти сделал )


На Ваши вопросы
1. То не вижу разницы в том сколько двигать 8 16 32, почему ?
Ну хотя бы потому что под 16 бит АЦП и МК нужен 16 бит и т д иначе просто глупость получается.
2. Насчет отрицательных не думал, нужно будет че нить придумаем )


Alexashka
Цитата(RedD @ Jan 11 2016, 13:31) *
Ну хотя бы потому что под 16 бит АЦП и МК нужен 16 бит

Ну в Atmege ядро вроде бы 8-битное. Если речь уже не об atmege, то и сложности с группировкой сдвиговых операций наверно смысла не имеют? В том же кортексе сдвиг на нужное число бит (арифметический, т.е с учетом знака) делается одной инструкцией ASR.
RedD
Цитата(Alexashka @ Jan 11 2016, 11:27) *
Ну в Atmege ядро вроде бы 8-битное. Если речь уже не об atmege, то и сложности с группировкой сдвиговых операций наверно смысла не имеют? В том же кортексе сдвиг на нужное число бит (арифметический, т.е с учетом знака) делается одной инструкцией ASR.



Что Вы имеете под группировкой ?

Про знак .....


С АЦП не может придти отрицательное значение только положительные ....
с ними и работаем, для 8 битного АЦП 0-255, для 10 битного 0-1023

Если про это то

Си
temp=temp-x2>>2 => temp=temp-(x2)>>2,

Да и то только для наглядности, приоритет сдвига выше чем сложение. Сдвиг в 3 группе, сложение в 5 пятой группе приоритетов )

ASM
temp=r20,
ldi r0,x2,
lsr r0,
sub temp,r0
Alexashka
Цитата(RedD @ Jan 11 2016, 19:31) *
Что Вы имеете под группировкой ?

Ваши же слова:
Цитата(RedD @ Jan 2 2016, 12:49) *
Я ВАС понял.
Так по подбору коэффициентов то подскажите вот например 0.673 разбираем на (Х0>>1+X0>>3+X0>>5+X0>>6)=X0*0.673
потом группируем по сдвигам и упрощаем вынося за скобки так ?


Цитата
Про знак .....

С АЦП не может придти отрицательное значение только положительные ....
с ними и работаем, для 8 битного АЦП 0-255, для 10 битного 0-1023
Ага, а усиление как делать будем? sm.gif Допустим нужно будет усилить какието полосы частот, а какието ослабить -подумайте что будет если просто поделить диапазон 0-255 на N.
(подсказка: Ваш сигнал всегда содержит (бесполезную)постоянную составляющую, которая также будет усиливаться/ослабляться вместе с (полезной) переменной)
RedD
Цитата(Alexashka @ Jan 11 2016, 18:21) *
Ваши же слова:


Ага, а усиление как делать будем? sm.gif Допустим нужно будет усилить какието полосы частот, а какието ослабить -подумайте что будет если просто поделить диапазон 0-255 на N.
(подсказка: Ваш сигнал всегда содержит (бесполезную)постоянную составляющую, которая также будет усиливаться/ослабляться вместе с (полезной) переменной)


Про усиление или ослабление я Вас понял, но дело даже не в постоянной составляющей, например
С АЦП прищло 10, усиливаем в два раза, 10*2=20 но дело в том что усиливаем только положительную полу волну, а отрицательную наоборот ослабляем, и усиление не то, и сигнал искажен.

Делаем смещение на 128 при (256, 8 бит) пришло 10 ушло 20, пришло -10 ушло -20.

В общем то дельное замечание
RedD
Но и сигнал тогда на вход двухполярный нужен, операционник с двуполярным питанием, как то так, ну ессно смещение в половину AREF,
Alexashka
Цитата(RedD @ Jan 11 2016, 21:46) *
но дело даже не в постоянной составляющей, например ...
Делаем смещение на 128 ...

Вот именно -все дело в ней, в постоянной составляющей sm.gif эти 128 на которые смещён сигнал -это и есть постоянная составляющая, которую обычно добавляют специально, чтобы корректно оцифровать знакопеременный сигнал.
Делая вычитание 128 Вы удаляете эту постоянку sm.gif
Проблема в том, что точно Вы не знаете какая именно постоянка присутствует на входе АЦП, поэтому иногда сначала накладывают ФВЧ, который ее удаляет в силу своей природы, а потом уже делают все остальные преобразования с сигналом. Теперь понятно, что для этого удобнее работать со знаковыми (signed) переменными.
Цитата
Но и сигнал тогда на вход двухполярный нужен, операционник с двуполярным питанием, как то так, ну ессно смещение в половину AREF,

Ну это если АЦП у Вас в контроллере позволяет работать с двуполярным сигналом (чаще бывает диф.вход,т.е сигнала подается два - полезный со смещением и собственно смещение (или если хотите парафазные сигналы), при этом оба сигнала однополярные, что гораздо проще реализуется в кристаллах, ну и смещение удаляется автоматически самим АЦП).
RedD
Да не АЦП однополярный, делаем смещение и ввиду того что сигнал двуполярный он будет играть около точки смещения.

И тогда получается что

adc=ADCL,
if (adc<128) {
x=-(128-adc),
}
else
x=adc-128,
Alexashka
Цитата(RedD @ Jan 12 2016, 00:42) *
И тогда получается что

adc=ADCL,
if (adc<128) {
x=-(128-adc),
}
else
x=adc-128,

Да можно проще sm.gif
Код
signed char x;
x = ADCL - 128;


И еще, без использования аналогового АРУ 8 бит для оцифровки звука будет слишком мало. Я бы ориентировался на 12 бит (в крайнем случае 10).
RedD
Цитата(Alexashka @ Jan 12 2016, 02:39) *
Да можно проще sm.gif
Код
signed char x;
x = ADCL - 128;


И еще, без использования аналогового АРУ 8 бит для оцифровки звука будет слишком мало. Я бы ориентировался на 12 бит (в крайнем случае 10).


x = ADСL - 128; да проще,

Напрашивается мысль смещение вычислять автоматически, ну не знаю, допустим при включении, или используя второй канал АЦП,
Хотя если хорошо застабилизировать цепь смещения, то и так никуда не денется

Про то что 8 бит мало, это понятно, но обкатать можно и на 8 битах,

Кстати у 8 бит avr, тоже есть инструкция ASR ....
RedD
А понял, если наложить ФВЧ то и получим смещение, ....
Но накладно по ресурсам, можно взять резистор 50кОм, подключить к АЦП, заблокировать на корпус ну 10тью МКФдами, и другим каналом мерить,
благо их у avr как минимум восемь.

А усиление ослабление как делать правильно? Через коэффициенты передачи фильтров или напрямую можно ?

По эквалайзеру ....

Сделал три полосовых фильтра с перекрытием в 30 процентов в полосе 0,3 - 3,4 кГц, НЧ, СЧ, ВЧ, для каждого фильтра свой Кус,
int Kus1,Kus2,Kus3;
Прогоняем сигнал через фильтра, каждую полосу или усиливаем или ослабляем или не трогаем Кus=1.
Получаем Y1,Y2,Y3 - выходные данные фильтров,

Y1=Y1*Kus1;
Y2=Y2*Kus2;
Y3=Y3*Kus3;


Правильно ли будет что

Y0=Y1||Y2||Y3, где Y0 общий выходной сигнал ?

По компрессору ...
В статье которую я приводил формула SPL такая

X(n)=10log((1/m)*((Сумма i=0,m-1)X2[n-1])

Может я чего не понял, но это формула работает только для положительных значений adc, так х в квадрате.

Как быть ?????????

И еще много вопросов )

А лана со знаком понятно нужно умножить на (x(n)/x(n)), да и есть более удачный вариант ....
Alexashka
1) Да как Вам удобней, так и делайте.
2) Y0=Y1||Y2||Y3 а это что? перемножение по модулю? или логическое "или"? biggrin.gif не знаю, я бы просто сложил.
3) Не понял о какой статье идет речь.
Цитата
но это формула работает только для положительных значений adc, так х в квадрате
Да ладно?! (+5) и (-5) в квадрате это не одно и то же? wacko.gif
RedD
Ок )

Возми в студенты а ? Вторую вышку хочу получить !
IMaxI
Прошу прощение. А не проще ли использовать аппаратный перемножитель (если конечно таковой присутствует в камне). Просто интересно где то год назад делал простенький ПФ 2-рого порядка на MSP430. Точно во сколько он тактов вылез не скажу (не помню). Но возник вопрос не проще, если имеется аппаратный перемножитель с накоплением использовать его, предворительно сместив коэффициенты в целочисленную область. А учитывая что в том же MSP430 два 16-ти разрядных регистра и 32 разрядный аккумулятор то по моему это прямо конфэтка yeah.gif (там кажется 2 такта всего на перемножение с суммированием уходит). Поругайте если не прав.

PS. Ох помню тогда намучился с переносом коэффициентов в целочисленную область (но благо для фильтра это делается 1 раз).

И еще подскажите где можно почитать про реализацию кольцевых буферов (особенно заинтересовало про размещение буфера по определенным адресам (в чем преимущество)) и на какие грабли при этом можно наступить.
Alexashka
Цитата(IMaxI @ Feb 5 2016, 08:00) *
А учитывая что в том же MSP430 два 16-ти разрядных регистра и 32 разрядный аккумулятор

У автора какбы не совсем MSP430 sm.gif
А так да, штука полезная, у Silabs тоже есть в некоторых камнях встроенный МАС (multiple and accumulate), правда на 40 бит (32 по моему опыту не хватает даже для фильтра 4го порядка -например данные 16 бит, коэфф.тоже 16 бит -это уже 32, плюс сумма нескольких слагаемых - и вот уже переполнение). Чем хорош предложенный тут метод -он сразу ограничивает разрядность данных уже при умножении на коэффициент, поэтому для сумматора можно использовать переменные небольшой разрядности.
RedD
dspic тоже не плох
RedD
Не хотел новую тему создавать, а можно загрузить tetris for led display AVR ?
Ну и есть под Turbo C 3.2 Dos (отладочная),
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.