импорт аудиофайла в МК

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: импорт аудиофайла в МК

Сообщение ARV »

uwrtey писал(а):Аватарку сменили?
умылся просто
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: импорт аудиофайла в МК

Сообщение uwrtey »

Ой, а позвольте еще один вопросик.
да, главное, надо учесть, что "отсутствию звука" в динамике соответствует не ШИМ со скважностью 0%, а ШИМ со скважностью 50%. то есть данные должны быть соответствующим образом "отнормированы" перед выдачей на ШИМ
Тут мне что-то совсем не понятно.
Шим не может сделать на выходе "переменку"... На выходе получаем все ту же кривую ( синусоиду например ), но смещенную в положительную сторону.
Для того что-бы сделать сигнал не смещенным, то нужно использовать специальные схемы на p-n-p + n-p-n транзисторах
ну либо применять специальные микросхемы.
Вроде-бы как то так...
Но микроконтроллер это делать не умеет. И тишина в динамиках будет при скважности 100%
( при условии, что ШИМ не инвертированный, скважность 100% = аналоговому нулю. )

А-а, или вы предлагаете принять за середину ( за нуль ) ШИМ с 50% коэффициентом заполнения ??? ( при питании 5V получится 2,5 V )
Для того что бы колонки могли играть в обе стороны? Нужно сымитировать переменку?
Хм. Хитро...
не зная броду не лезь к вольтмоду
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: импорт аудиофайла в МК

Сообщение ARV »

не забывайте, что ШИМ вы обязаны отфильтровать LC-фильтром, иначе такое услышите...
но если использовать частоту ШИМ вне звукового диапазона, о чем я и намекал (для МК со встроенными PLL есть смысл выжимать все 250 кГц), то сама катушка динамика будет неплохим фильтром - с частотой 250 кГц она колебаться не сможет физически, и от фильтра можно отказаться: когда вы подадите на нее меандр - она будет просто неподвижной, хотя через нее будет течь какой-то ток. это не самый экономичный режим, но зато самый простой.

таким образом амплитуда ШИМ будет от 0 до 255, но на динамике она превратится в от -127 до +127.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: импорт аудиофайла в МК

Сообщение uwrtey »

Приполз с работы домой и еще пару вопросов придумал.
( А может мне просто пообщаться хочется? )

1)
А если частота дискретизации не 4 кГц, а скажем 44100 Гц.
44100 Гц - это частота вне звукового диапазона.
Есть ли смысл делать частоту ШИМ более высокой или можно сделать ее равной частоте смены смены данных в ШИМ ???
С одной стороны упростим решение задачи, а с другой стороны увеличится массив данных.

2)
да, главное, надо учесть, что "отсутствию звука" в динамике соответствует не ШИМ со скважностью 0%, а ШИМ со скважностью 50%. то есть данные должны быть соответствующим образом "отнормированы" перед выдачей на ШИМ
.
Тут поясните пожалуйста.
Данные у меня в виде от 0 до 255.
Звук когда-то был аналоговым сигналом, и после того как АЦП его обработал, звук превратился в данные от 0 до 255 ( это при условии, что АЦП восьмибитный - в нашем случае так оно и есть )
Байтом содержащим 0, стала самая нижняя точка по графику аналогового сигнала. ( самый возможный пик отрицательной полуволны )
Байтом содержащим 255, стала самая верхняя точка по графику аналогового сигнала. ( самый возможный пик положительной полуволны )
Соответственно байтом содержащим ~128, стала точка лежащая на нуле аналогового сигнала.
В таком случае, амплитуда ШИМ будет от 0 до 255, но на динамике она превратится в от -127 до +127. ( И через динамик будет постоянно течь какой-то ток, даже при отсутствии сигнала.. )
И что-же мне мешает в готовом виде выводить эти данные в ШИМ?
Или Вы это и имели в виду? Получается, что мои данные уже отнормированы?

Я если честно другого варианта тут и не вижу...
не зная броду не лезь к вольтмоду
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: импорт аудиофайла в МК

Сообщение ARV »

