|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Сэмплы, асимметрия и эксцесс
Здравствуйте! Столкнулся с проблемой. Надо вычислить асимметрию и эксцесс по сэмплам wav файла. Я точно не знаю правильно ли оно считается, потому что возникли непонятки с сэмплами и Max Amplitude. Я вывожу все сэмплы в txt файл и вижу, например следующее:
Код:
65529 {Я считаю, это не настоящие значение} 9 {А вот такое - нормальное} 65525 15 {Ну и такое - нормальное} 65510 78 {И такое} 50 65514 13 65521 65528 65504 65506 Вот код этого всего дела. P.S Выводы в memo сделал просто для наглядности. Код:
Sample := 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 := Int64(Sample); 2: Sample := Int64(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; sl.SaveToFile('Samples.txt'); SL.Free; WavInfo.NumSamples := LongInt(NumSamples); end; for Sample := 1 to NumSamples do begin s:=s+Sample; end; Xch:=S/NumSamples; S2:=0; for Sample := 1 to NumSamples do begin S2:=s2+Sqr(Sample-Xch); end; M1:=Sqrt((s2/NumSamples)*(s2/NumSamples)*(s2/NumSamples)); {Form1.Memo3.Lines.Add('S2(1): '+FloatToStr(s2)); } S2:=0; for Sample := 1 to NumSamples do begin S2:=s2+(Sample-Xch)*(Sample-Xch)*(Sample-Xch); end; M2:=(s2/NumSamples); {Form1.Memo3.Lines.Add('S2(2): '+FloatToStr(s2)); } S2:=0; for Sample := 1 to NumSamples do begin S2:=s2+sqr(Sample-Xch); end; M3:=Sqr(s2/NumSamples); {Form1.Memo3.Lines.Add('S2(3): '+FloatToStr(s2)); } S2:=0; for Sample := 1 to NumSamples do begin S2:=s2+sqr(Sqr(Sample-Xch)); end; M4:=(s2/NumSamples); {Form1.Memo3.Lines.Add('S2(4): '+FloatToStr(s2)); } A:=M2/m1; E:=m4/m3; Form1.Memo3.Lines.Add('S: '+intToStr(s)); Form1.Memo3.Lines.Add('Xch: '+FloatToStr(Xch)); Form1.Memo3.Lines.Add('M1: '+FloatToStr(m1)); Form1.Memo3.Lines.Add('M2: '+FloatToStr(m2)); Form1.Memo3.Lines.Add('M3: '+FloatToStr(m3)); Form1.Memo3.Lines.Add('M4: '+FloatToStr(m4)); Form1.Memo3.Lines.Add('Asymmetry: '+FloatToStr(A)); Form1.Memo3.Lines.Add('Excess: '+FloatToStr(E)); Form1.Memo3.Lines.Add('MaxAmplitude: ' + IntToStr(WavInfo.MaxAmplitude)); Последний раз редактировалось Dmitry_DM, 22.09.2012 в 17:25. |
#2
|
|||
|
|||
Ну помогите мне, пожалуйста! Мне срочно надо, чтобы двигаться дальше.
|
#3
|
||||
|
||||
Цитата:
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Dmitry_DM (23.09.2012)
|
#4
|
|||
|
|||
Цитата:
|
#5
|
|||
|
|||
Цитата:
|
#6
|
|||
|
|||
Цитата:
Код:
case BytsPerSample of 1: Sample := ShortInt(Sample); 2: Sample := SmallInt(Sample); end; 4294966664 4294967086 4294967113 Как их убрать? И еще одно: в txt файле с выведенными всеми сэмплами, нету сэмпла, равному MaxAmplitude. Хотя раньше (С Int64) такое число находилось. Неувязка получается.. А еще я заметил, что если в файле число байт для предоставления одного отчета: 4, а не 2, то сэмплов в txt файле в 2 раза больше, чем указано в NumSamples. Еще одна неувязка.. Последний раз редактировалось Dmitry_DM, 23.09.2012 в 22:25. |
#7
|
||||
|
||||
Цитата:
|
#8
|
|||
|
|||
Цитата:
Я попробовал повысить его до LongInt. Теперь все нормально (с величиной чисел). Вот только я не знаю:числа у меня вывелись <0 и >0. Это логично. Но по-моему не логично то, что на графике столбик-сэмпл выше оси OX соответствует отрицательному числу в txt файле. Как бы наоборот получается... P.S Всегда MaxAmplitude положительное, это из-за: Код:
if Abs(Sample) > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Abs(Sample); И еще все же мне непонятно так должно быть или нет: когда в wav BlockAling 4, а не 2, то сэмплов выводиться ровно в 2 раза больше. Последний раз редактировалось Dmitry_DM, 24.09.2012 в 11:56. |
#9
|
||||
|
||||
Цитата:
Цитата:
Чтобы перевернуть ординату в правильное положение нужно просто вычесть её из высоты (или из другой константы). Цитата:
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Dmitry_DM (24.09.2012)
|
#10
|
|||
|
|||
Цитата:
Цитата:
Или это так надо, исходя из того, что используется 2 канала? Последний раз редактировалось Dmitry_DM, 24.09.2012 в 14:17. |
#11
|
||||
|
||||
Цитата:
Код:
for i := X1 to X2 do begin X := Trunc(KX * (i - X1)); Y := aHeight - Trunc(KY * FWavInfo.Samples[Chanel, i] + DY); //^^^^^^^^^ - ВОТ ЭТО ДОБАВИТЬ if DrawWaveForm then begin if i = X1 then Can.MoveTo(X, Y) else Can.LineTo(X, Y); end else begin Can.Rectangle(X, DY, Trunc(KX * (i - X1 + 1)), Y); end; end; Цитата:
Код:
Header.BlockAlign := Header.NumChannels * BytsPerSample; |
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Dmitry_DM (24.09.2012)
|
#12
|
|||
|
|||
Цитата:
|
#13
|
||||
|
||||
Цитата:
Ну ладно. Теперь комментарии по коду: Цитата:
Во-вторых зачем в цикле складывать числа от 1 до NumSamples если для этого есть формула суммы арифметической прогрессии: , благодаря которой этот кусок кода превращается в такой: Код:
s := s + (NumSamples + 1) * NumSamples div 2; А следующие 4 цикла можно объединить в один: Код:
M1 := 0; M2 := 0; M4 := 0; for Sample := 1 to NumSamples do begin S2 := Sample - Xch; M3 := Sqr(S2); M1 := M1 + M3; M2 := M2 + M3 * S2; M4 := M4 + Sqr(M3); end; S2 := M1 / NumSamples; M1 := S2 * S2 * S2; M2 := M2 / NumSamples; M3 := Sqr(S2); M4 := M4 / NumSamples; Например при NumSamples:=12345 и твой и мой код выводят: Цитата:
|
#14
|
|||
|
|||
Ну почему же Sample не участвует в вычислениях? Ведь именно это число самое главное, к тому же подтверждением этих сэмплов есть вывод их в txt. Они там благополучно присутствуют.
На счет инициализации s: Что, просто поставить в начале всего процесса S:=0; ? И еще: почему мы заменяем Код:
s:=s+Sample; Код:
s := s + (NumSamples + 1) * NumSamples div 2; Если по формуле надо к S прибавлять X[i]. В моем случае это Sample. На счет объединения я согласен, так лучше. И все же меня обеспокоило, что вы думаете, что Sample не участвуют в вычислениях. А ведь должны... Кстати я попробовал на своем файле ваш и мой коды и результаты отличаются. Вот мой код: Код:
S: 2128579200 Xch: 5340,24566473988 M1: 1,14695763333214E16 M2: 1,50001740981296E16 M3: 2,58660334456677E21 M4: 4,71908198619544E21 Asymmetry: 1,30782285781133 Excess: 1,82443202824585 MaxAmplitude: 24927 BytsPerSample: 2 NumSamples: 398592 Код:
S: 2128579200 Xch: 5340,24566473988 M1: 1,31551181265887E32 M2: 1,50001740981296E16 M3: 2,58660334456677E21 M4: 4,71908198619544E21 Asymmetry: 1,14025385053835E-16 Excess: 1,82443202824585 MaxAmplitude: 24927 BytsPerSample: 2 NumSamples: 398592 Код:
s := s + (NumSamples + 1) * NumSamples div 2; то вообще будет так: Код:
S: -1789100032 Xch: -4488,54977520873 M1: 1,6427827395735E32 M2: 1,65569732810786E16 M3: 2,99953145624851E21 M4: 5,33904181819595E21 Asymmetry: 1,00786140992552E-16 Excess: 1,77995860222565 MaxAmplitude: 24927 BytsPerSample: 2 NumSamples: 398592 Последний раз редактировалось Dmitry_DM, 25.09.2012 в 21:41. |
#15
|
|||||||
|
|||||||
Цитата:
Цитата:
Цитата:
Цитата:
Код:
for Sample := 1 to NumSamples do begin s:=s+Sample; end; Код:
s := s + (NumSamples + 1) * NumSamples div 2; Код:
s := (NumSamples + 1) * NumSamples div 2; Цитата:
Смотри во вложении тестовый пример. Там левая кнопка выводит в левый Memo результат работы твоего кода, а правая кнопка выводит в правый Memo результат работы моего кода. Результаты не должны отличаться. Для вычислений открывать wav-файл не нужно, достаточно ввести в поле ввода значение NumSamples (количество сэмплов), которые ты можешь получить открыв wav-файл в своей программе, ну и заодно убедиться, что результаты работы в твоей программе и в этом тестовом примере не отличаются и не зависят от самого wav-файла. И ещё обрати внимание, что у тебя там происходит переполнение: если сложить все числа от 1 до 398592 (т.е. 1+2+3+...+398591+398592), то должно получиться огромное число 79437990528, а у тебя показывает всего лишь: Цитата:
Цитата:
|
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Dmitry_DM (26.09.2012)
|