Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Детская площадка "Часть-1" - Звуковой изменятор )))


Детская площадка "Часть-1" - Звуковой изменятор )))

Сообщений 31 страница 48 из 48

31

Пётр написал(а):

Тогда поделитесь с нами как можно в 4 КБ поместить звуковой поток с частотой дискретизации 44100 Гц продолжительностью несколько секунд для затухающего эхо.
Посчитайте сколько для этого нужно ОЗУ при 8-ми битной оцифровке.
Кроме того нужна память под эффект изменения частоты звука.

Устал объяснять, ты не слушаешь, летаешь в своих облаках. Повторю основы, для голоса надо 2-4К, задержка получится в районе 1 сек, при том, что нужно искажение - оно и получится.
Я этим игрался несколько лет назад, норм всё было, ещё и АРУ можно прикрутить в реалтайме.

Отредактировано RDW (2020-09-17 20:34:53)

0

32

Даже производительности Xmega еле хватает, но что-то получается:

Сделал пробник, прерывания аппаратные, вообще можно даже на ДМА сделать. Код изменяет тональность голоса.

Код:
$regfile = "xm32a4udef.dat"
$crystal = 32000000
$hwstack = 80
$swstack = 80
$framesize = 80

Config Osc = Enabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled



Config Portb.2 = Output                                     'Выход звука
Config Porta.4 = Input                                      'Вход звука

Config Adca = Single , Convmode = Unsigned , Resolution = 8bit , Dma = Off , Reference = Intvcc , Bandgap = Enabled , _
Event_mode = None , Prescaler = 512 , Sweep = Ch0 , _
Ch0_gain = 1 , Ch0_inp = Single_ended , Mux0 = &B0_0100_000 , _


Config Dacb = Enabled , Io0 = Enabled , Channel = Single , Reference = Int1v , Interval = 1 , Refresh = 512


Tcc1_per = 100                                              'Частота оцифровки
Tcd1_per = 200                                              'частота вывода буфера
Const Dlbuf = 50                                            'Длина буфера


Config Tcc1 = Normal , Prescale = 8 , Event_action = Restart
Config Tcd1 = Normal , Prescale = 8 , Event_action = Restart

Dim S(1600) As Word
Dim W As Word
Dim Tm As Word
Dim Tm2 As Word


On Tcc1_cca Adcinput
Enable Tcc1_cca

On Tcd1_cca Dacout:
Enable Tcd1_cca , Hi
Enable Interrupts




Do

nop
nop
nop

Loop



End


Adcinput:
If Tm < Dlbuf Then
   Incr Tm
   S(tm) = Getadc(adca , 0 )
   Else
   Tm = 0
End If

Return

Dacout:

If Tm2 < Dlbuf Then
   Incr Tm2
   Dacb0 = S(tm2)
   Else
   Tm2 = 0
End If

Return

0

33

Частота оцифровки 40 тысяч в секунду?
Я думаю можно снизить до 16 тысяч в секунду. 8 кГц достаточно для голоса.

Посмотрите поддерживает ли xmega аппаратный запуск оцифровки по событию таймера и копирование оцифрованных данных в память используя DMA. Это избавит от десятков тысяч прерываний в секунду значительно снизит нагрузку на процессор.
С выводом аналогично. ЦАП запускается по событию таймера и используя DMA загружает данные из памяти (массива).
Работа сведется к извлечению данных из кольцевого буфера АЦП их обработке и копированию в кольцевой буфер ЦАП.

Ev3658 написал(а):

Код изменяет тональность голоса.

Как звучит? По моему этот метод при уменьшении частоты создаст наложение звука типа "эхо" которое будет очень неприятным на слух.
Если есть возможность, выложите запись звучания этого кода.

0

34

Пётр написал(а):

Как звучит?

Уже жену напугал, всё-же плату надо добавить регулировками, микрофон очень чувствительный и шумы сторонние тоже воспроизводит.