1. частота сэмплирования определяет предельно возможную частоту в спектре вашего сигнала. если частота семплирования у вас 44,1 кГц это означает, что в сигнале может присутствовать частота вплоть до 22,05 кГц, не более. иначе говоря, частота семплирования определяет "качество" звука. к частоте ШИМ, который выполняет роль ЦАП в данном случае, это относится ровно в той мере, о чем я уже писал: ШИМ не может быть меньшей частоты, чем частота семплирования, но может быть сколь угодно большей частоты.

2. смысл высокой частоты ШИМ я вам объяснял: высокую частоту легко можно отфильтровать, в частности, частоту около 256 кГц можно вообще не фильтровать - динамик ее отфильтрует "естественным" образом. если частота ШИМ больше 20 кГц - уже можно пробовать отказываться от фильтра - на неаудиофильский слух результат может быть приличным. Если ШИМ имеет меньшую частоту - фильтр обязателен, иначе в звуке будет много лишних призвуков, вплоть до постоянного писка или свиста.

3. задайте сами себе вопрос: если у вас в файле записана тишина - какие данные будут в файле? очевидно, что нули - верно? но для того, чтобы динамик молчал, на него надо подавать 50% ШИМ, что для диапазона однобайтного значения соответствует числу 127. то есть в файле 0 - на ШИМ выдаем 127. когда в файле будет самый громкий звук, то число в файле будет от -127 до +127, а на ШИМ подастся соответственно 0 или 254.

если у вас в файле данные хранятся в виде signed short int (или int8_t), перед выводом на ШИМ вы должны просто прибавлять к каждому байту число 127 - вот и все "нормирование". ну или, что то же самое, вычитать из 127 каждый байт файла перед выдачей в ШИМ.

андерстенд?

P.S. на самом деле, если мы говорим о ШИМ в микроконтроллерах AVR, следует учитывать, что FastPWM при задании 0-го уровня (или уровня 255 - это смотря по варианту "прямого" или "инверсного" выхода) будет давать не совсем корректный сигнал. поэтому следует нормировать данные в файле так, чтобы максимальное значение никогда не достигало значения 255 - достаточно остановиться на уровне в 250. тогда нулю будет соответствовать ровно половина, т.е. 125, и в коррекции вместо 127 вы должны будете использовать именно это значение. динамический диапазон слегка сузится, но для 8-битного звука это практически ничего не изменит...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: импорт аудиофайла в МК

Сообщение uwrtey »

3. задайте сами себе вопрос: если у вас в файле записана тишина - какие данные будут в файле? очевидно, что нули - верно?
Нет, не согласен и не очевидно.
Я же в предыдущем сообщении написал, что после обработки АЦП аналоговому нулю будет соответствовать число ~128.
Что-бы не быть голословным, я только что записал тишину и конвертнул файл ( программой от smacorp ) .
Получился массив заполненый числами 0x80
вот:

Код: Выделить всё

; Sample_rate 23452

.db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
.db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
.db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
.db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
.db 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80
.....
Но все равно спасибо за пищу для ума.
Сам спросил - сам ответил. Как говорили выше - так лучше запоминается.
ШИМ не может быть меньшей частоты, чем частота семплирования, но может быть сколь угодно большей частоты.
Это я понял.
Спасибо за то, что пытаетесь разъяснить это еще раз.
Мне просто стало интересно, что если частота ШИМа будет равна частоте семплирования.
Таким образом отпадает необходимость во втором таймере.
А данные можно будет обновлять по прерыванию, которое будет генерироваться компатором того-же таймера на котором построен наш ШИМ.
И данные можно будет обновлять каждый периуд ШИМа.
Это плюс.
Но из минусов то, что данных ( аудио ) станет намного больше....
И скорее всего выгоднее ( памяти в МК AVR не шибко много ) запускать ШИМ на более высокой частоте, а звук генерировать на частоте 4-8 кГц.
P.S. на самом деле, если мы говорим о ШИМ в микроконтроллерах AVR, следует учитывать, что FastPWM при задании 0-го уровня (или уровня 255 - это смотря по варианту "прямого" или "инверсного" выхода) будет давать не совсем корректный сигнал. поэтому следует нормировать данные в файле так, чтобы максимальное значение никогда не достигало значения 255 - достаточно остановиться на уровне в 250. тогда нулю будет соответствовать ровно половина, т.е. 125, и в коррекции вместо 127 вы должны будете использовать именно это значение. динамический диапазон слегка сузится, но для 8-битного звука это практически ничего не изменит...
А вот это очень хорошая идея! Спасибо а подсказку!
Последний раз редактировалось uwrtey Пн июл 20, 2015 22:40:48, всего редактировалось 3 раза.
не зная броду не лезь к вольтмоду
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: импорт аудиофайла в МК

