A = {A1,A2,…,An} – массив амплитуд звукового сигнала.
T = {T1,T2,…,Tn} – массив со значениями времени, где n зависит от частоты дискретизации, битрейта и размера файла.
Ti – Ti-1 определяется частотой дискретизации.
При реализации алгоритма учитываются следующие параметры эффекта реверберации, которые подаются в качестве параметров на вход алгоритма:
To – время между отражениями;
Гр – громкость отражения относительно предыдущего в процентах;
Kол – количество отражений.
В результате реализации алгоритма формируются новые массивы амплитуд и значений времени A’ и T’. Структура выходного файла при этом соответствует описанной в п.2.1.2.
Для получения выходных массивов A’ и T’ необходимо предварительно получить Кол пар дополнительных массивов А(А1,А2,…,Акол) и Т(Т1,Т2,…,Ткол) с отражениями, а затем совместить их:
m – размерности получаемых массивов A’ и T’
m = n + n*Кол;
T1i = Ti + 1*То;
T2i = Ti + 2*То;
…
ТКолi = Ti + Кол*То;
A1i = Гр/100*Ai;
A2i = Гр/100*A1i;
Aкол = Гр/100*A[кол-1]i
Описание используемых обозначений приведено в п.2.2.2.
Затем все полученные массивы амплитуд и времен объединяются в один общий массив (A’ и T’ соответственно).
1. i::=1;
2. MaxValue::=MaxValue*256;
3. i::=i+1;
4. Если i≤(AudioData.nBlockAlign/AudioData.nChannels),то переход к п.2 иначе к п.5;
5. MaxValue::=MaxValue/2 – 1;
6. TempAudio.nChannels ::= AudioData.nChannels;
7. TempAudio.nSamplesPerSec := AudioData.nSamplesPerSec;
8. TempAudio.nBitsPerSample := AudioData.nBitsPerSample;
9. DelaySmp := Round(Delay*AudioData.nSamplesPerSec/1000);
10. Channel :: =0;
11. Если Channel > (AudioData.nChannels-1),то переход к п. 38 иначе к п.12
12. i :: = Start;
13. Если i > (Start+Count-1), то переход к п. 37 иначе к п.14;
14. j :: = Number;
15. Если j < 0, то переход к п.21 иначе к п.16;
16. Если (i - Start) < (DelaySmp*j), то переход к п.17 иначе к п.18;
17. Smp ::= 0;
18. Прочитать из файла значение Smp;
19. SmpBuf [j] ::= Smp;
20. j ::= j+1; переход к п.15;
21. Mult ::= Volume;
22. j::=1;
23. Если j>Number, то переход к п.30 иначе к п.24;
24. k::=1;
25. Если k>Number, то переход к п.28 иначе к п.26;
26. SmpBuf[k-1] := SmpBuf[k-1] + Round(SmpBuf[k]*Mult);
27. k::=k+1; переход к п.25;
28. Mult ::= Mult*Volume;
29. j::=j+1; переход к п.23;
30. Smp := Round(SmpBuf[0]/(Number+1));
31. Если |Smp|>MaxValue, то переход к п.32 иначе к п.35;
32. Если Smp<0, то переход к п.33 иначе к п.34;
33. Smp::= - MaxValue;
34. Smp::=MaxValue;
35. Запись Smp в TempAudio;
36. i::=i+1; переход к п.13;
37. Сhannel ::= Channel+1; переход к п.11;
38. AudioData ::= TempAudio;
39. Конец.
Контрольный пример должен содержать примеры применения эффекта реверберации с различными параметрами.
AudioData – совокупность значений амплитуд и времен;
Start – указатель на место в массиве данных,с которого начинать обработку;
Count – количество элементов массивов, которые необходимо обработать;
Number – количество отражений;
Delay – время между отражениями;
Volume – громкость отклика относительно предыдущего;
TempAudio – получаемая совокупность значений амплитуд и времен;
SmpBuf – хранит выборку аудиоданных;
Mult – коэффициент для получения значения амплитуды отражения;
Smp – текущая амплитуда;
Channel – количество каналов;
MaxValue – макс. значение амплитуды в обрабатываемом фрагменте;
DelaySmp = Ti – Ti-1.
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25