В DMA есть плюс, но DMA ведь работает параллельно программе, процессор общий, он не может обрабатывать программу и DMA одновременно, всё-же как вариант для выжимания из Xmega всё самое то)))

АЦП может давать некоторые виды событий, это позволит брать готовые данные из регистра АЦП и вкладывать его в какой нибудь адрес памяти. ДМА тактируя от переполнения таймера будет создавать массив, другой канал ДМА будет выкидывать его.
Из минусов - обработка данных при получении, там смогу регулировать три параметра на аппаратном уровне:
- Частота запроса АЦП
- Частота вывода из массива данных в ЦАП
- Размер массива данных

Чисто теоретически можно создать и эхо, правда не полноценное, но всё-же годное.
Будет время сегодня, сниму видео, просто пока проблема с динамиком, картонный орёт как бешенный, ночью не попрограммируешь, а днём жена бесится (раз...раз...два.....раз...два...три....)  :D

0

35

Ev3658 написал(а):

В DMA есть плюс, но DMA ведь работает параллельно программе, процессор общий, он не может обрабатывать программу и DMA одновременно

Копирование с помощью DMA требует меньше тактов чем вход в прерывание, выполнение кода и выход из прерывания. Не знаю как в xmega, а в меге сохранение/восстановление регистров требует около 50 тактов Время обработки INT0
DMA в любом случае будет быстрее.

Ev3658 написал(а):

АЦП может давать некоторые виды событий, это позволит брать готовые данные из регистра АЦП и вкладывать его в какой нибудь адрес памяти. ДМА тактируя от переполнения таймера будет создавать массив, другой канал ДМА будет выкидывать его.

Цепочка должна быть такой. Переполнение таймера запускает АПЦ. Окончание оцифровки запускаем DMA. То есть ведущий таймер а не АЦП. С какой частотой он будет переполняться, с той производится оцифровка.

Ev3658 написал(а):

пока проблема с динамиком, картонный орёт как бешенный

Последовательно с динамиком резистор на несколько десятков ом и нет проблем.

0

36

Ev3658 написал(а):

Даже производительности Xmega еле хватает

Ну да, не разгонишься, каждый шаг надо продумывать. Если хоть как-то обрабатывать звук в Hi-Fi качестве, то надо минимум от 100МГц МК. Впрочем здесь частоты небольшие должны быть и задача не сложная, можно без всяких и DMA обойтись...а так да, я по этому просто ушел на DSP.)

Ev3658 написал(а):

микрофон очень чувствительный и шумы сторонние тоже воспроизводит

Ну аналог - есть аналог, тут важны и фильтры по питанию аналоговой части МК, и разводить чуть продуманнее, и фильтры по входам... Хотя сейчас главное программную часть завести, остальное думаю подтянется.
Судя по коду, ты решил юзать ацп без калибровки и некого алгоритма корректного считывания, возможно по этому лезут доп. помехи. На самом деле, когда ты обрабатываешь данные просто с датчиков этого всего не видно, но в реальности, когда слушаешь ушами, влияет даже алгоритм обработки/вычислений при работе звука (округление чисел, хотя казалось бы, что там сюсюкаться). То, что кажется незначительным, оптимизированным потом выходит боком при конечном результате.
Например, когда мы скажем из 16 бит хотим получить 12 или из 12 > 8, то можно смекнуть, что достаточно в коде быстро сдвинуть байт и всё, типа будет счастье. На самом деле, для лучшего получения качества на выходе, нужно делать деление с плавающей точкой, а затем правильное округление, тогда на выходе получается совершенно другой звук (мягкий). Единственное соглашусь, что для таких целей проще юзать МК с плавающей точкой или уходить в большие целочисленные вычисления (32-бит). Впрочем последнее можно организовать и на хмеге, если штатная функция баскома не устраивает. В общем поле экспериментов не паханое. :)

Отредактировано RDW (2020-09-21 10:25:14)

0

37

RDW написал(а):

Если хоть как-то обрабатывать звук в Hi-Fi качестве, то надо минимум от 100МГц МК.

Разве это проблема? :)
С такими частотами давно выпускают МК. :)
Мне хватило 72 МГц для оцифровки двух каналов на частоте 44100 Гц, обработки звуковых данных, выполнения цифрового АРУ, отправки их по USB в комп. У МК осталось много свободного времени для выполнения других задач.
Звучит нормально учитывая что по факту разрядность оцифровки 8 - 10 бит в зависимости от громкости.

RDW написал(а):

Впрочем здесь частоты небольшие должны быть и задача не сложная, можно без всяких и DMA обойтись

Зачем отказываться от DMA если это позволит разгрузить процессорное ядро потому что работа МК на пределе можете привести к тому что не получится выполнить все задачи вовремя.

0

38

Пётр написал(а):

Зачем отказываться от DMA если это позволит разгрузить процессорное ядро

Как показала практика использования Хмеги, когда мы игрались с DMA и попыткой выводить видео данные через него, то оказалось, что ресурсы общие (пока работает DMA, основной код выполнения приостанавливается). Такой подход удобен, когда DMA занято небольшими промежутками времени, иначе данные после отработки DMA тоже надо куда-то девать или подготавливать. Да если через DMA делаешь получить данные и отправить, то оно происходит независимо, как только надо что-то ещё делать с данными и быстро, то основное ядро начинает тормозить процесс, от этого никуда не деться. Т.ч. DMA не панацея от всего.  :dontknow:

Пётр написал(а):

Мне хватило 72 МГц

Ну у меня ХМега гналась корректно макс до 48МГц и если с отваливанием части функционала до 54МГц - это даже близко на 70 не похоже.)

0

39

RDW написал(а):

оказалось, что ресурсы общие (пока работает DMA, основной код выполнения приостанавливается).

Я выше писал почему используя DMA будет преимущество по сравнению с прерываниями. Не нужно сохранять/восстанавливать регистры и как показала практика, число тактов при копировании процессором в массив больше чем аналогичное действие используя DMA. Баском не оптимизирует код отсюда лишние такты.

RDW написал(а):

Такой подход удобен, когда DMA занято небольшими промежутками времени, иначе данные после отработки DMA тоже надо куда-то девать или подготавливать.

В данном случае DMA копирует через промежутки времени равные частоте оцифровки. Его использование требует меньше тактов чем прерывания.

RDW написал(а):

Ну у меня ХМега гналась корректно макс до 48МГц

Я не про разгон и вообще не про хмегу...

0

40

К сожалению даже на телефон не могу снять.
Издевался как мог, спасибо за идеи, причём штука интересная для экспериментов.
Голос получилось сделать даже с эхо, но разово и далее не понял как, шаманство в экспериментальном экстазе дало понять что это возможно.

В целом DMA тут не нужен, так как приходится некоторые шумные биты отрубать и громкость ограничивать и многое другое.

Пытался даже ультразвук услышать ей, но нет тех.возможности сделать микрофон.

8 бит хватает за глаза, 12 бит уже сложнее, но на удивление серия Xmega логические операции над 16 битными переменными проводит так-же как и с 8 битными переменными.
Проблемы с АЦП есть, в прерываниях работает вполне годно, но в теле программы не получается опрос другого мультиплексора или другого канала.
Чувствительность с Reference = Intvcc при 12 бит очень сильная, порой даже слышно что-то из потустороннего мира, собственно от этого шума и сложно было ставить эксперименты, соседи то ладно, а вот супруга немного не согласна с обстановкой к квартире.

Стыдно показывать этот кусок кода, но всё-же сам-же полезу что нибудь использовать:

код
Код:

$regfile = "xm32a4udef.dat"
$crystal = 32000000
$hwstack = 180
$swstack = 180
$framesize = 180

Config Osc = Enabled , 32mhzosc = Enabled
Config Sysclock = 32mhz , Prescalea = 1 , Prescalebc = 1_1
Config Priority = Static , Vector = Application , Lo = Enabled , Med = Enabled , Hi = Enabled



