ATMEL_AVR
Apr 18 2006, 19:22
Помогите с алгоритмом, либо любой другой информацией по реализации цифрового фильтра на AVR микроконтроллере. Есть программатор STK500 и микроконтроллеры ATMega16 и ATTiny26.
Цитата(ATMEL_AVR @ Apr 18 2006, 23:22)

Помогите с алгоритмом, либо любой другой информацией по реализации цифрового фильтра на AVR микроконтроллере. Есть программатор STK500 и микроконтроллеры ATMega16 и ATTiny26.
поможем. НО не умалчивайте
1) характеристики сигналов: динамический диапазон, частота сэмплов
2) что вы хотите добиться фильтром. фильтр частотный?
3) точность фильтра.
практика показывает что помочь будет проще, зная изначальную задачу. а может вам вообще фильтр как таковой не нужен......
ATMEL_AVR
Apr 19 2006, 17:59
Спасибо за помощь, попробую разобраться с AVR222.
Мне нужен обычный цифровой фильтр, обрабатывающий речь 300-3400Гц, выходной сигнал записывается на компьютер, потом нужно сравнить исходный файл и преобразованный сигнал.
Можно еще поподробнее написать о том, как расчитать коэффициенты фильтра по заданным характеристикам сигнала.
Andy Mozzhevilov
Apr 20 2006, 02:48
Цитата(ATMEL_AVR @ Apr 19 2006, 23:59)

Спасибо за помощь, попробую разобраться с AVR222.
Мне нужен обычный цифровой фильтр, обрабатывающий речь 300-3400Гц, выходной сигнал записывается на компьютер, потом нужно сравнить исходный файл и преобразованный сигнал.
Можно еще поподробнее написать о том, как расчитать коэффициенты фильтра по заданным характеристикам сигнала.
Не бывает "обычных" цифровых фильтров, по типу обычных стиральных порошков.
Сформулируйте полностью задачу, поскольку вопрос у вас не получается задать.
Что вы имеете на входе и что хотите получить на выходе?
defunct
Apr 20 2006, 14:18
Цитата(ATMEL_AVR @ Apr 19 2006, 20:59)

Мне нужен обычный цифровой фильтр, обрабатывающий речь 300-3400Гц, выходной сигнал записывается на компьютер, потом нужно сравнить исходный файл и преобразованный сигнал.
Imho если полоса сигнала неизменна, и сдвиг фазы не важен, может быть для такой задачи целесообразнее и проще реализовать аналоговый(ые) фильтр(ы). С выхода фильтра пропустить сигнал через опер с требуемым коэффициентом усиления и на АЦП AVR-ки.
ATMEL_AVR
Apr 21 2006, 18:37
Спасибо за ответы. Мне нужен КИХ фильтр, число коэффициентов от 5-10. Должно быть хорошее быстродействие. Результатом должен быть аналоговый сигнал, который можно прослушать, и увидеть разницу между начальным не обработанным сигналом.
Еще кто-нибудь может подсказать как производить перемножение с помощью перемножающей матрицы.(Просто у меняесть пример фильтра, где умножение на коэффициенты заменено перемножающей матрицей)
Цитата(ATMEL_AVR @ Apr 21 2006, 22:37)

Спасибо за ответы. Мне нужен КИХ фильтр, число коэффициентов от 5-10. Должно быть хорошее быстродействие. Результатом должен быть аналоговый сигнал, который можно прослушать, и увидеть разницу между начальным не обработанным сигналом.
Еще кто-нибудь может подсказать как производить перемножение с помощью перемножающей матрицы.(Просто у меняесть пример фильтра, где умножение на коэффициенты заменено перемножающей матрицей)
делать умножение с помошью матрицы(таблицы) безсмысленно. т.к. АВР делает умножение не медленнее адресации. только память израсходуете.
как я понимаю ваша задача разделяется на
1) А-Ц преобразование
2) реализация цифрового фильтра
3) Ц-А преобразование
собственно интересует точность. 8 бит хватит? вроде для звука худо-бедно подходит. скорость работы фильтра при количестве коэффициентов некритична, т.к. АВРка справится с примерно 200000 умножениями достаточно просто. (это из расчёта 1 умножение на коэффициент при частоте выборок 20кГц).
Какой из КИХ фильтров Вы хотите реализовать? режекторный фильтр? полосовой? НЧ? ВЧ? при каких частотах пропускания/задержания?
ATMEL_AVR
Apr 22 2006, 18:02
Мне нужен полосовой фильтр, полосы пропускания fн=2000 Гц , fв=2800 Гц(полоса должна изменяться в зависимости от выбранных коэффициентов фильтра). Подскажите пожалуйста алгоритм, может быть есть код на ассемблере.
Цитата(ATMEL_AVR @ Apr 22 2006, 22:02)

Мне нужен полосовой фильтр, полосы пропускания fн=2000 Гц , fв=2800 Гц(полоса должна изменяться в зависимости от выбранных коэффициентов фильтра). Подскажите пожалуйста алгоритм, может быть есть код на ассемблере.
если знаете Си, то вот Вам шаблончик на Ваш фильтр.
Код
double coeff[9] = {0.0,2.181e-02,7.557e-04,-.3226,.2943,.2943,-.3226,7.557e-04,2.181e-02};
double delay[9] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
double KIH(double input){
double summ=0;
int i;
for (i=0;i<=7;i++){
delay[i] = delay[i+1];
summ += delay[i]*coeff[i];
}
delay[8] = input;
summ += delay[8]*coeff[8];
return summ;
}
Andy Mozzhevilov
Apr 24 2006, 04:06
Цитата(ATMEL_AVR @ Apr 23 2006, 00:02)

Мне нужен полосовой фильтр, полосы пропускания fн=2000 Гц , fв=2800 Гц(полоса должна изменяться в зависимости от выбранных коэффициентов фильтра). Подскажите пожалуйста алгоритм, может быть есть код на ассемблере.
Даю хороший совет.
Почитайте книгу по ЦОС, например Айфичера (читается легко, хотя есть досадные ошибки перевода). В магазинах должна быть.
Поймёте хотя бы что и к чему, какие бывают и как синтезируются фильтры.
Потом поставьте матлаб, и посмотрите как фильтры там работают.
Сейчас складывается такое ощущение, что вы стоите в чистом поле и просто не знаете в какую сторону бежать.
SasaVitebsk
Apr 24 2006, 19:44
Честно говоря несколько раз просматривал эту тему из любопытства.

Т.е. насколько человеческий альтруизм может быть распространён. Похоже другие думают также как я, только не хотят огорчать тебя.
Итак попробую подытожить.
Тебе всегда помогут (сужу по себе) если у тебя конкретный вопрос, или нюанс какой-то, или упёрся и двигаться некуда! Но взять РАСЧИТАТЬ и НАПИСАТЬ за тебя ...
Ты хоть вопрос изучи!
У меня стоял когда-то такой вопрос. Поискал по поисковикам. Нашёл похожее на сайте TI. Изучил. Скачал программу QED2000. Кой чего разобрал. (явно меньше 10%) Написал, переписал 10 раз и в конце-концов добился результата! Конечно проще написать в форум и попросить написать за тебя. Но тогда следующий раз придётся поступать так-же... Да и в форум писать надо хотябы исходные данные подготовить (например частоту выборок не написал). Пойми даже если два фильтра по характеристикам весьма похожи, то всё равно прогу не заимствуешь. Надо выбрать тип фильтра, крутизну, коэффициенты, и т.д. и т.п. Это же не академическое программирование когда подпрограмме задаётся 150 параметров. Здесь в зависимости от задачи человек минимизирует/оптимизирует прогу и лишнее не пишет. Я например коэффициенты такие выбирал, чтобы сдвигами можно было. Ну и т.д.
Короче давай напрягись хоть немного.
ATMEL_AVR
Apr 25 2006, 18:51
Спасибоза помощь, за советы, я действительно раньше не занимался программированием ЦФ, тем более на микроконтроллере. Просто у меня задание по диплому сделать три Лабораторных работы(для следующег поколения студентов): ЦФ, Реверс, Перестройка по спектру(надо обрабатывать звук, а потом полученное воспроизвести в динамике компьтера). Необходимо наглядно продемонстрировать как на микроконтроллере можно реализовать Цифровую обработку сигнала - Задание руководителя. Я вообще то хотел на Delphi что-нибудь сделать. взял тему по прогаммированию - оказалось микроконтроллер. Подписался под дипломом, надо делать, делаю, но уже времени маловато остается, я хотел взять за основу эксперимент DSP на AVR
http://elm-chan.org/works/vp/report.html. но не могу понять как там происходит умножение на заданные коэффициенты, и как с внешней памятью там работают. Там написано что нужно записать в память микроконтроллера два файла основной и переможающую таблицу, но ведь там память всего 2к, а файлы весят 1,5 и 2,4 кбайта. Извините я новичок, может задаю глупые вопросы, но до защиты диплома остается мало времени, а делать надо, я пытаюсь разобраться, но куда ни посмотри везде примеры на Си, а просто не понимаю как этот язык устроен. Хотел в дипломе попрограммировать, придется программировать, самому придумывать. Спасибо еще раз, что по крайней даете хорошие и правильные советы.
ATMEL_AVR
May 2 2006, 17:51
Здраствуйте. хотел попросить у кого-нибудь программу QED 2000 v3.6.2 , скачал в интернете QED2000 v3.6.4, а к ней ни один кряк не подходит, фильтры она считает. а коэффициенты посмотреть нельзя. Дайте пожалуйста кому не жалко.
Цитата(ATMEL_AVR @ May 2 2006, 21:51)

Здраствуйте. хотел попросить у кого-нибудь программу QED 2000 v3.6.2 , скачал в интернете QED2000 v3.6.4, а к ней ни один кряк не подходит, фильтры она считает. а коэффициенты посмотреть нельзя. Дайте пожалуйста кому не жалко.
см. мои посты выше. я Вам просчитал фильтр, о котором Вы просили.
kanzler
May 4 2006, 10:29
Столкнулся с проблемой того что фильр не работает. Связка такая Полосовой фильтр - синхронный детектор - ФНЧ - ФВЧ. Связка до ФВЧ работает. Фильтр взял от Atmel AVR223. Характеристика ФВЧ: частота среза 0,1 Гц, частота преобразования 5404 Гц. Фильтр IIR второго порядка, коэффициенты рассчитывал в МатЛабе и в QED2000, почти схожи но не суть. На выходе ФВЧ должен быть ноль если сигнал не меняется, и изменение если меняется с частотой от 0,1 Гц, но сиго не происходит. Кто подскажет, что могло случиться?
ATMEL_AVR
May 22 2006, 17:22
Делаю фильтр на Mega16, 23 коеффициента, подскажите как выбрать нормированные коеффициенты, чтобы во время перемноженияи и суммы не было переполнения результата.
kanzler
May 23 2006, 04:43
Цитата(ATMEL_AVR @ May 22 2006, 23:22)

