Перейти к содержанию
    

Reverb на TMS320C6713 DSK

Добрый день.

В мои руки попал TMS320C6713 DSK (это первый DSP с которым я имею дело) и жизнь наполнилась новыми красками. Передо мной стоит задача сделать нехитрый reverb. Я решил использовать схему Шредера (детали легко доступны при поверхностном гуглении). Выполненый в матлабе алгоритм работает как задумано. При тестировании я загружаю wav, он сэмплируется с заданной частотой, сэмплы floating-point -1..1. Если надо могу продемонстировать свой алгоритм.

Теперь собственно проблема. Встроенный в мой DSK кодек AIC23 отдает сэмплы в формате Uint32. Если сконвертировать их (сэмплы) во float и провести любую операцию (например, умножить на 0.8), то при обратном приведении "форма" сигнала "теряется" и вместо исходного сигнала слышно практически один только шум. Если умножать только на целые - все хорошо. Вопрос в том, как правильно обрабатывать целочисленные сэмплы, полученные с кодека. Какую почитать литературу или хорошую статью?

P.S. Прошу извинить за возможные ляпы и неправильные термины, я новичок в этой теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каким образом производится конвертирование во флоат и обратно?

В лоб, т.е.

Uint32 sample; // прочитанный сэмпл

float in = (float)sample; // конвертация

in *= 0.8; // манипуляция

Uint32 out = (Uint32)in; // обратная конвертация

 

А как правильно это делать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У AIC23 полезных только 24 бита, я сейчас не помню, что там в остальных, но кажется - мусор. Может быть, при конверсии во float он оказывается в старшей части и мешает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У AIC23 полезных только 24 бита, я сейчас не помню, что там в остальных, но кажется - мусор. Может быть, при конверсии во float он оказывается в старшей части и мешает.

Если просто сконвертировать туда и обратно, то ничего страшного не происходит, на выход получаем тоже, что пришло на вход.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему не умножить float на целую константу отдать в кодек, принять с кодека и поделить на эту же константу получить обратно float.

Константу выбрать исходя из диапазона целых чисел кодека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лоб, т.е.

Uint32 sample; // прочитанный сэмпл

 

Наверняка же int32. Посмотрите внимательно в документации, 99% там результат со знаком.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В лоб, т.е.

...

А как правильно это делать?

Сколько бит вх. данных? В каких битах uint32 они находятся? Данные знаковые или нет (значение 0 чему равно)?

Если 24 и находятся в мл.битах и беззнаковые (диапазон значений == 0...0x800000...0xFFFFFF):

uint32 inSample;

float smpl = (float)((int32)inSample - 0x800000) / 0x800000;

дальше - операции во флоат.

Надеюсь обратное преобразование - сами догадаетесь как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...