![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
Цитата:
|
|
#17
|
||||
|
||||
|
Цитата:
Вот например этот цикл: Код:
for Sample := 1 to NumSamples do
begin
s:=s+Sample;
end;Код:
for Index := 1 to NumSamples do
begin
Sample := WavInfo.Samples[НомерКанала - 1, Index - 1]; // Читаем из массива очередной сэмпл
s:=s+Sample; // А вот теперь в переменной Sample действительно сэмпл wav-файла и его можно суммировать
end;Цитата:
Цитата:
|
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Dmitry_DM (27.09.2012)
| ||
|
#18
|
|||
|
|||
|
А можно так попробовать? Теоретический это правильно?
Код:
Z: array [0..10000,0..10000] of Int64;
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));
z[j,i]:=Sample;
end;
end;
WavInfo.NumSamples := LongInt(NumSamples);
end;
sl.SaveToFile('Samples.txt');
SL.Free;
for I := 1 to NumSamples do
begin
s:=(s+z[j,i]);
end;
Xch:=S/NumSamples;
S2:=0;
for I := 1 to NumSamples do
begin
S2:=s2+Sqr(z[j,i]-Xch);
end;
M1:=Sqrt((s2/NumSamples)*(s2/NumSamples)*(s2/NumSamples));
//
S2:=0;
for I := 1 to NumSamples do
begin
S2:=s2+(z[j,i]-Xch)*(z[j,i]-Xch)*(z[j,i]-Xch);
end;
M2:=(s2/NumSamples);
//
S2:=0;
for I := 1 to NumSamples do
begin
S2:=s2+sqr(z[j,i]-Xch);
end;
M3:=Sqr(s2/NumSamples);
//
S2:=0;
for I := 1 to NumSamples do
begin
S2:=s2+sqr(Sqr(z[j,i]-Xch));
end;
M4:=(s2/NumSamples);
A:=M2/m1;
E:=m4/m3; |
|
#19
|
||||
|
||||
|
Цитата:
Код:
for I := 1 to NumSamples do
begin
s:=(s+z[j,i]);
end; |
|
#20
|
|||
|
|||
|
Цитата:
А вот так работает! Я думаю, так правильнее всего. Как вы считаете? И хочу отметить, что при расчетах асимметрия должна быть близко к 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 Последний раз редактировалось Dmitry_DM, 28.09.2012 в 14:05. |
|
#21
|
|||
|
|||
|
poli-smen, так все-же так правильно будет или нет. По-моему так лучше всего. И еще такой вопрос: почему здесь
Код:
Sample := WavInfo.Samples[J - 1, I - 1]; |
|
#22
|
||||
|
||||
|
Цитата:
Код:
Sample := WavInfo.Samples[НомерКанала - 1, Index - 1]; // Читаем из массива очередной сэмпл Цитата:
То же самое и в остальных циклах. Цитата:
|
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Dmitry_DM (01.10.2012)
| ||
|
#23
|
|||
|
|||
|
poli-smen, вот эти формулы, которые я использую. Вот формула для нахождения эксцесса:
Только надо представить, что 3 нету. g2 - у меня E; m4 - m4; m2(в квадрате) - m3; n(общее кол.) - NumSamples; X[i] - Sample; X(вектор) - Xch; Теперь формула для нахождения асимметрии: ![]() g1 - у меня А; m3 - m2; m2(3/2) - m1; n(общее кол.) - NumSamples; X[i] - Sample; X(вектор) - Xch; Вот и все. По-моему так и вышло. |
|
#24
|
|||
|
|||
|
Цитата:
Код:
if WavInfo.WaveFormat.nChannels = 2
then Xch:=S/(NumSamples*2)
else Xch:=S/NumSamples; |
|
#25
|
||||
|
||||
|
Цитата:
Код:
Xch := S / (NumSamples * WavInfo.WaveFormat.nChannels) |
|
#26
|
|||
|
|||
|
Цитата:
|
|
#27
|
||||
|
||||
|
Цитата:
И ещё я это всё сократил бы примерно так: Код:
var
Sample, s: LongInt;
NumSamples, I, J, N: LongWord;
Xch, S1, S2, M1, M2, M3, M4, A, E: Extended;
....
begin
....
N := NumSamples * WavInfo.WaveFormat.nChannels; // Общее количество сэмплов
Xch := 0;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
Xch := Xch + WavInfo.Samples[J - 1, I - 1];
end;
end;
Xch := Xch / N; // Среднее арифметическое всех сэмплов
M2 := 0;
M3 := 0;
M4 := 0;
for I := 1 to NumSamples do
begin
for J := 1 to WavInfo.WaveFormat.nChannels do
begin
S1 := WavInfo.Samples[J - 1, I - 1] - Xch; // Отклонение от среднеарифметического
S2 := Sqr(S1); // Квадрат отклонения от среднеарифметического
M2 := M2 + S2; // Сумма квадратов
M3 := M3 + S1 * S2; // Сумма кубов
M4 := M4 + Sqr(S2); // Сумма 4 степени
end;
end;
M2 := M2 / N;
M3 := M3 / N;
M4 := M4 / N;
E := M4 / Sqr(M2);
A := M3 / Sqrt(M2 * M2 * M2);
....
end; |