Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.12.2012, 01:37
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию Значения случайной величины, интервалы

Здравствуйте. Вот уже несколько дней ломаю голову над поставленной задачей. В общем: есть значения случайной величины - сэмплы из wav файла. Надо подсчитывать кол-во значений случайной величины, которые попадают в j-ый интервал (N[j]).
Nj - абсолютная частота для j-го интервала;
j - номер интервала, j меняется от 1 до m;
m - кол-во интервалов;
Считается m так:
Код:
m:=trunc(3.3*log10(NumSamples)+1);
delX - длина интервала m (кол NumSamples, которые попали в m)
Считается delX так:
Код:
delX:=NumSamples / m;
То есть это все семплы разбились на интервалы, например NumSamples=1079, а m=11, delX=98. Получается 98*11 = 1078.
NumSamples - кол-во значений случайной величины;
С этим все ясно.
Вернемся к задаче.. (выделена красным)
Для этого надо создать цикл по i , которое изменять от 1 до NumSamples. В цикле проверять, в какой интервал попало i -е значение и при этом изменять соответствующий счетчик - абсолютную частоту.
Вот такой у меня цикл для всех операций с сэмплами:
Код:
   for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do        // так как бывает 2 канала. 
           begin
////////////////////////Здесь все происходит
           end;
      end;
Вот формула: (обведена красным)

Но пока Yj отложим на потом.
И на этом я застрял. Не знаю как это все осмыслить и как должно считаться. Как найти Nj??? Еще добавлю, что Nj по количеству должно быть столько же, сколько и m. Пока все. Надеюсь на вашу помощь. Заранее благодарен! Для меня это очень важно..
Ответить с цитированием
  #2  
Старый 14.12.2012, 13:15
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
В общем: есть значения случайной величины - сэмплы из wav файла. Надо подсчитывать кол-во значений случайной величины, которые попадают в j-ый интервал (N[j]).
Написано очень много, единственно только не написано по какому критерию необходимо разбрасывать сэмплы по интервалам.
Цитата:
Сообщение от Dmitry_DM
То есть это все семплы разбились на интервалы, например NumSamples=1079, а m=11, delX=98. Получается 98*11 = 1078.
А что с 1079-ым сэмплом? Он не учитывается?
Ответить с цитированием
  #3  
Старый 14.12.2012, 18:35
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Написано очень много, единственно только не написано по какому критерию необходимо разбрасывать сэмплы по интервалам.
Да вот это я не понимаю.. Мне кажется просто по-порядку, как идут в файле.
Можно как-то сделать пример и посмотреть что вышло? И еще - Nj должны быть ТОЛЬКО положительного значения. И их кол-во равняться кол m столбиков.
Цитата:
Сообщение от poli-smen
А что с 1079-ым сэмплом? Он не учитывается?
Это я сам не знаю. Всегда в первом m интервале на 1 семпл меньше, чем в остальных.
Ниже мой юнит, весь проект нету смысла выкладывать.
Вложения
Тип файла: rar Unit1.rar (5.6 Кбайт, 1 просмотров)
Ответить с цитированием
  #4  
Старый 14.12.2012, 20:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Да вот это я не понимаю..
Так как же можно решать задачу, если не известно её условие? (не метод решения, а именно условие)
Цитата:
Сообщение от Dmitry_DM
Мне кажется просто по-порядку, как идут в файле.
Ну тогда к примеру для случая NumSamples=1079 получим, что в нулевой интервал попадают сэмплы с 0 по 97, в первый интервал сэмплы с 98 по 195, во второй интервал сэмплы с 196 по 293 и т.д. И если подсчитывать кол-во значений случайной величины, которые попадают в j-ый интервал (N[j]), то получим что в нулевом интервале будет 98 сэмплов (т.е. N[0]=98) и в первом интервале будет 98 сэмплов (т.е. N[1]=98) и во втором интервале будет 98 сэмплов (т.е. N[2]=98) и т.д.
Ответить с цитированием
  #5  
Старый 14.12.2012, 23:41
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Цитата:
Сообщение от poli-smen
Так как же можно решать задачу, если не известно её условие? (не метод решения, а именно условие)
Ну тогда к примеру для случая NumSamples=1079 получим, что в нулевой интервал попадают сэмплы с 0 по 97, в первый интервал сэмплы с 98 по 195, во второй интервал сэмплы с 196 по 293 и т.д. И если подсчитывать кол-во значений случайной величины, которые попадают в j-ый интервал (N[j]), то получим что в нулевом интервале будет 98 сэмплов (т.е. N[0]=98) и в первом интервале будет 98 сэмплов (т.е. N[1]=98) и во втором интервале будет 98 сэмплов (т.е. N[2]=98) и т.д.
Да в том то и дело, что условие точно так и не стало мне понятно.. Вот я и спросил, есть ли какие-то варианты подсчетов.. А 98(данный пример) это дельта Х(delX). Это длина одного столбца. Как еще можно что-нибудь сделать, при этом использовать цикл, и что бы значения были разными и маленькими, потому что для построения гистограммы нужно откладывать границы (это по X). Левая граница первого интервала - это минимальное значение случайной величины, когда сделать нормировку(то есть разделить мин и макс на макс амплитуду) (оно всегда в районе (-1)) , правая граница первого интервала - это минимальное значение случайной величины плюс длина интервала m, m=3,3log*NumSamples+1, где NumSamples - кол-во значений случайной величины. Таким образом все столбики, (при NumSamples=1079 их 11) должны по Х откладываться в диапазоне от -1 до 1. Из этого выплывает, что в -1 до 1 не могут влезть столбики, шириной 98. Может произвести нормировку всех сэмплов? (поделить их в цикле на макс ампдитуду). Я так подумал, потому что на самом первом графике, на рис., было -128 + 128, а потом зачеркнулось и поставилось -1 +1. И логично предположить, что Y тоже не будут огромными. Гистограмма должна получится, как на прикрепленном мною рисунке, чуть выше формулы в прямоугольнике. Так же с той картинки видно, что 1<=j<=m. Значит j и m это разные значения. И еще видно, что один столбец выше, другой - ниже. Не все одинаковые. Это все что известно.. Вот так я ломаю голову уже долго..
Ответить с цитированием
  #6  
