как да добавите ехо ефект към аудио файл с помощта на object-c

Разработвам приложение, в което искам да добавя ехо ефект в записани аудио файлове с помощта на object-c.

Използвам DIRAC, за да добавя друг ефект, напр. мъж към жени, бавно, бързо.

сега трябва да направя глас на робота от записан глас. за глас на робот трябва да добавя ехо ефект

Моля, помогнете ми да направя това


person Shivomkara Chaturvedi    schedule 03.08.2012    source източник
comment
Здрасти Шивам! можете ли да споделите DIRAC, който сте използвали за ефекти. Благодаря предварително!   -  person Karun    schedule 24.04.2014
comment
Моля, изтеглете го от тук: dspdimension.com/download   -  person Shivomkara Chaturvedi    schedule 24.04.2014


Отговори (1)


Ехото е доста просто. Имате нужда от линия за забавяне и малко умножение. Ако приемем, че един канал и аудиото вече са представени с плаваща запетая, линията на забавяне ще изглежда така (в C-подобен псевдокод):

int LENGTH = samplerate * seconds; //seconds is the desired length of the delay in seconds
float buffer[ LENGTH ];
int readIndex = 0, writeIndex = LENGTH - 1;

float delayLine.readNext( float x ) {
    float ret = buffer[readIndex];
    ++readIndex;
    if( readIndex >= LENGTH )
        readIndex = 0;
    return ret;
}
void delayLine.writeNext( float x ) {
    buffer[ writeIndex ] = x;
    ++writeIndex;
    if( writeIndex >= LENGTH )
        writeIndex = 0;
}

Не забравяйте да инициализирате буфера до всички нули.

Така че това е вашата линия на забавяне. Основната употреба би била следната:

float singleDelay( float x ) {
    delayLine.writeNext(x);
    return delayLine.readNext( x );
}

Но няма да чуете голяма разлика: просто ще излезе по-късно. Ако искате да чуете едно ехо, ще ви трябва нещо подобно:

float singleEcho( float x, float g ) {
    delayLine.writeNext(x);
    return x + g * delayLine.readNext( x );
}

където g е някаква константа, обикновено между нула и едно.

Сега кажете, че искате поток от ехо: HELLO... Hello... hello... h... така. Просто трябва да свършите още малко работа:

float echo( float x, float g ) {
   float ret = x + g * delayLine.readNext( x );
   delayLine.writeNext( ret );
   return ret;
}

Забележете как този път изходът от цялото нещо се връща обратно в линията на забавяне, а не входът. В този случай е много важно |g| ‹ 1.

Тук може да се натъкнете на проблеми с денормалните стойности. Не мога да си спомня дали това е проблем на iOS, но не мисля така.

person Bjorn Roche    schedule 03.08.2012
comment
Какви са тези променливи тук. честота на дискретизация * секунди; как да получите стойности на тези променливи тук - person Shivomkara Chaturvedi; 06.08.2012
comment
Добавих обяснение на секунди. честотата на семплиране е основен параметър, включен в семплирания звук. Вероятно сте го използвали с DIRAC, както и когато сте отваряли вашето звуково устройство за четене/запис. - person Bjorn Roche; 06.08.2012
comment
Не мога да стартирам този код. Използвам библиотека DIRAC в моя проект. Моля, пуснете примерен код, ако имате такъв. - person Sumit Sharma; 12.02.2014
comment
@SumitSharma: не ми даваш достатъчно информация, за да ти помогна, освен да повторя това, което вече казах, а именно, че това е просто псевдокод, така че очевидно няма да работи както е. - person Bjorn Roche; 12.02.2014
comment
как да извикам тези функции за аудио буфер? - person Tony; 25.09.2020