R2sty 0 7 мая, 2015 Опубликовано 7 мая, 2015 · Жалоба Добрый день. В мои руки попал TMS320C6713 DSK (это первый DSP с которым я имею дело) и жизнь наполнилась новыми красками. Передо мной стоит задача сделать нехитрый reverb. Я решил использовать схему Шредера (детали легко доступны при поверхностном гуглении). Выполненый в матлабе алгоритм работает как задумано. При тестировании я загружаю wav, он сэмплируется с заданной частотой, сэмплы floating-point -1..1. Если надо могу продемонстировать свой алгоритм. Теперь собственно проблема. Встроенный в мой DSK кодек AIC23 отдает сэмплы в формате Uint32. Если сконвертировать их (сэмплы) во float и провести любую операцию (например, умножить на 0.8), то при обратном приведении "форма" сигнала "теряется" и вместо исходного сигнала слышно практически один только шум. Если умножать только на целые - все хорошо. Вопрос в том, как правильно обрабатывать целочисленные сэмплы, полученные с кодека. Какую почитать литературу или хорошую статью? P.S. Прошу извинить за возможные ляпы и неправильные термины, я новичок в этой теме. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeyv 0 8 мая, 2015 Опубликовано 8 мая, 2015 · Жалоба Каким образом производится конвертирование во флоат и обратно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2sty 0 8 мая, 2015 Опубликовано 8 мая, 2015 · Жалоба Каким образом производится конвертирование во флоат и обратно? В лоб, т.е. Uint32 sample; // прочитанный сэмпл float in = (float)sample; // конвертация in *= 0.8; // манипуляция Uint32 out = (Uint32)in; // обратная конвертация А как правильно это делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex11 3 8 мая, 2015 Опубликовано 8 мая, 2015 · Жалоба У AIC23 полезных только 24 бита, я сейчас не помню, что там в остальных, но кажется - мусор. Может быть, при конверсии во float он оказывается в старшей части и мешает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2sty 0 8 мая, 2015 Опубликовано 8 мая, 2015 · Жалоба У AIC23 полезных только 24 бита, я сейчас не помню, что там в остальных, но кажется - мусор. Может быть, при конверсии во float он оказывается в старшей части и мешает. Если просто сконвертировать туда и обратно, то ничего страшного не происходит, на выход получаем тоже, что пришло на вход. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
agregat 0 8 мая, 2015 Опубликовано 8 мая, 2015 · Жалоба Почему не умножить float на целую константу отдать в кодек, принять с кодека и поделить на эту же константу получить обратно float. Константу выбрать исходя из диапазона целых чисел кодека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 9 мая, 2015 Опубликовано 9 мая, 2015 · Жалоба В лоб, т.е. Uint32 sample; // прочитанный сэмпл Наверняка же int32. Посмотрите внимательно в документации, 99% там результат со знаком. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 9 мая, 2015 Опубликовано 9 мая, 2015 · Жалоба В лоб, т.е. ... А как правильно это делать? Сколько бит вх. данных? В каких битах uint32 они находятся? Данные знаковые или нет (значение 0 чему равно)? Если 24 и находятся в мл.битах и беззнаковые (диапазон значений == 0...0x800000...0xFFFFFF): uint32 inSample; float smpl = (float)((int32)inSample - 0x800000) / 0x800000; дальше - операции во флоат. Надеюсь обратное преобразование - сами догадаетесь как. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться