[an error occurred while processing this directive] [an error occurred while processing this directive]
Я делал так
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Евгений 23 сентября 2001 г. 00:47
В ответ на: Реверберация отправлено Z@ 21 сентября 2001 г. 19:48

Длительность петли реверберации зависит от величины буфера, в котором мы собираемся хранить выборки, подмешиваемые к исходному сигналу. Величина задержки будет равна размеру буфера, поделенному на частоту дискретизации сигнала. Дальнейшие рассуждения привожу применительно к процессору ADSP 2181
Итак, имеем буфер:
VAR/CIRC data[3000]; //Циклический буфер для облегчения работы. Экв

//Объявляем два указателя;
I0=data; M0=1; I1=data+1; L0=length(data); //по указателю I0 будем записывать очередную выборку, а по указателю I1-считывать ту, которая прошла через линию задержки.

Далее в цикле приема выборки (надеюсь принимать отсчеты вы умеете. Если нет, то на www.analog.com есть исходники сквозного канала - звук дискретизируется, подается на ЦСП, фильтруется немного, и подается на выход) необходимо к значению, полученному из буфера и уменьшенному на нужную величину, определяющую затухание ревербератора, прибавить новый отсчет, взвесить, отправить на выход и записать в буфер по новому адресу.

mx0=sr0; //Новый отсчет здесь
my0=0x4000; //величина ослабления, 0.5 в формате 1.15
mr=mx0*my0(ss);//Ослабили
ax0=dm(I1,M0);
ay0=mr1;
ar=ax0+ay0; //Сложили новый и старый отсчет. Послали на выход
dm(I0,M0)=ar; //Записали новое значение.

Вот, в принципе, и все. Надо только предусмотреть ситуацию, когда при сложении двух выборок результат выходит за пределы 16 бит. В этом случае сигнал здорово искажается.К данному алгоритму можно прибавить при желании фильтрацию и все такое, но это уже другой вопрос. Я писал себе ревербератор для игры на гитаре. Звук довольно приятный.
Если вы будете записывать в буфер только новое значение, а старое будете подавать на выход, то получите цифровую задержку(delay). Если вдобавок к старому значению на выходе приплюсуете новое, а задержку уменьшите до миллисекунд, то получите флэнжер (flanger).



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru