Цитата:
Сообщение от poli-smen
А какой смысл вводить посредника в виде массива z? - Программа уже загрузила сэмплы звукового файла в массив WavInfo.Samples, а теперь мы их ещё копируем в массив z - получаем как минимум двойной расход памяти на пустом месте
- Первая размерность массива отвечает за количество каналов. Зачем здесь зарезервировано столько каналов? Бывает "моно" (1 канал), бывает "стерео" (2 канала), бывает ещё "4+1", "5+1", ну пусть 10 каналов, но десять тысяч это уже что-то невероятное - получаем ещё бесполезный перерасход памяти
- Вторая размерность массива отвечает за количество сэмплов. В массиве z зарезервировано память всего под десять тысяч семплов, а ведь недавно ты открывал звуковой файл в котором было 398592 сэмплов - в этот массив он никак не влезет
- Почему тип элементов массива z выбран Int64? Звуковые файлы в формате WAVEFORMATEX PCM бывают либо 8-битные (1 байт), либо 16-битные (2 байта), а массив z резервирует для них по 64 бита (8 байт) - опять бесполезный перерасход памяти
И ещё, где инициализируется переменная J вот в этом цикле?:
Код:
for I := 1 to NumSamples do
begin
s:=(s+z[j,i]);
end;
Да и в следующих циклах тоже?
|
Я так и думал, что так не правильно. А тем способом, что вы писали, он компилируется успешно, но возникает ошибка доступа (access violation).
А вот так работает! Я думаю, так правильнее всего. Как вы считаете? И хочу отметить, что при расчетах асимметрия должна быть близко к 0, у меня -0,4(Ну ладно, такое отклонение реальное, но не "-" же), а эксцесс должен быть близко к 3, но у меня 28,7(Это вообще как понимать??) Вот вроде бы успешный код, при
Код:
Sample, s: LongInt;
NumSamples: LongWord;
Xch, S2, M1, M2, M3, M4, A, E: Extended;
:
Код:
Sample := 0;
S:=0;
Sl:=tStringlist.Create;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
fs.ReadBuffer(Sample, BytsPerSample);
case BytsPerSample of
1: Sample := ShortInt(Sample);
2: Sample := SmallInt(Sample);
end;
WavInfo.Samples[J - 1, I - 1] := Sample;
if Abs(Sample) > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Abs(Sample);
sl.Add(IntToStr(Sample));
end;
end;
WavInfo.NumSamples := LongInt(NumSamples);
end;
sl.SaveToFile('Samples.txt');
SL.Free;
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;
//
S2:=0;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
Sample := WavInfo.Samples[J - 1, I - 1];
S2:=s2+Sqr(Sample-Xch);
end;
end;
M1:=Sqrt((s2/NumSamples)*(s2/NumSamples)*(s2/NumSamples));
//
S2:=0;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
Sample := WavInfo.Samples[J - 1, I - 1];
S2:=s2+(Sample-Xch)*(Sample-Xch)*(Sample-Xch);
end;
end;
M2:=(s2/NumSamples);
//
S2:=0;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
Sample := WavInfo.Samples[J - 1, I - 1];
S2:=s2+sqr(Sample-Xch);
end;
end;
M3:=Sqr(s2/NumSamples);
//
S2:=0;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
Sample := WavInfo.Samples[J - 1, I - 1];
S2:=s2+sqr(Sqr(Sample-Xch));
end;
end;
M4:=(s2/NumSamples);
A:=M2/m1;
E:=m4/m3;
Но не может же быть:
Код:
S: -294637033
Xch: -739,194547306519
M1: 12680979913,2141
M2: -6053863801,8443
M3: 29571300156300,5
M4: 849049452165860
Asymmetry: -0,477397160414704
Excess: 28,7119419057725
MaxAmplitude: 24927
BytsPerSample: 2
NumSamples: 398592
Ниже txt с выведенными сэмплами.