Не смотря на простоту идеи, урок про воспроизведение wav долгое время не появлялся. Уложить мелочи по полками оказалось довольно непросто. Уже давно ищу людей, которым не безразлична электроника. Одним из таких, оказался apparatchik, он помог прояснить основные моменты, за что ему отдельное спасибо. Я же попытаюсь изложить все так как понял.
Вернемся к уроку 19, ЦАП (R2R). Вы должны были понять, что имея цепочку резисторов, можно получить несколько уровней напряжения, а из этих уровней напряжения можно сформировать сигнал любой формы. Чем больше задействовано ножек микроконтроллера, тем больше уровней напряжения, тем точнее, можно воспроизвести сигнал.
Понять это не сложно, но лучше привести пример, исходный сигнал:
Допустим у нас используется одна ножка, т.е. 1 бит или 2^1=2 уровня напряжений, что мы увидим на выходе? Правильно:
А чего еще ожидать, напряжение или есть или его нет. Задействуем вторую ножку, т.е. 2 бита, или 2^2=4 ступени:
Для кого не понятно, про какие ступени говорим специально подписал, пока речь идет лишь об их количестве по вертикали :). Видно что график, весьма отдаленно напоминает треугольник. Последний пример для 3 битного ЦАПа, т.е. 2^3=8 ступеней:
Видно, что с каждым битом качество сигнала становится ближе к исходному, но какой считать приемлемым? Обычные звуковые карты имеет 16 битное разрешение. Профессиональные карты все имеют 24 бита. Кстати, не достаточно иметь крутую аппаратуру, нужно чтобы прослушиваемый материал был записан в соответствующем качестве. Поэтому если вы прослушиваете 16 битный wav файл, на 24 битной звуковой, то больше шестнадцати бит вы всеравно не услышите. А вот обратная зависимость может быть с последствиями, файл может не воспроизвестись.
С тем что у нас происходит по вертикали разобрались, теперь горизонталью 🙂 Вам никогда было не интересно, что это за магическое число 44кГц?
Думаю многие слышали, что это частота дискретизации, означает она, то сколько значений мы использовали для построения свого графика. Пример:
За один период, т.е. за 1 секунду мы использовали шесть значений, частота дискретизации 6Гц. А если бы частота была 12Гц, но нам нужно было бы построить такой же график? Нужно каждое второе значение подставлять такое же, как предыдущее.
Думаю понятно, что если даже у вас ЦАП с большой разрядностью, но он медленный и не успевает подставлять эти уровни, то пользы от него большой не будет. Абсолютно верно и обратное, качество звука будет оставлять желать лучшего. Таким образом чем больше бит и выше частота дискретизации тем более выходной сигнал похож на исходный.
Кроме того, нельзя забывать про то, что если мелодия имеет, допустим 8кГц, то значит что исходный сигнал в процессе оцифровки измерялся 8000 раз в секунду или раз в 125 мкс, и записывался в файл. Все остальные данные, которые были в промежутках между этими измерениями, были просто напросто потеряны. Нельзя переконвертировать из 8кГц в 44кГц и получить лучшее звучание. Тоже самое справедливо для глубины звучания.
Самые дешевые звуковые платы поддерживают 44/48кГц, профессиональные 192кГц. Аналогично то, что если ваша карта имеет высокую частоту дискретизации это не означает, что треки будут воспроизводиться с такой частотой. Хотите хорошее качество — прослушиваемый материал должен быть соответствующий. Для домашнего использования самый ширпотреб 16 бит 44кГц этого вполне достаточно.
Кстати, пока рылся на сайтах звуковиков попалась теорема Котельникова — чтобы одназначно восстановить аналоговый сигнал, его нужно оцифровать минимум с удвоенной частотой от максимального значения, это объясняет откуда взято 44кГц. Звуковой диапазон 20-20 000 Гц, следовательно 20 000 * 2 = 40кГц минимальная частота. Хотя, это всего лишь мои домыслы, может все не так на самом деле 🙂
Столько слов, но причем тут wav скажете вы? Да все очень просто, частота дискретизации и количество бит (глубина звучания) это основные характеристики wav файла. Дабы урок не прошел напрасно и было хоть немного практики, попробуем подготовить материал для следующего урока. Задача преобразовать файл. Первое что пришло в голову, звук для будильника — пение петуха.
Нужно его переконвертировать в более удобоваримый для микроконтроллера формат. В качестве выходного формата будем использовать 8 бит, 8кГц, моно. Звуковых редакторов тьма, причем бесплатных, какой использовать посоветовать не могу, ибо не интересуюсь. С незапамятных времен использую Sound Forge, в нем есть все на все случаи жизни, поэтому покажу на его примере.
Открываем петушка в редакторе и смотрим его свойства. 44 100 Hz, 16 bit, stereo — не годится,
В Forge есть Bit Converter, Channel Converter и Resample как это делается в других не знаю. По идее можно сразу сохранить в нужном формате и все. Я еще убрал тишину вначале и в конце, да и двойное кудахтанье ни к чему.
Сохранил в 8бит, 8кГц моно.
В итоге петушок, с существенной потерей качества, стал весить раз в 50 меньше, что не может не радовать. Однако даже в таком состоянии, при длительности звука в 1 секунду, он занимает 12кб данных, в то время как у Atmega8 всего навсего 8кБ флеш памяти. Представим себе сколько будет занимать ваш любимый трек в 3-4 минуты. Тут без внешней памяти не обойтись. Вот ее освоением мы и будем заниматься в продолжении урока.
Пользуясь случаем, хочу пригласить всех любителей социальных сетей в нашу группу вконтакте, кнопка со ссылкой висит справа. Там можно будет обсуждать ваши проекты, оставлять интересные ссылки, загружать видео и прочие ништяки, которые пока не доступны здесь на сайте. Welcome.
1.Можно забрасывать файлы 22050 гц?
2.Сколько гб карту поддерживает мк?
можно, с картами 2, 4, 8, 16Гб точно работает.
Спасибо, с частотой разобрался сам.
Доброго времени суток! Подскажите, не могу найти информацию на эту тему, как перевести wav 16bit в 8bit в микроконтроллере. Воспроизвести 16 битный файл через 8 битный шим? Спасибо
можно воспроизводить и 16бит, только больше 8бит разрешение не получите, либо ставить цап.
Это понятно, у меня получается два числа одной выборки младшее и старшее. Мне это надо как-то засунуть в 8 битный шим. В общем интересует сам алгоритм перевода младшего и старшего значения 16 битной выборки в 8 битную
самый простой способ — пересчитывать пропорцией
Спасибо) Если можно как-то по детальнее, сам принцип? Я получается склеиваю две переменные типа char в одну переменную типа int и делю на коэффициент? Получается так? А как быть, число int получается со знаком. Совсем запутался. И нигде статьи на эту тему не могу найти
дык какая тут статья, математика 5 класс. читать можно сразу 2 байта, через указатель, можете склеивать — как душе угодно, если число со знаком, то его можно сместить относительно нуля. в общем опять таки примитивная математика. я объяснял как это делается в 11 уроке http://avr-start.ru/?p=749
Спасибо большое, будем вникать
Простите за глупый вопрос,сделал wav файл около 1кб,не могли бы вы написать небольшой пример программы как его подцепить к проге и выводить его на цап(который вы описали) в цикле при нажатой кнопке…буду очень признателен….а то я голову сломал уже…
в 22.2 есть пример
Вы ошибаетесь, Уважаемый! Котельников говорил, что частота дискретизации должна , как минимум быть выше в три раза, а не в два…. На пальцах попытаюсь объяснить… Частота гармонического (это когда «чистая» синусоида ) имеет спектр одну палку…. Для простоты возьмем спичку…. Положим справа и слева еще по спичке, предварительно отделив, головку с серой….можем поупражняться, и уложить спички, пока, последняя из уложенных не станет по высоте равной головки с серой… все что справа (спички по убыванию),это гармоники частот верхней боковой…. Я здесь, для простоты, я не стал акцентировать внимание на номер гармоники, четные и нечетные….они имеют разную амплитуду сигналов (высоту спички) и уменьшаются… Все, что слева — нижние боковые… Если сложить амплитуды сигналов ( высоты спичек) получим прямоугольный импульс…. И Котельников, в своей теореме доказал ,что частота дискретизации выборок, должна быть выше, не менее, чем в три раза (а чем больше, тем лучше, вернее точнее) Почему три ? Анализируется боковые справа и слева….это самое грубое( приблизительное) определение ( но в жизни вполне достаточное), чтобы различить фразу, или мелодию Хочу обратиться к тем , которые владеют знаниями в этой области и читают эти строки , не судить меня строго…. Во первых- я не знаю уровень подготовки , читающих эти строки… А во вторых- это все сказанное относится, для общего представления и понимания…. Спасибо автору сайта, за его работу в этой области, давая знания многим начинающим в освоении микрокомпьютерной техники.
Специально для Ивана 14.09.2019 в 19:20, выдержка из Википедии:
Теоре́ма Коте́льникова (в англоязычной литературе — теорема Найквиста — Шеннона, теорема отсчётов) — фундаментальное утверждение в области цифровой обработки сигналов, связывающее непрерывные и дискретные сигналы и гласящее, что «любую функцию F(t), состоящую из частот от 0 до f1, можно непрерывно передавать с любой точностью при помощи чисел, следующих друг за другом менее чем через 1/(2*f1) секунд».
При доказательстве теоремы взяты ограничения на спектр частот 0 < f < f1.
То есть, как ни крути, Котельников имел ввиду частоту дискретизации не менее чем в два раза больше верхней частоты дискретизируемого сигнала.
Кстати, второй знак "меньше" в выражении 0 < f < f1 имеет большое значение, т.к., при точном равенстве, возможен, например, случай, когда все отсчеты действительно будут попадать в нулевое значение, если мы будем оцифровывать синусоиду с частотой точно равной половине частоты дискретизации и никакой оцифровки не получится.
Кстати, Ваше мнение о необходимости тройной частоты я уже где-то слышал, только не от Котельникова ;-)), и еще о том, что он после одумался, покаялся и согласился на тройную частоту.
Непонятно, только, как он согласовал это с математикой, с помощью которой он доказывал свою изначальную теорему. Я думаю, что таким же методом можно доказать, что дважды два может быть равно не только пяти, но и любому другому числу.