A = {A1,A2,…,An} – массив амплитуд звукового сигнала;
T = {T1,T2,…,Tn} – массив со значениями времени, где n зависит от частоты дискретизации (ЧД), битрейта (Б) и размера файла;
Ti – Ti-1 определяется частотой дискретизации.
В результате реализации алгоритма формируются новые массивы значений амплитуд A’ и времени T’. Структура выходного файла при этом соответствует описанной в п.2.1.2.
Для получения выходных массивов A’ и Т’ используются следующие формулы:
A’1 = Аn;
A’2 = Аn-1;
…
A’n-1 = A2;
A’n = A1;
T’1 = Аn;
T’2 = Аn-1;
…
T’n-1 = A2;
T’n = A1.
Описание используемых обозначений приведено в п.2.8.2.
1. AbsStart ::= Start*AudioData.nBlockAlign;
2. AbsCount ::= Count*AudioData.nBlockAlign;
3. AbsFinish ::= AbsStart+AbsCount; i ::= AbsFinish;
4. Если (i-AbsStart)>=(MaxSizeOfBuffer), то переход к п.5 иначе к п.6;
5. BufferStart := i – MaxSizeOfBuffer; переход к п.7;
6. BufferStart := AbsStart;
7. AudioData.Data.Position := BufferStart; Прочитать знаение амплитуды в Buf;
8. Если i > BufferStart, то переход к п.9 иначе к п.11;
9. i := i - AudioData.nBlockAlign; AudioData.Data.Position := i;
10. Прочитать Buf из AudioData; Записать Buf в TempAudio; переход к п.8;
11. Если i = AbsStart, то переход к п.12 иначе к п.4;
12. AudioData.Data.Position := AbsStart; TempAudio.Data.Position := 0;
13. i ::= 1;
14. Если I > Count, то переход к п.17 иначе к п.15;
15. Прочитать Buf из TempAudio; Записать Buf в AudioData;
16. i ::= i+1; переход к п.14;
17. Конец.
Контрольный пример должен содержать примеры применения обращения звукового сигнала различных форм.
AudioData – совокупность значений амплитуд и времен;
Start – указатель на место в массиве данных,с которого начинать обработку;
Count – количество элементов массивов, которые необходимо обработать;
Number – количество отражений;
Delay – время между отражениями;
Volume – громкость отклика относительно предыдущего;
TempAudio – получаемая совокупность значений амплитуд и времен;
SmpBuf – хранит выборку аудиоданных;
Mult – коэффициент для получения значения амплитуды отражения;
Smp – текущая амплитуда;
Channel – количество каналов;
MaxValue – макс. значение амплитуды в обрабатываемом фрагменте;
DelaySmp = Ti – Ti-1.
Подпрограмма Reverberation служит для применения эффекта реверберации к указанному фрагменту звукового сигнала, записанного в файле. Текст подпрограммы приведен в приложении 1.
Подпрограмма Reverberation предназначена для реализации алгоритма создания эффекта реверберации.
Звуковой сигнал, записанный в файле, представлен следующим классом:
TAudioData = class(TObject)
public
nChannels: Word;
nSamplesPerSec: LongWord;
nBitsPerSample: Word;
nBlockAlign: Word;
Data: TFile;
constructor Create;
destructor Destroy;
procedure Calculate_nBlockAlign;
procedure ReadSample(Number, Channel: LongInt; var Value: Integer);
procedure WriteSample(Number, Channel: LongInt; Value: Integer);
private
Name: String;
end;
Описание полей класса представления звукового сигнала:
nChannels – число каналов;
nSamplesPerSecond – частота дискретизации;
nBitsPerSample – битрейт;
nBlockAlign – блок выравнивания (число каналов х разрядность);
Data – звуковые данные;
Name – имя файла.
TempAudio: TAudioData; – получаемая совокупность значений амплитуд и времен.
Описание используемых в подпрограмме переменных представлено в табл.2.2.
Таблица 2.2
Переменные, используемые в подпрограмме «Reverberation»
Имена переменных | Тип | Описание |
i, j, k | integer | Переменные-счетчики |
DelaySmp | Cardinal | Равно Ti – Ti-1 |
SmpBuf | array[0..64] of Int64 | Хранит выборку аудио-данных |
Mult | Real | Коэффициент для получения значения амплитуды отражения |
Smp | Integer | Текущая амплитуда |
Channel | Word | Количество каналов |
MaxValue | Cardinal | Максимальное значение амплитуды в обрабатываемом фрагменте |
Описание входных данных подпрограммы представлено в табл.2.3.
Таблица 2.3
Входные данные подпрограммы «Reverberation»
Имена переменных | Тип | Описание |
AudioData | TAudioData | Передаваемая исходная совокуп-ность значений амплитуд и времен |
Start | Cardinal | Стартовая позиция, с которой необходимо начать обработку |
Count | Cardinal | Количество позиций, которые необходимо обработать относи-тельно стартовой |
Number | Cardinal | Количество отражений |
Delay | Cardinal | Время между отражениями |
Volume | Real | Громкость отражения относитель-но предыдущего |
Выходные данные подпрограммы:
AudioData – измененная совокупность значений амплитуд и времен с эффектом реверберации.
В подпрограмме используются следующие подпрограммы:
1. ReadSample(Number, Channel: LongInt; var Value: Integer) – процедура чтения данных из звукового файла;
2. WriteSample(Number, Channel: LongInt; Value: Integer) – процедура записи данных в звуковой файл.
Схема подпрограммы «Reverberation» приведена на рис. 2.17.