Сообщение ARV »

ну, значит у вас уже отнормированы данные - откуда мне знать было? ;)
обычные знаковые числа так не кодируются
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: импорт аудиофайла в МК

Сообщение uwrtey »

Спасибо, ARV за приятное общение!
Сообщение выше я откорректировал - добавил кучу текста :)
ну, значит у вас уже отнормированы данные - откуда мне знать было?
Да я и сам не знал. Просто по Вашему совету начал логически рассуждать, а затем подтвердил свои догадки экспериментом. Страницей ранее мне с этим вопросом помог разобраться smacorp.
не зная броду не лезь к вольтмоду
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: импорт аудиофайла в МК

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: импорт аудиофайла в МК

Сообщение uwrtey »

О-о, а это уже более развернутый ответ! Спасибо! :beer:

P.S. К новой Вашей аватаре теперь придется привыкать. А я уже привык тому мужику со стаканом. :))
не зная броду не лезь к вольтмоду
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: импорт аудиофайла в МК

Сообщение oleg110592 »

Но из минусов то, что данных ( аудио ) станет намного больше....
можно сжатие аудио прмменить - AVR336: Декодер ADPCM http://www.gaw.ru/html.cgi/txt/app/micros/avr/index.htm
Аватара пользователя
uwrtey
Поставщик валерьянки для Кота
Сообщения: 2309
Зарегистрирован: Пт июл 17, 2009 07:34:07
Откуда: Свердловская обл.

Re: импорт аудиофайла в МК

Сообщение uwrtey »

Это только в том случае если аудиофайл - на самом деле мелодия.
А если это код? То правильно сжать, скорее всего, ни чего не получится.
( Звук, который мы слышим когда работает модем - например )
Тут наверное проще сразу записать его как 4 кГц
А так, конечно, спасибо за совет!
не зная броду не лезь к вольтмоду
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: импорт аудиофайла в МК

Сообщение oleg110592 »

сжать аудиофайл на компьютере, декодировать микроконтроллером
zombie47
Прорезались зубы
Сообщения: 215
Зарегистрирован: Пн ноя 14, 2011 22:48:42

Re: импорт аудиофайла в МК

Сообщение zombie47 »

Много полезной информации узнал из этой ветки. Гуглил просто и нагуглил это. И впринципе то что нужно. Вдумчиво пока не смог все осилить. Да и тут слишком сложная задача была.
У меня задача стоит скопировать звук в микроконтроллер. Но мне прям нужно максимально ужасное качество получить ))) Ну тоесть чтобы звук был каплю похож на оригинал, но тратить на это куча ресурсов мк я не хочу от слова совсем.
Я не могу понять. Если у нас не сжатый звук с частотой сэмплирования 44100hz это значит что 44100 раз в секунду шлется сэмпл длиной битности звука? Тоесть если 44100hz и 32bit = (44100*4байта = ~176 кб в сек?)
Если разбирать дальше что происходит (мне просто так понятнее). Вот есть этот 1 байт звука (для 8 битного звука). 1 сэмпл как я понимаю. например там число 63 которое допустим равно 25% шима, это значит, что в этот сэмпл 25% времени этого сэмпла будет допустим подаваться напряжение и толкать мембрану какого либо динамика, а 75% времени нет.
Как я понял, например у меня есть аудио програма audcity, ей смотрю спектр. и там вижу "громкие частоты" этого звука:
beepsnd.jpg
(95.31 КБ) 31 скачивание
Я вижу тут частоту 1200гц, но если я сэмплирование меняют на меньше чем 2500гц, то этот звук на частоте 1200гц пропадает.
Вот я пробую получить hex файл и получаю (отобразил в DEC для удобства визуального ШИМ%):
beep_hex.jpg
(99.6 КБ) 35 скачиваний
Точнее вот эти же числа в эксель и в визуальном просмотре:
beep_hex_excel.jpg
(173.72 КБ) 40 скачиваний
Помойму я обрытно получил график звука )))
Но для меня это все еще звук высокого качества, для меня слишком много байт на такой короткий звук. Я бы хотел его сократить, буквально до 4 байт, но растянув их во времени.
Как мне из этого выдрать громкие частоты и их длительность?
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: импорт аудиофайла в МК

