|
|
Регистрация | << Правила форума >> | 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; |