Показать сообщение отдельно
  #22  
Старый 30.09.2012, 21:40
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от 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, поэтому и вычитается единица.
Ответить с цитированием