Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Формирование звука ШИМом Меги48
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ksv198
Доброго времени суток всем!
Решил вот заставить Мегу разговаривать biggrin.gif . Прицепил к ней AT45DB161D, залил звуковой файлик (PCM 8 kHz, 8 bit) и ШИМом на 1-м таймере пытаюсь формировать звук. Таймер 0 у меня тикает на 8000 Гц, на каждом тике записываю в OCR1A новое значение, прочитанное из датафлэша. Режим ШИМа 8 битный "Fast PWM", тактовая контроллера 8 МГц, т.е. частота ШИМа ~31 кГц. Хотел сам себя обмануть и обойтись без дополнительных фильтров, надеялся на сглаживание индуктивностью динамика. После первых опытов, понял, что был не прав, разборчивость речи плохая. Сейчас в раздумье: или фильтровать сразу на выходе Меги, а потом усиливать звук; или раскачать импульсный сигнал сначала, а потом зафильтровать его LC фильтром. Что посоветуете? Качество нужно на уровне телефонного, т.е. чтобы только разборчива речь была.
pokos
Наверное, параллельно со звуком имеется характерный свист?
Передискретизацию полезно сделать хотя бы 2х. Т.е. частота дискретизации на выходе должна быть 16кГц. И цифровой фильтр. Ресурсов это дело жрёт не сильно много, а эффект весьма заметный.
Ну, потом зафильтровать каким-нибудь примитивным аналоговым фильтром.
ksv198
Цитата(pokos @ Aug 8 2006, 10:30) *
Наверное, параллельно со звуком имеется характерный свист?
Передискретизацию полезно сделать хотя бы 2х. Т.е. частота дискретизации на выходе должна быть 16кГц. И цифровой фильтр. Ресурсов это дело жрёт не сильно много, а эффект весьма заметный.
Ну, потом зафильтровать каким-нибудь примитивным аналоговым фильтром.

"Про пар мне барин все понятно... куды лошадь то запрягать?" smile.gif Примитивный аналоговый фильтр не помогает, вот здесь например, применили Чебышевский 5-го порядка. Я собственно хотел бы попроще что-нибудь (жаба и лень душат совместно, а тут еще жара +35). Про цифровой фильтр, жрущий мало ресурсов интересно, если можно - ссылочку на примерчик, сам пока цифровых фильтров не делал.
pokos
Цитата(ksv198 @ Aug 8 2006, 11:03) *
Примитивный аналоговый фильтр не помогает, вот здесь например, применили Чебышевский 5-го порядка.

Качества хотели. Если нужна только разборчивая речь, то с передискретизацией и RC цепочка неплохо работает. Я, правда, предискретизацию делал 4х, но, думаю, 2х тоже сильно улучшит звук.
Цитата
Про цифровой фильтр, жрущий мало ресурсов интересно, если можно - ссылочку на примерчик,

http://www.atmel.com/dyn/resources/prod_do...nts/doc2527.pdf
FIR поможет. Чем больше его длина, тем лучше, ограничивается только наличием вычислительных ресурсов. Аккумулятора 16-битного хватит. Частоту среза ему 3,4кГц и будет щастье.

А вообще, для речи гораздо лучше подходит АДИКМ, а не ИКМ.
ksv198
Цитата(pokos @ Aug 8 2006, 11:22) *
Качества хотели. Если нужна только разборчивая речь, то с передискретизацией и RC цепочка неплохо работает. Я, правда, предискретизацию делал 4х, но, думаю, 2х тоже сильно улучшит звук.

http://www.atmel.com/dyn/resources/prod_do...nts/doc2527.pdf
FIR поможет. Чем больше его длина, тем лучше, ограничивается только наличием вычислительных ресурсов. Аккумулятора 16-битного хватит. Частоту среза ему 3,4кГц и будет щастье.

Спасибо за ссылку, буду читать.

Цитата(pokos @ Aug 8 2006, 11:22) *
А вообще, для речи гораздо лучше подходит АДИКМ, а не ИКМ.

Имеется в виду ADPCM?
pokos
Цитата(ksv198 @ Aug 8 2006, 11:52) *
Имеется в виду ADPCM?

Я-я, безондерс.
proba
наверно из PCM правильно PWM преобразовали ? там знак +12 бит получается. я использовал 2 канала PWM , один вышие 6 бит выдает, другои младшие 6. суммируются резисторами R и 64*R, за этим 3.порядка RC филтрь на опарационном У. качество неплохая получается. еще, PWM должен быть фазокорректный.
pokos
Цитата(proba @ Aug 8 2006, 16:30) *
... еще, PWM должен быть фазокорректный.

Кстати, да! На такой низкой частоте дискретизации Fast PWM будет здорово гадить.
Если вопрос ко мне, могу рассказать, что я делал. Дело было давно, не все подробности помню. машина была 51-я с соответствующими ограничениями по железу и быстродействию.
INT1
А посмотрите :
http://www.gaw.ru/html.cgi/txt/app/Atmel/m...at45_to_avr.htm
(AVR335)
PS, увидел, что это и есть "вот здесь" - smile.gif
что вспомнилось, у меня это был 4433 , и, если они не подправили исходник - нужно задействовать оба буфера. А как заливали РСМ во флэш?
ArtemKAD
Цитата(ksv198 @ Aug 8 2006, 08:42) *
Прицепил к ней AT45DB161D, залил звуковой файлик (PCM 8 kHz, 8 bit) и ШИМом на 1-м таймере пытаюсь формировать звук. Таймер 0 у меня тикает на 8000 Гц, на каждом тике записываю в OCR1A новое значение, прочитанное из датафлэша. Режим ШИМа 8 битный "Fast PWM", тактовая контроллера 8 МГц, т.е. частота ШИМа ~31 кГц. Хотел сам себя обмануть и обойтись без дополнительных фильтров, надеялся на сглаживание индуктивностью динамика. После первых опытов, понял, что был не прав, разборчивость речи плохая. Сейчас в раздумье: или фильтровать сразу на выходе Меги, а потом усиливать звук; или раскачать импульсный сигнал сначала, а потом зафильтровать его LC фильтром. Что посоветуете? Качество нужно на уровне телефонного, т.е. чтобы только разборчива речь была.

Или лыжи не едут, или масло мало cranky.gif . Проверь, что залил и как выдаешь. Проверь стоит ли у тебя в параллель динамику емкость. Проверь, стоит ли у тебя электролит между ногой Меги и динамиком...
Бо при твоих условиях можно говорить о плохом воспроизведении музыки, но никак не о плохой разборчивости речи. Плохая разборчивость это когда 2 кгц, 4 бита biggrin.gif .
_artem_
Если звук сделан по псм стандарту то может быть что мю или а компандирование применено . То есть перед тем как воспроизводить обратное преобразование надо.
Что касается 8 кГц звука то согласен с предыдушим автором - с разборчивостью речи никаких проблем не должно быть.
А в случае увеличения частоты шима в два раза попробуй грубо заполнить промежуточные недостаюшие значения средним двух смежных.
INT1
Нашел вот статью из "Paguo" может будет интересна
Нормально работает с усилителем в классе D, но нужен хотя бы однозвенный LC фильтр на динамик, и обеспечить конструктивные требования к L. Поройтесь в апнотах Apex_a:
http://eportal.apexmicrotech.com/mainsite/...s/app_notes.asp
SasaVitebsk
Цитата(proba @ Aug 8 2006, 15:30) *
наверно из PCM правильно PWM преобразовали ? там знак +12 бит получается. я использовал 2 канала PWM , один вышие 6 бит выдает, другои младшие 6. суммируются резисторами R и 64*R, за этим 3.порядка RC филтрь на опарационном У. качество неплохая получается. еще, PWM должен быть фазокорректный.


Согласен с данным автором у меня также получалось (13 бит). Поэтому от шима я отказался поставил кофидек с цифровым фильтром на выходе. Там ЦАП нелинейный. Всё класс получилось. В смысле речи.
Woodoo
имел опыт с воспроизведением аудио используя шим, но он был програмный, и написан на х86. Воспроизводил не голос, а музыку в формате 11050 Гц, 8 бит. Вывод на ПК-спикер. + элементарная р-ц цепочка = очень приемлемое качество как для ШИМа. Так что мой совет: поднимите частоту, хотябы вдвое + элементарный фильтр, а уж потом усилитель (ни как не наоборот, импульсы усиливать не стоит). Для голоса этого должно хватить с избытком.

P.S.: Так как в кампе небыло звуковой карты, слушал таким оброзом музыку довольно долго, ставил Электроника У-101-стерео + S30 = супер!
ksv198
Цитата(proba @ Aug 8 2006, 16:30) *
наверно из PCM правильно PWM преобразовали ? там знак +12 бит получается. я использовал 2 канала PWM , один вышие 6 бит выдает, другои младшие 6. суммируются резисторами R и 64*R, за этим 3.порядка RC филтрь на опарационном У. качество неплохая получается. еще, PWM должен быть фазокорректный.

Не совсем понял про преобразование. Я использую 8-ми битный RAW PCM, беззнаковый, без A-low, mu-low; такие может делать Cool Edit. Пробовал и фазокорректный PWM, при этом качество улучшается немного, но сильнее свист.

Цитата(INT1 @ Aug 8 2006, 17:08) *
А посмотрите :
http://www.gaw.ru/html.cgi/txt/app/Atmel/m...at45_to_avr.htm
(AVR335)
PS, увидел, что это и есть "вот здесь" - smile.gif
что вспомнилось, у меня это был 4433 , и, если они не подправили исходник - нужно задействовать оба буфера. А как заливали РСМ во флэш?

РСМ во флэш заливаю через последовательный порт, вернее с СОМа компьютера на скорости 19200 передаю контроллеру, а он уже льет по SPI во флэш, для контроля читаю назад - все совпадает. Можно оба буфера использовать, а если лениво , то можно в RealTerm-е поставить задержку между байтами 5-6 мс, тогда с одним буфером успевает писать в страницу между приемом соседних байтов.
ArtemKAD
Цитата(ksv198 @ Aug 9 2006, 10:23) *
РСМ во флэш заливаю через последовательный порт, вернее с СОМа компьютера на скорости 19200 передаю контроллеру, а он уже льет по SPI во флэш, для контроля читаю назад - все совпадает.

Не то. Возьми запиши из файла во флешку какой нибудь простой сигнал - синусоиду или нечто треугольное с частотой 500-1500Гц (частота на твой выбор), а затем на осцилографе пронаблюдай, что получилось на динамике. Особо обрати внимание на форму и частоту результата. Если будет что-то лишнее (кроме пилы на 31кГц, ступенек на 8кГц и твоего сигнала) - ищи баг в программе.
ksv198
Цитата(ArtemKAD @ Aug 9 2006, 12:13) *
Цитата(ksv198 @ Aug 9 2006, 10:23) *

РСМ во флэш заливаю через последовательный порт, вернее с СОМа компьютера на скорости 19200 передаю контроллеру, а он уже льет по SPI во флэш, для контроля читаю назад - все совпадает.

Не то. Возьми запиши из файла во флешку какой нибудь простой сигнал - синусоиду или нечто треугольное с частотой 500-1500Гц (частота на твой выбор), а затем на осцилографе пронаблюдай, что получилось на динамике. Особо обрати внимание на форму и частоту результата. Если будет что-то лишнее (кроме пилы на 31кГц, ступенек на 8кГц и твоего сигнала) - ищи баг в программе.

Спасибо, это мысль, счас гляну.
aai_m
Кстати, в качестве ФНЧ можно использовать фильтр на переключаемых конденсаторах. Например MAX291, MAX295 (это ФНЧ восьмого порядка в корпусе DIP8). Легко управляется.
ksv198
Цитата(ArtemKAD @ Aug 9 2006, 12:13) *
Возьми запиши из файла во флешку какой нибудь простой сигнал - синусоиду или нечто треугольное

Все, разобрался. Глянул на синусоиду - все в порядке, чистенькая. Проблема оказалась в другом месте, где не ждал. Сигнал я усиливал после RC-цепи LM386, в подстроечнике на входе (регулятор уровня) была закоротка, соответсвенно усилок перегружался и не по-детски искажал. Уменьшил сигнал на входе - все стало супер. Такого качества даже не ожидал! Спасибо всем за советы! a14.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.