Старый 15.12.2012, 20:23
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

Ну что, poli-smen, есть идеи?
Ответить с цитированием
  #7  
Старый 21.12.2012, 19:46
Dmitry_DM Dmitry_DM вне форума
Активный
 
Регистрация: 07.08.2012
Сообщения: 258
Версия Delphi: Delphi 7
Репутация: 11
По умолчанию

poli-smen, теперь я все понял как должно быть. Но не знаю как это посчитать, как раз с этим прошу помощи.
Короче так: опишу на примере, так понятнее. Есть 1079 сэмплов, они разбиты на 11 интервалов m. Каждый из 1079 сэмплов имеет свою амплитуду, например
Код:
-0,00266193433895297
0,00443655723158829
-0,00798580301685892
0,0164152617568767
-0,163265306122449
-0,131322094055013
0,91659272404614
Так вот Nj - это сума амплитуд, именно для каждого интервала. Допустим:
Код:
N[1] = столько-то
N[2] = столько-то
N[3] = столько-то
...
N[m] = столько-то 
Наконец-то я пришел к разгадке. Теперь помогите оформить цикл, пожалуйста!
Вот сам кусок кода, отвечающий за подсчеты.
Код:
      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 Sample > WavInfo.MaxAmplitude then WavInfo.MaxAmplitude := Sample;
      if Sample < WavInfo.MinAmplitude then WavInfo.MinAmplitude := Sample;

        end;             ////////
      end;
    WavInfo.NumSamples := LongInt(NumSamples);

  for I := 1 to NumSamples do
    for J := 1 to WavInfo.WaveFormat.nChannels do
      begin
      Samp1[j,i]:=WavInfo.Samples[J - 1, I - 1];
      Samp2[j,i]:=WavInfo.Samples[J - 1, I - 1] / wavInfo.MaxAmplitude  ;
      if form1.chk1.Checked = False then
          begin
            Form1.Series1.Add(samp1[J , I ]) ;
            sl.Add(FloatToStr(samp1[J , I ]));
          end else
          begin
            Form1.Series1.Add(samp2[J , I ]) ;
            sl.Add(FloatToStr(samp2[J , I ]));
          end

      end;

   for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
       begin
         if form1.chk1.Checked = False then
          s:=(s+Samp1[j,i])
         else
          s:=(s+Samp2[j,i]);
       end;
      end;
      Xch := S / (NumSamples * WavInfo.WaveFormat.nChannels);
//
    S2:=0;
      for I := 1 to NumSamples do
    begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
      begin
        if form1.chk1.Checked = False then
          S2:=s2+Sqr(Samp1[j,i]-Xch)
         else
          S2:=s2+Sqr(Samp2[j,i]-Xch);
      end;
     end;
     M1:=Sqrt( Sqr(s2/NumSamples)*(s2/NumSamples) );
//

    S2:=0;
      for I := 1 to NumSamples do
    begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
      begin
        if form1.chk1.Checked = False then
          S2:=s2+sqr(Samp1[j,i]-Xch)*(Samp1[j,i]-Xch)
        else
          S2:=s2+sqr(Samp2[j,i]-Xch)*(Samp2[j,i]-Xch);
      end;
    end;
     M2:=(s2/NumSamples);
//
    S2:=0;
      for I := 1 to NumSamples do
    begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
      begin
        if form1.chk1.Checked = False then
          S2:=s2+sqr(Samp1[j,i]-Xch)
        else
          S2:=s2+sqr(Samp2[j,i]-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
       if form1.chk1.Checked = False then
          S2:=s2+sqr(Sqr(Samp1[j,i]-Xch))
       else
          S2:=s2+sqr(Sqr(Samp2[j,i]-Xch));
     end;
    end;
    M4:=(s2/NumSamples);

    Asymmetry:=M2/m1;
    Excess:=m4/m3;


     for I := 1 to NumSamples do
      begin
        for J := 1 to WavInfo.WaveFormat.nChannels do
       begin
       if form1.chk1.Checked = True then
           begin
         WavInfo.MinAmplitude:=WavInfo.MinAmplitude/WavInfo.MaxAmplitude;
         WavInfo.MaxAmplitude:=1;
           end;
     end;
    end;

    ///////////////////////////////////
    m:=trunc(3.3*log10(NumSamples)+1);
    delX:=(WavInfo.MaxAmplitude - WavInfo.MinAmplitude) / m;
Скажу только, что
Samp1[j,i] - не нормированные сэмплы
Samp1[j,i] - нормированные сэмплы (поделены на макс амплитуду)

Последний раз редактировалось Dmitry_DM, 21.12.2012 в 19:52.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:28.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter