Russian Qt Forum

Qt => Мультимедиа => Тема начата: Firefox от Март 04, 2010, 11:57



Название: эффект реверберации
Отправлено: Firefox от Март 04, 2010, 11:57
Здравствуйте. у меня такая задача. есть QByteArray data1[] сюда считываются данные и wave файла блока data. мне надо сделать изменения в этих данных таким образом, чтоб реализовать эфект реверберации.  причем создать жёсткую зашумлённость. я сделала так
Код:
QByteArray data1[];
QByteArray data2[];
int len=data1.size();
qint32 skoroct; // известна скорость, тоесть (частота дискретезации/ количество блоков в семпле)
skoroct=skoroct/100;
for(int i=0;i<skoroct;i++)
{
data[i]=data1[i];
}
int j=0;
for(int k=0;k<25;k++)
{
j=0;
for(int i=skoroct*k;i<len;i++)
data[i]=data1[i]+data1[j];
}
тобишь к имеющемуся массиву прибавляю с отставанием в skoroct*k ещёраз сам массив. таким образом пытаюсь реализовать смещение во времени прихода сигналов от источникак получателю. или я в корне не правильно понимаю логику?
но шумо чень слабенький создаётся. и к я меняла разные.skoroct изначально равна 22050/1 или 22050/2.


Название: Re: эффект реверберации
Отправлено: lit-uriy от Март 04, 2010, 12:26
в ревербераторах обычно три параметра:
* задержка - на какое время запаздывает копия оригинала. (то что ты делаешь)
* интенсивность - аналог кол-ва копий
* период затухания (собственно "реверберация") - время, за которое задержанная копия сигнала затухает (ослабляется) в 1 милион раз


Название: Re: эффект реверберации
Отправлено: Firefox от Март 04, 2010, 22:59
дело в том что данные у меня в байтах. поэтому я не представляю как сделать затухание. поискала в интернете, но не нашла, обычно кодеки уже готовые, а вот код нигде не нашла.


Название: Re: эффект реверберации
Отправлено: panAlexey от Март 05, 2010, 11:03
Цитировать
Тема: эффект реверберации
ОФФ. Сразу вспомнил группу "9-й район"


Название: Re: эффект реверберации
Отправлено: lit-uriy от Март 05, 2010, 11:48
Firefox, мне не приходилось работать с "компьютерным звуком", только со специализированными промышленными устройствами.
Обычно, сигнал с АЦП, униполярен. Т.е. коды изменяются от 0 до некого MAX. Это означает, что в сигнале присутсвует постоянная составляющая. Однако её величина зависит от конкретной реализации. Но можно предположить, что это пол шкалы.
Можно пойти таким путём убрать постоянную составляющую, а затем произвести изменение амплитуды. Псевдокод такой:
Код
C++ (Qt)
const float k = 0.9; // это коэффициент усиления (<1, значит ослабление)
const Type constComponent = <тут половина максимального числа типа Type>; // Это постоянная составляющая
Type sourceData[] = <тут много данных>; // это массив источник данных
Type targetData[] ; // это массив конечных данных
 
for (...){
   SignedType d1 = constComponent - sourceData[i]; // это данные уже без постоянной составляющей, знаковый тип
   SignedType d2 = SignedType(k * d1); // это данные с изменённой амплитудой, знаковый тип
   targetData[i] = constComponent + d2;// это результирующие данные с востановленной постоянной состовляющей
}
 
Собственно это схема, которую можно привести к любому удобному виду
если у тебя данные в виде байт, то
Type, может быть char и соответсвенно
половина максимального числа типа Type = 127




Название: Re: эффект реверберации
Отправлено: kuzulis от Март 05, 2010, 12:40
А зачем придумывать что-то свое, если всё уже придумано за Вас!? Можно же воспользоваться API готовых библиотек! (ИМХО)
ЗЫ: я бы на Вашем месте поступил бы именно так.


Название: Re: эффект реверберации
Отправлено: Firefox от Март 06, 2010, 12:17
подключать и искать готовые библиотеки не очень хочется.
а вот предложеный вариант попробую. я немного похоже сделала, я домножила исходные данные на коэфициенты меньше единицы, тем самым пытаясь реализовать затухание. шум вышел впринцепи. но мне нало 3 вида помех сделать. спасиб0))