|
|
  |
Цифровой Фильтр на ATmega, Цифровой Фильтр на ATmega |
|
|
|
Jan 11 2016, 19:38
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(RedD @ Jan 11 2016, 21:46)  но дело даже не в постоянной составляющей, например ... Делаем смещение на 128 ... Вот именно -все дело в ней, в постоянной составляющей  эти 128 на которые смещён сигнал -это и есть постоянная составляющая, которую обычно добавляют специально, чтобы корректно оцифровать знакопеременный сигнал. Делая вычитание 128 Вы удаляете эту постоянку  Проблема в том, что точно Вы не знаете какая именно постоянка присутствует на входе АЦП, поэтому иногда сначала накладывают ФВЧ, который ее удаляет в силу своей природы, а потом уже делают все остальные преобразования с сигналом. Теперь понятно, что для этого удобнее работать со знаковыми (signed) переменными. Цитата Но и сигнал тогда на вход двухполярный нужен, операционник с двуполярным питанием, как то так, ну ессно смещение в половину AREF, Ну это если АЦП у Вас в контроллере позволяет работать с двуполярным сигналом (чаще бывает диф.вход,т.е сигнала подается два - полезный со смещением и собственно смещение (или если хотите парафазные сигналы), при этом оба сигнала однополярные, что гораздо проще реализуется в кристаллах, ну и смещение удаляется автоматически самим АЦП).
|
|
|
|
|
Jan 11 2016, 20:42
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 1-01-16
Из: Красный Яр
Пользователь №: 89 904

|
Да не АЦП однополярный, делаем смещение и ввиду того что сигнал двуполярный он будет играть около точки смещения.
И тогда получается что adc=ADCL, if (adc<128) { x=-(128-adc), } else x=adc-128,
Сообщение отредактировал RedD - Jan 11 2016, 21:41
|
|
|
|
|
Jan 12 2016, 09:01
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 1-01-16
Из: Красный Яр
Пользователь №: 89 904

|
Цитата(Alexashka @ Jan 12 2016, 02:39)  Да можно проще  Код signed char x; x = ADCL - 128; И еще, без использования аналогового АРУ 8 бит для оцифровки звука будет слишком мало. Я бы ориентировался на 12 бит (в крайнем случае 10). x = ADСL - 128; да проще, Напрашивается мысль смещение вычислять автоматически, ну не знаю, допустим при включении, или используя второй канал АЦП, Хотя если хорошо застабилизировать цепь смещения, то и так никуда не денется Про то что 8 бит мало, это понятно, но обкатать можно и на 8 битах, Кстати у 8 бит avr, тоже есть инструкция ASR ....
Сообщение отредактировал RedD - Jan 13 2016, 02:53
|
|
|
|
|
Jan 12 2016, 13:57
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 1-01-16
Из: Красный Яр
Пользователь №: 89 904

|
А понял, если наложить ФВЧ то и получим смещение, .... Но накладно по ресурсам, можно взять резистор 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)), да и есть более удачный вариант ....
Сообщение отредактировал RedD - Jan 13 2016, 00:59
|
|
|
|
|
Jan 13 2016, 01:04
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
1) Да как Вам удобней, так и делайте. 2) Y0=Y1||Y2||Y3 а это что? перемножение по модулю? или логическое "или"?  не знаю, я бы просто сложил. 3) Не понял о какой статье идет речь. Цитата но это формула работает только для положительных значений adc, так х в квадрате Да ладно?! (+5) и (-5) в квадрате это не одно и то же?
|
|
|
|
|
Jan 14 2016, 00:56
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 1-01-16
Из: Красный Яр
Пользователь №: 89 904

|
Ок )
Возми в студенты а ? Вторую вышку хочу получить !
Сообщение отредактировал Herz - Feb 6 2016, 09:54
|
|
|
|
|
Feb 5 2016, 05:00
|
Участник

Группа: Участник
Сообщений: 47
Регистрация: 25-09-09
Из: Красноярск
Пользователь №: 52 562

|
Прошу прощение. А не проще ли использовать аппаратный перемножитель (если конечно таковой присутствует в камне). Просто интересно где то год назад делал простенький ПФ 2-рого порядка на MSP430. Точно во сколько он тактов вылез не скажу (не помню). Но возник вопрос не проще, если имеется аппаратный перемножитель с накоплением использовать его, предворительно сместив коэффициенты в целочисленную область. А учитывая что в том же MSP430 два 16-ти разрядных регистра и 32 разрядный аккумулятор то по моему это прямо конфэтка  (там кажется 2 такта всего на перемножение с суммированием уходит). Поругайте если не прав. PS. Ох помню тогда намучился с переносом коэффициентов в целочисленную область (но благо для фильтра это делается 1 раз). И еще подскажите где можно почитать про реализацию кольцевых буферов (особенно заинтересовало про размещение буфера по определенным адресам (в чем преимущество)) и на какие грабли при этом можно наступить.
Сообщение отредактировал IMaxI - Feb 5 2016, 05:08
|
|
|
|
|
Feb 6 2016, 08:43
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 1-01-16
Из: Красный Яр
Пользователь №: 89 904

|
dspic тоже не плох
|
|
|
|
|
Apr 11 2018, 07:29
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 1-01-16
Из: Красный Яр
Пользователь №: 89 904

|
Не хотел новую тему создавать, а можно загрузить tetris for led display AVR ? Ну и есть под Turbo C 3.2 Dos (отладочная),
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|