как добавить эффект эха к аудиофайлу с помощью Objective-C

Я разрабатываю приложение, в котором хочу добавить эффект эха в записанные аудиофайлы, используя Objective-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 — некоторая константа, обычно между нулем и единицей.

Теперь скажите, что вам нужен поток эха: ПРИВЕТ... Привет... привет... х... вот так. Вам просто нужно сделать немного больше работы:

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