Форум программистов, компьютерный форум, киберфорум
Цифровая обработка сигналов
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
1

Пересчет амплитуды сигнала при ИКМ

14.11.2013, 17:56. Показов 5340. Ответов 14
Метки нет (Все метки)

Потребовалось на днях изменять амплитуду аналогового сигнала получаемого из ИКМ, или если по простому то нужно изменять громкость воспроизведения файлов записанных в формате wav. Т.е. МК гонит ШИМ на фильтр, а с него на УНЧ.
Регулировать нужно удаленно. Конечно можно использовать устройства регулирующие амплитуду уже после фильтра, но хотелось бы все делать еще в МК не доводя до аналогового сигнала. В связи с этим такая просьба - может быть у кого-нибудь завалялся алгоритм пересчета амплитуды сигнала закодированного ИКМ?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2013, 17:56
Ответы с готовыми решениями:

Анализ сигнала для нахождения времени и амплитуды
Существует проблема: Есть форма сигнала представленная виде рисунка (рисунок 1) Можно ли с...

Стабилизация амплитуды синусоидального сигнала
Добрый день. Пусть имеется синусоидальный сигнал. В процессе некоторых манипуляций его амплитуда...

Выделение сигнала малой амплитуды с подставкой
[Приветствую, господа. Подскажите, пожалуйста, каким образом можно растянуть низкочастотный сигнал,...

Частотомер (3MHz) с измерением амплитуды сигнала
Частотомер (3MHz) с измерением амплитуды сигнала Для работы с металлодетектором был сделан такой...

14
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
14.11.2013, 18:33 2
Умножать каждый сэмпл на коэффициент.
0
MCSD: APP BUILDER
8791 / 1069 / 104
Регистрация: 17.06.2006
Сообщений: 12,603
14.11.2013, 18:44 3
при цифровой регулировке на малой громкости искажения расти будут, лучше аналоговое управление сделать
0
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
14.11.2013, 21:12 4
Цитата Сообщение от Гарнист
Умножать каждый сэмпл на коэффициент.
Попробовал поделить на два, умножить на два, вычесть два, добавить два - получил треск. Как-то по-другому надо. Или может быть я не то делю-умножаю? Под сэмплом понимается один отсчет битрейта? Для восмибитного звука это будет один байт, верно?
Цитата Сообщение от Johmmy0007
при цифровой регулировке на малой громкости искажения расти будут, лучше аналоговое управление сделать
После гугления все больше склоняюсь к этому варианту.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
14.11.2013, 22:20 5
Цитата Сообщение от Omdy Kork
Попробовал поделить на два, умножить на два, вычесть два, добавить два - получил треск.
А файл какой был? Загляните в заголовок - PCM? ADPCM? И где был треск? Умножалось/делилось только содержимое чанков с данными?
0
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
15.11.2013, 12:12 6
Цитата Сообщение от Гарнист
Цитата Сообщение от Omdy Kork
Попробовал поделить на два, умножить на два, вычесть два, добавить два - получил треск.
А файл какой был? Загляните в заголовок - PCM? ADPCM? И где был треск? Умножалось/делилось только содержимое чанков с данными?
Compression Code = 1 PCM/unsompressed, обрабатывались только чанки.
0
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 3,496
15.11.2013, 14:39 7
Удивительно.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
15.11.2013, 14:58 8
У вас сэмплы со знаком или без?
со знаком формула y=x*a
(a - коэффициент усиления, например, 0.5)
8 бит без знака y=((int)x-128)*a+128

(Ну, это чуть упрощённо, пренебрегая клиппингом и без оптимизации)
0
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
15.11.2013, 18:59 9
Цитата Сообщение от oomomstir
У вас сэмплы со знаком или без?
со знаком формула y=x*a
(a - коэффициент усиления, например, 0.5)
8 бит без знака y=((int)x-128)*a+128

(Ну, это чуть упрощённо, пренебрегая клиппингом и без оптимизации)
Значения без знака, но че-то все равно не получается - в динамике тишина.
Делаю так:
Код
unsykned char read_buf[BUF_LEN];
for(i=0;i<BUF_LEN;i++)
read_buf[i] = (((int)read_buf[i]-128)*0.5)+128;
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
15.11.2013, 19:44 10
А код, который read_buf заполняет (между первой и второй строчкой) вы пропустили или по ошибке выдаёте на выход пустой массив? (лучше в местах пропусков многоточие ставить, чтобы понятно было)

И если обработку сигнала не делаете - на выходе звук есть?
Тогда напишите для пробы
Код
for(i=0;i<BUF_LEN;i++) {
read_buf[i] = (read_buf[i]>>1)+64;
}
(это примерно то же самое, что в вашем коде, только быстро и без плавающей точки)

Кстати, маленький совет-оффтопик: если у вас внутренности if/while/for попадают на отдельную строчку - _всегда_ ставьте фигурные скобки. Сэкономите себе много нервов, когда однажды добавите к ним строчку, а окажется, что работает не так.
0
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
15.11.2013, 22:24 11
Цитата Сообщение от oomomstir
А код, который read_buf заполняет (между первой и второй строчкой) вы пропустили или по ошибке выдаёте на выход пустой массив? (лучше в местах пропусков многоточие ставить, чтобы понятно было)
Извиняюсь. На самом деле массив конечно заполняется выше в коде.
Цитата Сообщение от oomomstir
И если обработку сигнала не делаете - на выходе звук есть?
Да есть, нормальный звук.
Цитата Сообщение от oomomstir
Тогда напишите для пробы
Код:
for(i=0;i<BUF_LEN;i++) {
read_buf[i] = (read_buf[i]>>1)+64;
}(это примерно то же самое, что в вашем коде, только быстро и без плавающей точки)

Уже так писал. Не полегчало. увы

Спасибо за совет маленькими буквами.
0
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
16.11.2013, 01:03 12
Мистика какая-то.
Преобразование заведомо правильное.
Была мысль, что вы не успеваете обрабатывать данные, но раз ускорение кода ничего не меняет - значит, и это вряд ли причина.

Выкидываете значения в ШИМ сами напрямую, или библиотекой какой? И вообще, какой хотя бы проц и компилятор?

В общем, не глядя на код - вряд ли получится разобраться.
0
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
16.11.2013, 10:50 13
Цитата Сообщение от oomomstir
Мистика какая-то.
Преобразование заведомо правильное.
Была мысль, что вы не успеваете обрабатывать данные, но раз ускорение кода ничего не меняет - значит, и это вряд ли причина.

Выкидываете значения в ШИМ сами напрямую, или библиотекой какой? И вообще, какой хотя бы проц и компилятор?

В общем, не глядя на код - вряд ли получится разобраться.
Спасибо за участие. Оказалось, что сам дурак - счетчик буфера в цикле не той разрядности взял, он переполнялся и код не успевал выполнятся в отведенное время. После исправления заработало, но полезли искажения. Гиблое дело вообщем. Буду делать на аналоге регулировку.

Для тех кто пойдет этим путем некоторые характеристики работы на Atmega 32 на частоте 20Мгц:
Динные выбирались из самой дешевой SD-карточки аппаратным SPI на максимальной скорости SPI с помощью библиотеки Petit FatFs в два буфера по 256 байт. Заполнение одного буфера занимало максимум 3 мс.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
16.11.2013, 15:04 14
Цитата Сообщение от Omdy Kork
После исправления заработало, но полезли искажения. Гиблое дело вообщем.
... ...
Для тех кто пойдет этим путем некоторые характеристики работы на Atmega 32 на частоте 20Мгц:
Динные выбирались ... с помощью библиотеки Petit FatFs
У Меги32 достаточно ОЗУ для использования нормальной конфигурации FatFs, а не Petit! Чтение с карты происходило бы быстрее и более гладко. Petit хуже, это для совсем уж хилых микроконтроллеров.

Цитата Сообщение от Omdy Kork
в два буфера по 256 байт. Заполнение одного буфера занимало максимум 3 мкс
То есть частота SPI у Вас - порядка 700 МГц. Отличный AVR попался. Настройками не поделитесь? ;-)
0
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 94
16.11.2013, 17:33 15
Цитата Сообщение от OtyxPM
Цитата Сообщение от Omdy Kork
После исправления заработало, но полезли искажения. Гиблое дело вообщем.
... ...
Для тех кто пойдет этим путем некоторые характеристики работы на Atmega 32 на частоте 20Мгц:
Динные выбирались ... с помощью библиотеки Petit FatFs
У Меги32 достаточно ОЗУ для использования нормальной конфигурации FatFs, а не Petit! Чтение с карты происходило бы быстрее и более гладко. Petit хуже, это для совсем уж хилых микроконтроллеров.
Думаете переход на FatFS позволит как-то повлиять на уменьшение искажений при пересчете амплитуды? Притом, что буфер буфер опустошается раз в 20 мс, добавление цикла по вышеприведенным формулам не так уж много добавило к 3 мс, поэтому вряд ли уменьшение времени считывания как-то повлияет на те искажения которые вносят именно пересчет. Хотя может быть я чего-то упускаю из виду.
Цитата Сообщение от OtyxPM
Цитата Сообщение от Omdy Kork
в два буфера по 256 байт. Заполнение одного буфера занимало максимум 3 мкс
То есть частота SPI у Вас - порядка 700 МГц. Отличный AVR попался. Настройками не поделитесь? ;-)
Ах ты ж ёшкин кот! Точно миллисекунд же! Лишнюю "к" воткнул, извиняюсь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2013, 17:33

Открыть файл формата WAV, воспроизвести его и отобразить график амплитуды и времени этого сигнала (файла), а также спектр сигнала
Здравствуйте ! Помогите пожалуйста с программой на Delphi 7. Не могу написать программу которая...

Оценка амплитуды сигнала
Есть формула и 2 вопроса по ней: 1. Откуда она взялась, никак не найду информацию в интернете по...

Изменение амплитуды сигнала
Хотелось бы услышать более опытных саратников по такому вопросу: Имеется атмега8, которая в...

Оценка амплитуды сигнала
Помогите, пожалуйста, оценить амплитуду случайного сигнала графически.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.