Config Portb.2 = Output                                     'Выход звука
Config Porta.4 = Input                                      'Вход звука
Config Porta.3 = Input                                      'Вход управления тональностью
Config Adca = Single , Convmode = Unsigned , Resolution = 8bit , Dma = Off , Reference = Intvcc , Bandgap = Enabled , _
Event_mode = None , Prescaler = 32 , Sweep = Ch0 , _
Ch0_gain = 1 , Ch0_inp = Single_ended , _


Config Dacb = Enabled , Io0 = Enabled , Channel = Single , Reference = Avcc , Interval = 1 , Refresh = 256
Dim Eho As Bit
Dim Dlbuf As Word

'----- Приемлемый бас
Tcc1_per = 100                                              'Частота оцифровки   (АЦП)
Tcd1_per = 5000                                             'частота вывода буфера (ЦАП) (от 30)

Const Dlbuf_mas = 1000                                      'Длина буфера
Eho = 0


Const Vol = 1                                               'Сдвиг байта АЦП

Const Srez = 1000                                           'Значение АЦП для уменьшения громкости
Const Porog = 2                                             'убавление громкости при срезе

Const Filter = &B0000_1111_1111_1111                        'Логическая операция с АЦП &AND
Const Filter_zagl = &B0000_0000_0000_1111                   'Заглушка шумных разрядов (бит на ЦАП)

'(
'----- Приемлемый бас
Tcc1_per = 400                                              'Частота оцифровки
Tcd1_per = 500                                              'частота вывода буфера
Const Dlbuf = 100                                           'Длина буфера


'====== Эхо
Tcc1_per = 50                                               'Частота оцифровки
Tcd1_per = 400                                              'частота вывода буфера
Const Dlbuf = 1500                                          'Длина буфера
')
Config Tcc1 = Normal , Prescale = 8 , Event_action = Restart
Config Tcd1 = Normal , Prescale = 8 , Event_action = Restart

Dim S(dlbuf_mas) As Byte                                    'Воспроизводимый Буфер
Dim B As Byte
Dim W As Word
Dim W1 As Word
Dim W2 As Word
Dim Tm As Word
Dim Tm2 As Word


Tm2 = Dlbuf_mas



On Tcc1_cca Adcinput
Enable Tcc1_cca , Lo

On Tcd1_cca Dacout:
Enable Tcd1_cca
Enable Interrupts




Do



Loop




Adcinput:

   'Disable Interrupts

   W1 = Getadc(adca , 0 , &B00_100_0_00 )                   '&B00_100_0_00
   'Enable Interrupts

   W1 = W1 And Filter
   Shift W1 , Left , Vol                                    'Усиление

   Incr Tm
   If Tm > Dlbuf Then Tm = 1
   S(tm) = W1
   'If Tcc1_per => Tcd1_per Then

      'If Tm = Dlbuf Then Tm2 = 0
      'Elseif Eho = 0 Then
         'Tm2 = Tm
   'End If

Return

Dacout:
   Incr Tm2
   If Tm2 > Dlbuf Then Tm2 = 1
   W2 = S(tm2)

   If W2 > Srezthen
     'Shift W2 , Right , Porog
   End If
   W2 = W2 Or Filter_zagl

   Dacb0 = W2


 '(  Disable Interrupts

 W = Getadc(adca , 0 , &B00_011_0_00 )                      '&B00_100_0_00

Enable Interrupts
W = W * 2
W = W + 360
'Tcd1_per = W
W = W - 360
W = W / 5
W = W + 10
If Dlbuf < Dlbuf_mas Then Dlbuf = W
W = 0
')



Return

0

41

Ev3658 написал(а):

не получается опрос другого мультиплексора или другого канала

Почитай как работать с АЦП а ХМега, там немного не как в обычной атмеге + свои нюансы (я тебе о них уже говорил и показывал на примерах, ты почему-то упорно игноришь всё это).

0

42

