На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS

Дорогие друзья! Поздравляем вас с Новым 2025 годом!

Всем удачи, успеха и благополучия!

msm.ru
Модераторы: RaD, nsh
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Треугольные фильтры для Mel-кепстра , Разбор формулы треугольных фильтров
    Может я в расчётах ошибаюсь. Пробую проверить всё вручную. Начинаю с массива F[m] - массив границ треугольников, рассчитываемый по формуле:

    user posted image
    где B^-1(b) это:
    user posted image

    Для заданной анализируемой полосы частот: F1 = 500 и Fh = 3500, мы получаем диапазон F[m] от: 11.6 до 75.48. И далее, если мы анализируем наш спектр (у меня сигнал 44кГц, окно Фурье: 2048 точек) по заданному диапазону: 500гц ... 3500гц. То как же мы будем проверять вхождение и формирование этих треугольников, если у нас получились F[m] только от 11гц до 75гц? Где у меня тут ошибка? :( Не слишком ли маленькие значения получаются у меня в F[m]?

    PS если я правильно понял, то F[m] это и есть Fc...
    Сообщение отредактировано: Black*Eternal -
      Цитата
      F[m] только от 11гц до 75гц?


      Не от 11Гц до 75Гц, а от 11 отсчета из 1024 отсчетов до 75 отсчета из 1024. И то тут в арифметике ошибка, должно быть:

      F[0] = 2048 / 44100 * 500 = 23.2

      F[M+1] = 2048 / 44100 * 3500 = 162.5

      Для анализа формул полезно применять понятие размерности физической величины, тогда не придется думать что к чему.

      Цитата
      F1 = 500


      Лучше 200
        Аа, мне кажется я понял почему мы разговаривали тут на разных языках :) Fc - это не одно и тоже, что и F[m]. В F[m] у нас границы в отсчётах, а в Fc у нас были границы в частотах :) А там уж формулу использовать либо переводя в частоты, либо в отсчёты :)

        У меня в F[m] отсчёты, поэтому и в качестве K в формуле нужно использовать порядковый номер отсчёта от 0 до 1024 (в случае с окном в 2048 точек).

        nsh, спасибо за нахождение ошибки, поправил! :) И F1 уменьшил до 200.

        Понять бы теперь как MFCC использовать для анализа сигнала :) Смотрю на получившиеся коэффициенты - впечатление, что какие-то они совершенно случайные, от балды получаются :lol: при довольно одинаковой форме исходного спектра :) Формантные области спектра стабильны, а MFCC коэффициенты осциллируют при этом как бешенные, не понять даже как такое можно использовать в распознавании :D
          Прикреплённый файлПрикреплённый файлА_Ы_Кепстр.jpg (98,49 Кбайт, скачиваний: 876)
          Вот кепстр по аналогии с сонограммой сделал.
          По вертикальной шкале - истинная частота.
            Я в конец запутался, очень сложно воспринимать информацию...уже 2 месяца бьюсь над этой задачей. Многое освоил, многое остается не понятным.
            Форумчане, может быть есть исходники на C# для Идентификации диктора (на примере легче разобраться) или исходник нахождения Вектора признаков мел-кепстральных коэффициентов?
              Цитата
              Я в конец запутался, очень сложно воспринимать информацию...уже 2 месяца бьюсь над этой задачей. Многое освоил, многое остается не понятным.


              Если что-то непонятно, лучше спросить. Для этого и существует форум. Только для того, чтобы получить ответ, желательно продемонстрировать хоть какие-то усилия.

              Цитата
              Форумчане, может быть есть исходники на C# для Идентификации диктора или исходник нахождения Вектора признаков мел-кепстральных коэффициентов?


              Есть

              http://marf.sourceforge.net
              http://prdownloads.sourceforge.net/marf/Sp...tar.gz?download

              Цитата
              на примере легче разобраться)


              Нужно понимать, что современные приложения, тем более приложения обработки сигналов, достаточно сложны. Без знания теории в них разбираться бессмысленно.
                Цитата nsh @
                Если что-то непонятно, лучше спросить. Для этого и существует форум. Только для того, чтобы получить ответ, желательно продемонстрировать хоть какие-то усилия.


                Мои "усилия" продемонстировал :
                Сообщ. #20, 29 октября, 08:04 :P
                Теперь хочу спросить:
                Вопрос 1: А нельзя ли фильтр сделать адаптивным?
                Мало того, что высшие гармоники из-за ЧМ "размазаны" по частоте, ещё и за счет увеличения частотного диапазона фильтра (с ростом частоты) будет теряться разрешение.
                Вопрос 2: Как будет распознаваться файл, если воспроизвести его "задом наперёд"?
                Мне кажется, что распознавание будет происходить также хорошо, как и при "нормальном" проигрывании. Это должно получаться из определения кепстра. Не говорит ли такое свойство об некоей избыточности метода?
                Сообщение отредактировано: Santik -
                  Цитата Santik @
                  Если что-то непонятно, лучше спросить. Для этого и существует форум.

                  Ок, начну заново, вдруг ошибаюсь (((
                  Пытаюсь из wav файла с голосом получить Вектор из мел-кепстральных коэффициентов. А потом сравнивать его с идеалом. Что я делаю:
                  1)Произвожу FFT файла (отправляю по 4096 байт). В итоге он мне выдает сэмплы по 4096 . Но берем мы не все значения а половину (т.е. 2048 т.к. половина симметрична). В итоге есть массив из семплов (т.е. FFT выдал 647 раз, в конечном массиве 647*2048 значений).
                  2)А дальше, как я понимаю, с помощью Треугольных фильтров надо получить Вектор признаков? Вот этот шаг мне не понятен....!!!!! Формул толковых найти не могу.
                  3)И остается сравнивать значения с идеалом (вектор состоит примерно из 20ти значений). Определяем расстояние между точками, если больше заданного, то диктор не соответствует идеалу.
                  Вот я так себе представлял задачу. Исправьте пожалуйста, если я ошибаюсь. И второй шаг меня выводит из колеи...
                  С уважением.
                    Цитата
                    Вопрос 1: А нельзя ли фильтр сделать адаптивным?
                    Мало того, что высшие гармоники из-за ЧМ "размазаны" по частоте, ещё и за счет увеличения частотного диапазона фильтра (с ростом частоты) будет теряться разрешение.


                    Что значит "адаптивным"?

                    Разрешение теряется, так как верхние частоты не столь важны для распознавания, как средние. На экспериментах по важности частот mel шкала и была получена.

                    Во многих системах распознавание речи параметры фильтров могут подстраиваться. Например, для высоких детских голосов они смещаются высокую сторону. Это называется "усреднение по длине голосового тракта" (Vocal Tract Lenght Normalization, VTLN).

                    Цитата
                    Вопрос 2: Как будет распознаваться файл, если воспроизвести его "задом наперёд"?
                    Мне кажется, что распознавание будет происходить также хорошо, как и при "нормальном" проигрывании. Это должно получаться из определения кепстра. Не говорит ли такое свойство об некоей избыточности метода?


                    Порядок окон же изменится. Возможно, Вы имели ввиду отражение значений внутри одного окна. При этом действительно распознавание не должно ухудшиться, в том числе и для человека. Это говорит не об избыточности метода, а, наоборот, свидетельствует, что метод отбрасывает несущественные характеристики.
                      Цитата
                      1)Произвожу FFT файла (отправляю по 4096 байт). В итоге он мне выдает сэмплы по 4096 . Но берем мы не все значения а половину (т.е. 2048 т.к. половина симметрична). В итоге есть массив из семплов (т.е. FFT выдал 647 раз, в конечном массиве 647*2048 значений).
                      2)А дальше, как я понимаю, с помощью Треугольных фильтров надо получить Вектор признаков? Вот этот шаг мне не понятен....!!!!! Формул толковых найти не могу.


                      Попробуйте начать с простого. Представьте, что у вас есть спектр в массиве a[2048] (2048 значений). Далее у вас есть фильтр в массиве b[2048]. Отфильтрованный спектр c[2048] вычисляется так:

                      ExpandedWrap disabled
                        for (i=0;i<2048;i++)
                          c[x] = a[x] * b[x];


                      Это понятно?

                      Значение энергии отфильтрованного сигнала вычисляется как:

                      ExpandedWrap disabled
                        e = 0;
                        for (i=0;i<2048;i++)
                          e = e + c[x] * c[x];


                      Теперь попробуйте обобщить это вычисление на 40 фильтров c[40][2048].
                        Цитата nsh @
                        Это понятно?

                        Спасибо, понятно.
                        Говоря фильтр b, вы имеете ввиду треугольный фильтр? Как его рассчитать-то?
                        Цитата nsh @
                        Теперь попробуйте обобщить это вычисление на 40 фильтров c[40][2048].

                        Значит у нас будит a[40][2048] (ффт нам выдал 40 сэмплов по 4096 значений) и также в цикле
                        for (i=0;i<2048;i++)
                        for (j=0;j<2048;j++)
                        c[i][j] = a[i][j] * b[j]; правильно ли я вас понял?
                          Цитата
                          Говоря фильтр b, вы имеете ввиду треугольный фильтр? Как его рассчитать-то?


                          До этого мы ещё дойдем, не торопитесь.

                          Цитата
                          Значит у нас будит a[40][2048] (ффт нам выдал 40 сэмплов по 4096 значений) и также в цикле
                          for (i=0;i<2048;i++)
                          for (j=0;j<2048;j++)
                          c[i][j] = a[i][j] * b[j]; правильно ли я вас понял?



                          Пока нет, ещё не дошли до понимания. Возможно, нужно следовать хорошей практике программирования и называть переменные своими именами.

                          У нас не 40 сэмплов, а 40 фильтров. Мы рассматриваем значения спектра в одном окне, до последовательности окон ещё дойдем. Допишите текст следующего метода:

                          ExpandedWrap disabled
                            class Filter {
                              float[] value;
                             
                              public Filter() {
                                 value = new float[2048];
                              }
                            }
                             
                            float[] calculateFilterbankEnergies(float[] spectrum, Filter[] filters) {
                              // Допишите здесь
                            }
                             
                            spectrum = new float[2048];
                            filters = new Filter[40];
                            Ок, буду следовать вашим указаниям и вникать.
                            ExpandedWrap disabled
                              class Filter {
                                float[] value;
                               
                                public Filter() {
                                   value = new float[2048];
                                }
                              }
                               
                              float[,] calculateFilterbankEnergies(float[] spectrum, Filter[] filters) {
                                // Допишите здесь
                                  float[,] c = new float[40,2048];//Фильтруем
                                  for ( int i = 0; i < 2048; i++)
                                      for (int j = 0; j < 2048; j++)
                                          c[i,j] = spectrum[j] * filters[i];
                               
                                 float[,] e = new float[40,2048];//Вычисляем энергию
                                  for (int i = 0; i < 2048; i++)
                                      for (int j = 0; j < 2048; j++)
                                          e[i,j] = e[i,j] + c[i,j] * c[i,j];
                                  return e;
                              }
                               
                              float[] spectrum = new float[2048];
                              float[] filters = new Filter[40];
                            Так?
                            Значит нам надо каждый семпл прогонять по 40 фильтрам?
                              Цитата
                              Значит нам надо каждый семпл прогонять по 40 фильтрам?


                              Не каждый сэмпл, а каждое окно. Сэмплов в окне 2048.

                              Цитата
                              for ( int i = 0; i < 2048; i++)
                              for (int j = 0; j < 2048; j++)
                              c[i,j] = spectrum[j] * filters[i];


                              Все не в тему. c, а лучше эту переменную назвать filteredSpectrum, должно быть float[40][2048], а не float[2048][2048]. e, а лучше называть energy должно быть float[40]. 40 значений на каждое окно. Думайте дальше, попробуйте хоть в редакторе код набрать, чтобы хоть как-то компилировался. Компилятор сам на ошибки укажет.
                                Цитата nsh @
                                Не каждый сэмпл, а каждое окно. Сэмплов в окне 2048.

                                Наверно у нас разные понимания понятий от того я не могу понять вас.
                                В ФФТ мы подавали скажем 600 раз (подавали файл по частям по 4096) то он выдает 600 массивов по 4096 (из 4096 берем половину).
                                В моей интерпритации это звучит так: Разбиваем исходный файл на сэмплы по 4096. Каждый семпл отправляем в ФФТ. В конце получаем массив a[600][2058]. И с ним работаем.
                                А вы разбиваете исходный файл на окна (мои семплы) по 4096. Каждое окно отправляете в ФФТ. В конце получаем массив a[600][2058] (каждое значение каждого окна вы называете сэмплом). И с ним работаем. Я правильно вас понял?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0408 ]   [ 17 queries used ]   [ Generated: 15.01.25, 14:07 GMT ]