Цитата:
Сообщение от Dmitry_DM
Я так и думал, что так не правильно. А тем способом, что вы писали, он компилируется успешно, но возникает ошибка доступа (access violation).
|
В моём способе "Access Violation" может возникнуть разве что если неправильно указать номер канала вот здесь:
Код:
Sample := WavInfo.Samples[НомерКанала - 1, Index - 1]; // Читаем из массива очередной сэмпл
Если у звукового файла всего 1 канал, то вместо "НомерКанала" можно подставлять только число 1. Если у звукового файла 2 канала, то вместо "НомерКанала" можно подставлять число 1 либо 2. Если же вместо "НомерКанала" поставить например 0, то после вычитания единицы получем несуществующий индекс -1 (минус один) и как следствие "Access Violation".
Цитата:
Сообщение от Dmitry_DM
А вот так работает! Я думаю, так правильнее всего. Как вы считаете?
Код:
....
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
Sample := WavInfo.Samples[J - 1, I - 1];
s:=(s+Sample);
end;
end;
Xch:=S/NumSamples;
....
|
Тут наверно тоже не совсем правильно. В NumSamples хранится количество сэмплов в одном канале. Если в звуковом файле один канал, то всё правильно, если же в звуковом файле 2 канала, то в этих циклах просуммируется в 2 раза больше сэмплов чем указано в переменной NumSamples, но потом при вычислении Xch мы делим на NumSamples, а не на (NumSamples*2). А если я правильно понял - в переменной Xch должно вычисляться среднее арифметическое?
То же самое и в остальных циклах.
Цитата:
Сообщение от Dmitry_DM
И еще такой вопрос: почему здесь
Код:
Sample := WavInfo.Samples[J - 1, I - 1];
именно [J - 1, I - 1]. Зачем -1 делать. Просто знать хочу.
|
Так как в динамических массивах нумерация идёт от нуля и до Length-1, а здесь в циклах подсчёт идёт от 1 до Length, поэтому и вычитается единица.