Ev3658 написал(а):

приходится некоторые шумные биты отрубать и громкость ограничивать

Нужен усилитель с АРУ чтобы уменьшать усиление если громко кричать в микрофон.

Ev3658 написал(а):

собственно от этого шума и сложно было ставить эксперименты

Вместо динамиков используйте наушники. Тогда окружающим не будете мешать.

0

43

RDW написал(а):

почему-то упорно игноришь всё это

Не, не игнорирую, так-то механизм понятен, но не помню ограничения АЦП, оно там по выборкам и мультиплексорам не очень описано в переведённой литературе. Удивило то что в Xmega256A3U не получалось и не работало стабильно, а тут шум на 1-2 бита, высокая чувствительность, отзывается на смену опорного напряжения (Xmega32A4U).
Есть ещё особенности и режимы МК, которые создают меньший шум на АЦП, они где-то описаны к Mega серии где то в "Спящий режим", в Xmega не ознакомлен ещё с этим.

Пётр написал(а):

используйте наушники

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

0

44

Пётр написал(а):

Нужен усилитель с АРУ чтобы уменьшать усиление

Усложняет схему для повторения, и так Xmega с недоступным PDI программатором для юных радиолюбителей.
Тут бы как можно проще, печатку лучше переделать на построечный резистор (может два), на борту припаивается готовый стерео усилитель 2х2,5вт., картонные динамики от него безума, всё-же как оказалось нужна акустическая система воспроизведения разделения частоты.

При изменении частоты урезается канал, его надо местами как-то усилить, то-есть по уму аппаратный эквалайзер был бы не лишним, руки чешутся, но это усложняет проект. По этому может попробовать использовать второй канал ЦАП или ШИМ для усиления некоторых частот.

Голову не могу сломать, чтоб представить в целом звук.
Мой попугай ЧуЧа живёт как часы, примерно час в день она издаёт громкий крик, который на расстоянии 5-10см. резонирует с колокольчиком от старого телефона, привязанным на верёвке. Это делает выборочно, хочет чтоб колокольчик ей ответил, кричит одной амплитудой и так.... оглохнуть можно если будет стая. Колокольчик толстый, 1-1,5мм толщина, пальцем ударить больно чтоб вызвать такой шум как попугай своим криком. Прошу прощения, занесло чуток, просто мысли  :glasses:
https://upforme.ru/uploads/0000/25/b8/1295/t684480.png

0

45

Ev3658 написал(а):

свист в динамике это жесть

Устраняется легко. Создаете задержку на 0.2 секунды между входящими и исходящими данными и даже если возникнет обратная связь, ее частота составит не больше 5 Гц и легко можно отфильтровать уменьшением усиления низких частот в микрофонном усилителе.

Ev3658 написал(а):

Усложняет схему для повторения, и так Xmega с недоступным PDI программатором для юных радиолюбителей.

Я уже предлагал другую и более доступную элементную базу на STM32. Есть относительно дешевые платы, программатор/отладчик за 100 рублей и т. д. ОЗУ много по сравнению с AVR и как я уже писал, оно нужно для получения качественных эффектов.
Если нужна хорошая повторяемость, лучше следовать путем ардуино - готовые платы которые соединяют проводами.

+1

46

Пётр написал(а):

Устраняется легко. Создаете задержку на 0.2 секунды между входящими и исходящими данными

Либо аппаратно/программно, инвертируешь вход относительно выхода (такой способ используется с каменных веков в эстраде). :flirt:

+1

47

RDW написал(а):

инвертируешь вход относительно выхода

Гениально  :idea:

0

48

RDW написал(а):

Либо аппаратно/программно, инвертируешь вход относительно выхода (такой способ используется с каменных веков в эстраде).

И что даст эффект? Не забываем про скорость распространения звука в воздухе и что обратная связь из-за этого все равно будет.

0


Вы здесь » Программирование ATMEL в BASCOM. » Световые эффекты » Детская площадка "Часть-1" - Звуковой изменятор )))