Делаю фильтр на Mega16, 23 коеффициента, подскажите как выбрать нормированные коеффициенты, чтобы во время перемноженияи и суммы не было переполнения результата.
Скорее всего вам надо выбрать разрядность аккумулятора из расчёта Разрядность данных * Разрядность коэффициентов.
ATMEL_AVR
May 30 2006, 18:08
Вроде сделал цифровой фильтр полоса 300-8000 Гц, Fd=16000,
Сейчас делаю эффект называемый pitch, по-русски изменение частоты воспроизводимиго звука,
т.е. из женского получается мужской голос. Посмотрел пример из DSP эксперимент, мне не ясно как там происходит интерполяция, и как в итоге получается сдвинутый по частоте сигнал, может кто-нибудь делал что-нибудь подобное, подскажите.
ATMEL_AVR
Jun 1 2006, 19:04
Вот исходник, может чего усовершенствуете, поможете:
А так вроде работает
;
;----------------------------------------------------------------------------;
; FIR Filter 300-8000
;----------------------------------------------------------------------------;
; Note1: ATMega16 @ 8MHz
;
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m16def.inc" ; tn26def This file is contained in "AVR Family Assembler".
.include "C:\Program Files\Atmel\vpsrc\avr.inc"
.include "C:\Program Files\Atmel\vpsrc\vp_def.inc"
; коэффициенты
.equ k23=-7
.equ k22=-8
.equ k21=-8
.equ k20=-8
.equ k19=-9
.equ k18=-9
.equ k17=-9
.equ k16=-9
.equ k15=-10
.equ k14=-10
.equ k13=-10
.equ k12=255
.equ k11=-10
.equ k10=-10
.equ k9=-10
.equ k8=-9
.equ k7=-9
.equ k6=-9
.equ k5=-9
.equ k4=-8
.equ k3=-8
.equ k2=-8
.equ k1=-7
.equ max=65
;----------------------------------------------------------;
; Program code
.cseg
outi SPL, LOW(RAMEND)
outi SPH, HIGH(RAMEND)
rcall cl_data
rcall init_io
;---------------------------------------;
; Main loop (38.5kHz)
main:
sbis ADCSR, 4 ;Wait for EOC
rjmp PC-1 ;/
sbi ADCSR, 4 ;Clear ADIF
in EL, ADCH ;Read A/D data
sbi ADCSR, 6 ;// start new A/D conversion
outi TCNT1L, 0x0
outi OCR1BH, 0x0
subi EL,45 ;
out OCR1BL, EH ;Update analog output
ldiw Y, 0x70
clrw B
; clrw C ;сохраненные отчеты
; clrw A ;отчеты из памяти
; Cl_Data процедура для очистки памяти данных вначале фильтрации
; addi YL, 41
; ori YL, 0x80
; andi YL, 0xBF
;=====================================
;Z - регистр для загрузки последнего отчета
;В - регистр содержащий знчение костанты
;C - регистр для загрузки предпоследнего разряда,
; для того чтобы потом загрузить предпоследний отчет в последний
; таким образом отчеты здвигаются на один вправо
;=====================================
; k23
ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70
ldi DL,k23
cp DL,ZL
; если результат больше 0 тогда коэф считается отрицательным
brcc PC+3
mul DL,AL
rjmp PC+2
mulsu DL,AL
addw B,T0
ld CL, Y ; загрузка в DL 22 отчета - адрес х71
st -Y,CL ; X23<-X22
inc YL
; B:=X(23)*k23
; в X(23) записывается X(22),
; т.е. в память по ядресу x70 заноситься значение X(22)
;k22
ldi DL,k22
ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70
cp DL,ZL
; если результат больше 0 тогда коэф считается отрицательным
brcc PC+3
mul DL,AL ; беззнаковое умножение
rjmp PC+2
mulsu DL,AL ; DL < 0 , AL - беззнаковое
addw B,T0
ld CL, Y ; загрузка в СL 21 отчета из адрес х72
st -Y,CL ; X22<-X21
inc YL
;k21
;х72
ldi DL,k21
rcall summ
; k20
ldi DL, k20 ; ZL=20,х73
rcall summ
; k19
ldi DL, k19 ; ZL=19,х74
rcall summ
; k18 = -1
ldi DL,k18
rcall summ
; k17
ldi DL,k17
rcall summ
; k16
; ZL=16,х77
ldi DL,k16
rcall summ
; k15
; ZL=15,х78
ldi DL,k15
rcall summ
; k14
; ZL=14,х79
ldi DL,k14
rcall summ
; k13
; ZL=13,х7A
ldi DL,k13
rcall summ
; k12
; ZL=12,х7B
ldi DL,k12
ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70
mul DL,AL ; беззнаковое умножение
addw B,T0
ld CL, Y ; загрузка в СL 21 отчета из адрес х72
st -Y,CL ; X22<-X21
inc YL
; k11
; ZL=11,х7C
ldi DL,k11
rcall summ
; k10
; ZL=10,х7D
ldi DL,k10
rcall summ
; k9
; ZL=9,х7E
ldi DL,k9
rcall summ
; k8
; ZL=8,х7F
ldi DL,k8
rcall summ
; k7
; ZL=7,х80
ldi DL,k7
rcall summ
; k6
; ZL=6,х81
ldi DL,k6
rcall summ
; k5
; ZL=5,х82
ldi DL,k5
rcall summ
; k4
; ZL=4,х83
ldi DL,k4
rcall summ
; k3
; ZL=3,х84
ldi DL,k3
rcall summ
; k2
; ZL=2,х85
ldi DL,k2
ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70
cp DL,ZL
; если результат больше 0 тогда коэф считается отрицательным
brcc PC+3
mul DL,AL ; беззнаковое умножение
rjmp PC+2
mulsu DL,AL ;
addw B,T0
; AL загружается в регистр CL, чтобы в следующим цикле
; отот отчет был перед другим входным сигналом
mov CL,EL ; CL=1,входное значение
st -Y,CL ; X2<-X1
; k1
ldi DL,k1
cp DL,ZL
; если результат больше 0 тогда коэф считается отрицательным
brcc PC+3
mul DL,CL ; беззнаковое умножение
rjmp PC+2
mulsu DL,CL ; DL < 0 , AL - беззнаковое
addw B,T0
; проверка на отрицательный результат
; sbis ADCH, 3
; subi BH,220
st X, BH
; cp BH,ZH
; если результат больше 0 тогда коэф считается отрицательным
; brcc PC+3
mov EH,BH ; в EН записывается сумма произведений DL=k1*x1+k2*x2+...+k23*x23
; rjmp PC+2
; mov EH,EL
rjmp main
; Очистка памяти для загрузки значений отчетов
cl_data:
ldi BL,0b10000000
ldiw Y,0x87
st -Y, BL
inc BL
cpi YL, 0x70
brne PC-3
ret
; Операция суммирования
summ:
; k22
ld AL, Y+ ; загрузка в ZL 23 отчета - адрес х70
cp DL,ZL
; если результат больше 0 тогда коэф считается отрицательным
brcc PC+3
mul DL,AL ; беззнаковое умножение
rjmp PC+2
mulsu DL,AL ; DL < 0 , AL - беззнаковое
addw B,T0
ld CL, Y ; загрузка в СL 21 отчета из адрес х72
st -Y,CL ; X22<-X21
inc YL
; B:=X(22)*k22
; в X(22) записывается X(21),
; т.е. в память по ядресу x71 заноситься значение X(21)
ret
ret
;---------------------------------------;
; Initialize peripherals
init_io:
clr _0
clr _255
dec _255
ldi AL, 0b10100111
mov _NTRL, AL
outi MCUCR, 0b01000000 ;Disable pull-ups
out PORTA, _0 ;АЦП
out DDRA, _0
outi PORTB, 0b11110000 ; SCK, MISO, MOSI
outi DDRB, 0b11110000 ;
outi DDRD, 0b00010000 ; OC1 - выход ЦАП
;A/D converter
outi ADMUX, 0b11100111 ;Ch:7, Vref:2.56V (Можно еще попробовать)
outi ADCSR, 0b11010101 ;Clock:одиночный режим 8000000/32/13=19230 Гц запуск
outi TCCR1A, 0b00110001 ;00-отключен OC1A
;11-OC1B работает в инертированном режиме 1 при совпадении TC1
;00-не используется
;01-WGM11,WGM10-8 битная Phase Correct PWM(ШИМ с точной фазой)
;// 8 bit Correct PWM, using COM1B Установка ШИМ работает вывод В, неинвертированный ШИМ OCB1
outi TCNT1H, 0x00
outi TCNT1L, 0x00 ;// set counter1 to zero Счетный регистр обнуляется
outi TIFR, 0x04 ;// clear counter1 overflow flag флаг разрешения прерывания по переполнению ТС1
outi TIMSK, 0b00001100 ;1-флаг разрешения прерывания по совпадению TC1B
;// enable counter1 overflow interrupt флаг прерывания по переполнению ТС1
outi TCCR1B,0b00000001 ;0-отключена схема подавления помех
;0-сохр счетного регистра по спаду
;0-не используется
;00-WGM13,WGM12-8 разрядная ШИМ
;001-clkI/O=8МГц-тактовая частота счетчика
;// counter1 clock prescale = 1 8000000/256/2=15625 Гц частота дискретизации ШИМ
outi OCR1BH, 0x00 ;// set output compare register B to zero Регистр сравнения очистим
outi OCR1BL, 0x00
ldi ZL, max
ldi ZH, 250
ret
да шож там того программирования - какая разница на микроконтроллере или на персоналке, или в маткаде, сообразил разностное уравнение фильтра нужной конструкции для тебя и все готово. Разностное уравнение или со справочников, или сам состряпай, и все - да желательно изобрази работу этого разностного уравнения в Маткаде например, подав на него шум с полезным сигналом и посмотри что получилось после с шумом и особенно с сигналом. А можешь все теоретически - вывести зону устойчивости фильтра, расчитать шум квантования,

, но вот такие классные фирмы как TI делают много чего за нас, у них файлики в Матлабе, и потом сразу все на Сях под CCS в их же сигнальники заливается, сигнальники то у них классные TMS320F28xx, хотя почему то мой босс торчал на Аналог Девайс, говорит у них сигнально-ориентированные команды правильно реализованы а у техаса нет, но я не спорю, все таки босс, он ваял на аналогах, я на техасах. А вообще скачай книжки с dspguide.com Steve Swith. У меня была скачана с инета элементрарна переведенная на русский язык эта классика, а современные книжки тоже супер, введи в гугле, что тебя интересует на данный момент и дерзай. А спрашивать - правильно люди говорят, ну сделаешь проект, решишь задачу, а ничему не научишься, а вот если бы сначала разобрался. а потом спросил для лучшего усвоения - тогда было бы супер.