Сообщение COKPOWEHEU »

[uquote="zombie47",url="/forum/viewtopic.php?p=4662950#p4662950"]Если у нас не сжатый звук с частотой сэмплирования 44100hz это значит что 44100 раз в секунду шлется сэмпл длиной битности звука? Тоесть если 44100hz и 32bit = (44100*4байта = ~176 кб в сек?)[/uquote]
Да. Но 32 бита на семпл это много. 44.1 кГц для минимально разборчивого звука - тоже. В принципе, достаточно 4 кГц 8 бит, но уже заметны искажения.
zombie47 писал(а):Ну тоесть чтобы звук был каплю похож на оригинал, но тратить на это куча ресурсов мк я не хочу от слова совсем.

Код: Выделить всё

ffmpeg -i input.mp3 -ss 3:0.7 -t 0:1 -f wav -acodec pcm_u8 -ar 4000 output.wav
-ss, -t для вырезания нужного фрагмента.
-ar - частота оцмфровки
-acodec - количество бит на семпл. Учтите, что за исключением u8, остальные варианты знаковые.
zombie47 писал(а):но если я сэмплирование меняют на меньше чем 2500гц, то этот звук на частоте 1200гц пропадает.
ну так теорема Котельникова: частота оцифровки сигнала должна быть хотя бы вдвое больше частоты самого сигнала. Причем это теоретический предел, лучше брать запас побольше.
zombie47 писал(а):Как мне из этого выдрать громкие частоты и их длительность?
Фразу не расшифровал, но, возможно, спасет преобразование Фурье - разложение последовательности семплов на набор синусоид.
zombie47 писал(а):У меня задача стоит скопировать звук в микроконтроллер.
Не так давно я делал демо-код воспроизведения 7 секунд wav-файла (9.6): https://karakatitsariscv.github.io/9.timers.html

Код: Выделить всё

CFLAGS += -DAUDIOSRC='"_binary_src_audiodata_wav"'
...
$(builddir)/audiodata.o: $(srcdir)/audiodata.wav
	mkdir -p $(builddir)
	$(CROSS_COMPILE)ld -melf32lriscv -r -b binary -o $@ $<
	$(CROSS_COMPILE)objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents $@ $@

Код: Выделить всё

extern const uint8_t adata_start[]   asm(AUDIOSRC "_start");
extern const uint8_t adata_end[]     asm(AUDIOSRC "_end");
Но можно и проще:

Код: Выделить всё

xxd -i input.bin > output.h
zombie47 писал(а):например там число 63 которое допустим равно 25% шима, это значит, что в этот сэмпл 25% времени этого сэмпла будет допустим подаваться напряжение и толкать мембрану какого либо динамика, а 75% времени нет.
Не совсем. Частота ШИМ и частота оцифровки это разные вещи. Например, при той же 4 кГц оцифровки у вас может быть 32 кГц ШИМ, тогда на один семпл уйдет 8 периодов ШИМ. А несущую ШИМ и стоит выбирать повыше - за пределами слышимости человека. Считается, что минимум 20 кГц, но некоторые и это слышат. Поэтому опять же берите с запасом. Другое дело, что на высокой частоте может не хватить скорости таймера. Также не лишним будут и обычные аналоговые фильтры.
С другой стороны, ШИМ это ведь всего лишь дешевая замена ЦАП. Ничто не мешает для воспроизведения звука полноценный ЦАП и использовать.
roman.com
Друг Кота
Сообщения: 9149
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: импорт аудиофайла в МК

Сообщение roman.com »

если что...
в соседней теме мы передавали звук по интернету... с помощью МК
https://radiokot.ru/forum/viewtopic.php?f=57&t=182976
СпойлерИзображение
СпойлерИзображение
СпойлерИзображение
СпойлерИзображение
СпойлерИзображение
и т.д.
Ответить

Вернуться в «AVR»