Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.16.66.156] |
|
Сообщ.
#1
,
|
|
|
Привет братьям по несчастью =) Перед мной тоже стоит задача сравнить два файла (записаных с микрофона), содержащие одну и ту же фразу. Я делаю так:
1 Считываю файлы (по 2с) Частота дискретизации = 12КГц 2 Обрезаю лишнее (шум) остается приблизительно 1/3 сигнала 3 Делю их на фреймы (кадры) по 20мс с перекрытием в 2/3 3.1 Беру один фрейм. Применяю к нему "pre-emphasise". Формула: v(n) = s(n) - a * s(n - 1), где s(n) - исходный сигнал, а - переметр фильтрации (0.9375), v(n) - отфильтрованный сигнал. 3.2 Умножаю фрейм на окно Хемминга. Формула: f(i) = y(i) * w(i), y(i) - исходный сигнал, w(i) - оконная функция: w(n) = 0.54 - 0.46 * cos(2 * pi * (n - 1) / (N - 1)); (n = 0..N) N - кол-во отсчетов оконной функции. Оно равно длине фрейма. 3.3 Произвожу БПФ(600) 12КГц / 20мс = 600 отсчетов (300 в одну сторону и 300 симметричных) 3.4 Далее формирую 300 пар по принципу описаного в этой теме: s(k) = y(k) ^ 2 + y((N + 1) - k) ^ 2; (k = 1..300; N = 600) Первый с последним, второй с предпоследним и т д 3.5 Логаифмирую: s_log(k) = log(s(k)); 3.6 Взял 24 частоты. FHZ = [20,100,200,300,400,510,630,770,920,1080,1270,1480,1720,2000,2320,2700,3150,3700,4400,5300,6400,7700,9500,12000]; Перевожу их в МЕЛ-шкалу: mel(i) = 1127 * log(1 + FHZ(i) / 700); (i = 1..24) 3.7 Усредняю (взятое из той же темы) Fs = 12000 / 300; for j = 2:23 kj = round(FHZ(j) / Fs); kl = round(FHZ(j - 1) / Fs); kr = round(FHZ(j + 1) / Fs); l = kj - kl; r = kr - kj; Aj = 0; for i = 1:l mi = i / l; Aj = Aj + s_log(kl + i) * mi; end for i = 1:r - 1 mi = i / r; Aj = Aj + s_log(kr - i) * mi; end A(j) = Aj / (l + r - 1); end 3.8 Вычисление кепстральных коеффициентов (КК) через cos-преобразование: N - кол-во СПЕКТРальных коеф. = 22 (без двух крайних) for k = 1:12 c(k) = 0; for i = 2:23 c(k) = c(k) + A(i) * cos(pi * k * (2 * (i - 1) + 1) / 2 / N); end end 4 Сравнение с помощью DTW: D(x,y) = sqrt(sum( (x[i] - y[i])^2 ) ); x - входной вектор y - эталонный вектор словаря ---------------------------- Подвожу итог: в результате этих всех преобразований мы получим по 12 КК для каждого фрейма. А фреймов у меня (с перекрытием 2/3) в обрезаном сигнале 88. Тоесть получается матрица 12х88. Тоже самое я делаю для другого звукового сигнала. Проделав это все ничего не получается. Например слово "восемь" одинаково похоже на слово "девять", "восемь". Кстати графики получившихся КК визуально пхожи друг на друга формой. Если нужно я могу выложить графический результат любого шага. ---------------------------- * Может я DTW неправильно делаю, или мне нужно взять другой метод сравнивания? * Может нужно сперва сделать pre-emphasise и Хемминга для всего сигнала, а потом только брать опять по одному фрейму и делать 3.3...3.8 ? * Я так и не понял что делать частотами, переведенными в мел шкалу. Пункт 3.6 * Кол-во отсчетов БПФ влияет както на распознавание? И правильно ли я подобрал их кол-во? * Правильно ли я подсчитал Fs? Эта тема была разделена из темы "Нормирование речевого сигнала" |
Сообщ.
#2
,
|
|
|
В целом всё правильно вроде
Цитата 3.5 Логаифмирую: s_log(k) = log(s(k)); Обычно логарифмы берут уже от результатов фильтрации гребенки. В этом случае всего 20 логарифмов нужно посчитать, а не 300. Цитата где s(n) - исходный сигнал, а - переметр фильтрации (0.9375), v(n) - отфильтрованный сигнал. Обычно 0.97 фильтрация Цитата Может я DTW неправильно делаю, или мне нужно взять другой метод сравнивания? DTW подразумевает прямой и обратный проходы, вы их точно делаете? У Вас только формула написана одна. |
Сообщ.
#3
,
|
|
|
Цитата nsh @ Цитата где s(n) - исходный сигнал, а - переметр фильтрации (0.9375), v(n) - отфильтрованный сигнал. Обычно 0.97 фильтрация Что значит "обычно"? Мне например больше нравится коэффициент 0.5 Это как хорошо или плохо? По идее точность распознования должна меняться с изменением этого коэффициента. nsh, вы много чего читали и читаете, может вы сможете прояснить этот вопрос? |
Сообщ.
#4
,
|
|
|
Цитата 3.3 Произвожу БПФ(600) 12КГц / 20мс = 600 отсчетов (300 в одну сторону и 300 симметричных) Это как так? Ведь 20мс при частоте 12 000Гц - это 240 отсчётов. 12 000 - 1000мс x - 20мс х = 240; |
Сообщ.
#5
,
|
|
|
Цитата Что значит "обычно"? Мне например больше нравится коэффициент 0.5 Это как хорошо или плохо? По идее точность распознования должна меняться с изменением этого коэффициента. nsh, вы много чего читали и читаете, может вы сможете прояснить этот вопрос? Этот фильтр для предусиления высоких частот используется, собственно и коэффициент фильта подобран, чтобы нужные частоты предусиливались. Я так понимаю, там 6dB на 3kHz как раз получается. Никогда не смотрел точно. Ещё недавно читал, что такое предусиление не особо нужно, потому что его эффект затем нормализацией CMN убирается. Для меня полезность такого фильтра только в том, что он DC убирает, поэтому его перед простым VAD считающим энергию ставить можно. |
Сообщ.
#6
,
|
|
|
Цитата Обычно логарифмы берут уже от результатов фильтрации гребенки. В этом случае всего 20 логарифмов нужно посчитать, а не 300. Сделал, теперь логарифмирую после усреднения. Цитата Обычно 0.97 фильтрация Я нашол на форуме ссылку на сайт, там лежат исходники. Судя по коду их писали здоровые дядьки. Я решил полностью им доверится. Так вот у них этот коэффициент равен 0.9375 Цитата DTW подразумевает прямой и обратный проходы, вы их точно делаете? У Вас только формула написана одна. А насчет DTW - видимо я гдето недочитал, буду разбираться. Парочка вопросов: * Кол-во отсчетов БПФ влияет на точность распознавания? * Вы так и не ответили зачем нужен перевод в МЕЛ-шкалу (пункт 3.6)? Можетбыть далее при усреднении (пункт 3.7) вместо массива FHZ = [20,100,200...7700,9500,12000] нужно использовать массив МЕЛ-частот m[]? ... for j = 2:23 kj = round(FHZ(j) / Fs); kl = round(FHZ(j - 1) / Fs); kr = round(FHZ(j + 1) / Fs); l = kj - kl; r = kr - kj; ... |
Сообщ.
#7
,
|
|
|
Цитата 3.4 Далее формирую 300 пар по принципу описаного в этой теме: s(k) = y(k) ^ 2 + y((N + 1) - k) ^ 2; (k = 1..300; N = 600) Первый с последним, второй с предпоследним и т д Поясните, зачем первый с последним, второй с предпоследним. Может быть просто Цитата (из поста Анатоля ) исходя их ссылки в вашем пункте 3.4s[k}=a[k]*a[k]+b[k]*b[k]; (для всех k) Как я понимаю просто находим модуль комплексного числа которым является результат FFT z = x+iy z*z = x*x+y*y |
Сообщ.
#8
,
|
|
|
Цитата nsh @ Этот фильтр для предусиления высоких частот используется, собственно и коэффициент фильта подобран, чтобы нужные частоты предусиливались. У любого цифрового фильтра коэффициенты могут быть любые. Это зависят в первую очередь от того, какую частотную характеристику вы хотите получить на выходе. Если вы собираетесь использовать этот же фильтр (т.е. ту же самую АЧХ) с другой тактовой частотой, коэффициенты необходимо пересчитывать. "Обычно 0.97" это глупость. Этот фильтр полностью убирает DC только при коэффициенте 1.0. При всех прочих DC остается. Цель использования этого фильтра - скорректировать АЧХ речи, которая в среднем имеет характеристику -6дБ/окт. Гораздо лучше с этим справляется оыбчный ФВЧ первого порядка, у которого характеристика +6дБ/окт и на выходе ни при каких уловиях не может быть DC |
Сообщ.
#9
,
|
|
|
mjpronin, вы хотите сказать, что a[k] - истенная часть, а b[k] - мнимая? И мне нужно вместо того, как я делал раньше:
a[1]*a[1] + b[300]*b[300] a[2]*a[2] + b[299]*b[299] ... a[148]*a[148] + b[151]*b[151] a[149]*a[149] + b[150]*b[150] где a[k], b[k] - один и тотже массив сделать вот так: a[1]*a[1] + b[1]*b[1] a[2]*a[2] + b[2]*b[2] ... a[149]*a[149] + b[149]*b[149] a[150]*a[150] + b[150]*b[150] где a[k] - истенная часть, а b[k] - мнимая. (k =1..150). Тогда выходит вторую часть спектра мы вобще не трогаем. Я правильно понимаю? Если чесно, то я незнаю как правельнее, пусть нам подскажут эксперты =) |
Сообщ.
#10
,
|
|
|
Цитата -unGod Если чесно, то я незнаю как правельнее, пусть нам подскажут эксперты =) В разных процедур вычисления БПФ выходные даные могут размещатся в различном порядке. Обычно в таком: а0,б0,а1,б1,а2,б2... Но могут и иначе. Если Ви не знаете что выдает на выходе ваша процедура БПФ, то эксперементируйте. Подайте на вход известный сигнал (синус определённой частоты) и смотрите, что на выходе. |
Сообщ.
#11
,
|
|
|
Цитата Если вы собираетесь использовать этот же фильтр (т.е. ту же самую АЧХ) с другой тактовой частотой, коэффициенты необходимо пересчитывать. "Обычно 0.97" это глупость. Да, тут я был неправ. Цитата Гораздо лучше с этим справляется оыбчный ФВЧ первого порядка, у которого характеристика +6дБ/окт и на выходе ни при каких уловиях не может быть DC Согласен. Цитата Вы так и не ответили зачем нужен перевод в МЕЛ-шкалу (пункт 3.6)? Мел шкала использовалась, чтобы получить параметры гребёнки фильтров FHZ = [ 20,100,200,300,400,510,630,770,920,1080,1270,1480,1720,2000,2320,2700,3150,3700,4400,5300... У Вас они уже заданы в табличном виде, а можно было их вычислить по вышеприведённой формуле. |
Сообщ.
#12
,
|
|
|
KoPoBuH
Цитата Гораздо лучше с этим справляется оыбчный ФВЧ первого порядка, у которого характеристика +6дБ/окт и на выходе ни при каких уловиях не может быть DC А не могли ли Вы чуть подробней пояснить, какой вид имеет обычный ФВЧ первого порядка, у которого.....? Просто я если и использовал фильтры в своих работах, то обычно использовал полосовые 4 порядка или ФНЧ(ФВЧ) 2 порядка с передаточной функцией апроксимированной полиномами чебышева второго рода, генерацию коэфициентов производил в Matlab, благо там это просто. Хотя всегда подозревал, что можно попробовать что-то другое |
Сообщ.
#13
,
|
|
|
Цитата KoPoBuH @ Если вы собираетесь использовать этот же фильтр (т.е. ту же самую АЧХ) с другой тактовой частотой, коэффициенты необходимо пересчитывать. "Обычно 0.97" это глупость. 1. АЧХ этих фильтров сколько-нибудь заметно отличаются только на самых низких частотах: для 8кГц на 100 герцах отличие около 1 дБ для 20кГц на 100 герцах-~4 дБ, на 200 герцах - ~2дБ. дальше - меньше. 2. Пересчитывать надо, если собираетесь использовать одни и те же модели на всех частотах квантования, чего никто не делает. И вообще, пересчитывать - это слишком громко сказано. Можно минуты за 3 подобрать коэффициент, который обеспечит совпадение АЧХ на нижних частотах для любых частот квантования. 3.Самое главное: Цитата nsh @ такое предусиление не особо нужно, потому что его эффект затем нормализацией CMN убирается. И правильно, тем более, что абсолютная величина признаков при вероятностном подходе роли не играет - PDF будет такой же. Так что 0.97 - это традиция из времён ДП, которая ничего не стоит и лишь выравнивает спектр для более удобного обозрения. Кстати, эта операция, проведённая в частотной области, меньше шумит. Так что можно преобразовывать прямо спектр и забыть про мягкое дифференцирование. Цитата -unGod- @ - опять для понижения размерности - подробный спектр на высоких частотах не содержит различительных признаков и не воспринимается слухом. См. работы по речевосприятию. зачем нужен перевод в МЕЛ-шкалу (пункт 3.6)? |
Сообщ.
#14
,
|
|
|
И вообще, пересчитывать - это слишком громко сказано. Можно минуты за 3 подобрать коэффициент, который обеспечит совпадение АЧХ на нижних частотах для любых частот квантования
Чистой воды схоластика - мы не будем расчитывать, мы будет подбирать Так что 0.97 - это традиция из времён ДП, которая ничего не стоит и лишь выравнивает спектр для более удобного обозрения. Кстати, эта операция, проведённая в частотной области, меньше шумит. Так что можно преобразовывать прямо спектр и забыть про мягкое дифференцирование. Традиция переросшая в религию Кстати, эта операция, проведённая в частотной области, меньше шумит Интересно знать откуда берутся дополнительные шумы при линейной операции. iitta, я не понимаю ваш странный способ опровергать, пересказывая своими словами то, что вы опровергаете |
Сообщ.
#15
,
|
|
|
Перевод в МЕЛ-шкалу, я задействовал нужным образом.
А тот пункт 3.4 (из первого поста). Я просто взял из 300 отсчетов ровно половину и повозносил их в квадрат. Поскольку взять отдельно истенную и мнимую часть неполучилось =( Наборы КЕПСТРальных коэффициентов у меня получились похожие на глаз. А вот алгоритм DTW их не сильно "одобряет". Напимер, слова "один", "три", "четыре", "семь", "восемь", "девять" - распознает с вероятностью в диапазоне 35%..60%, а вот слово "пять" путает с "семь". У "шесть" и "три" процент очень мал. Из всего вышепроделанного я понял, что для хорошего распознавания команды нужно правильно ее отделить от шума. Ведь при обрезании возможен такой случай когда шум обрежится некоректно и в результате мы можем получить команду с небольшим хвостиком шума сзади, например. Эта ошибка может сильно повлиять на распознавание. Так как при распознавании эталона - хвостика небыло. И еще один момент. Я много где читал, что люди доводили распознавание аж до 97%. А у меня ели ели 60% и незнаю как улучшить =( Будьте любезны, напишите свои мнения по этому поводу |
Сообщ.
#16
,
|
|
|
Внес небольшие изменения в алгоритм:
Массив частот FHZ раньше был до 12000, а теперь до 150 (поскольку 150 отсчетов в БПФ/2). Кол-во элеметов сделал 20. Частоты в Герцах. FHZ = [7,15,22,30,37,45,52,60,67,75,82,90,97,105,112,120,127,135,142,150]; Результат: Значительное улучшение распознавания приблизительно на 20..30%. У меня теперь слово "семь" распознает на 90% =) Также хорошо распознаются длинные команды: "наушники", "микрофон" |
Сообщ.
#17
,
|
|
|
Цитата mjpronin @ А не могли ли Вы чуть подробней пояснить, какой вид имеет обычный ФВЧ первого порядка, у которого.....? читать здесь |
Сообщ.
#18
,
|
|
|
Цитата KoPoBuH @ Интересно знать откуда берутся дополнительные шумы при линейной операции. Похоже опять вы не в теме.Нам еще на 3 курсе говорили, что умножение спектра на АЧХ часто более помехоустойчиво, чем фильтрация во временной области |
Сообщ.
#19
,
|
|
|
Это замечательно, что вы в курсе данного вопроса. Вот и обьясните откуда в данном случае могут возникать дополнительные шумы, если корректировать АЧХ во временной области
|
Сообщ.
#20
,
|
|
|
Цитата KoPoBuH @ Цитата mjpronin @ А не могли ли Вы чуть подробней пояснить, какой вид имеет обычный ФВЧ первого порядка, у которого.....? читать здесь Я имел ввиду, какую передаточную функцию (формулу,выражение) в контексте цифровой обработки данных, а не схемотехники. |
Сообщ.
#21
,
|
|
|
Цитата mjpronin @ Я имел ввиду, какую передаточную функцию (формулу,выражение) в контексте цифровой обработки данных, а не схемотехники. Yt = A*(Xt - Xt-1) - B*Yt-1 A = y/(1+y) B = (1-y)/(1+y) y = cos(w)/sin(w) w = PI*f/fc |
Сообщ.
#22
,
|
|
|
Цитата KoPoBuH @ Вот и обьясните откуда в данном случае могут возникать дополнительные шумы, если корректировать АЧХ во временной области Дополнительных шумов никто и не обещал, а вот уменьшение шума наблюдается за счёт участия всех компонент окна анализа в получении спектра. Хотя судя по вашим предыдущим заявлениям, объяснить вам ничего невозможно Добавлено Цитата KoPoBuH @ Yt = A*(Xt - Xt-1) - B*Yt-1 A = y/(1+y) B = (1-y)/(1+y) y = cos(w)/sin(w) w = PI*f/fc А это уже напоминает высокомерное издевательство над неопытным человеком. АЧХ КИХ фильтра с одним нулем (y[i] = x[i] - a*x[i-1]): SQRT(1 + a*a - 2*a*cos(2*PI*f/F)), где F-частота квантования. Зачем было присобачивать полюс и делать фильтр рекурсивным надо бы объяснить. А для фильтра с полюсом АЧХ: SQRT((1 + a*a - 2*a*cos(2*PI*f/F))/(1 + b*b + 2*b*cos(2*PI*f/F))), а к половинному аргументу привести косинус поручить младшему брату. |
Сообщ.
#23
,
|
|
|
antonsrv8, То что написал Коровин - понятно.
А то, что Вы написали - непонятно. Какой-то корень, висящий в воздухе. |
Сообщ.
#24
,
|
|
|
Цитата Анатоль @ antonsrv8, То что написал Коровин - понятно. А то, что Вы написали - непонятно. Какой-то корень, висящий в воздухе. корень из всего, что внутри (скобки вроде правильно поставил) Ну, если Цитата Анатоль @ То что написал Коровин - понятно. скажите, зачем А умножать на Xt-Xt-1 - это полное дифференцирование с коэффициентом усиления А. Исходя из формул, А и В зависят от частоты - это тоже объясните. Понятно, что для фильтра Yt = Xt - A*Xt-1 - B*Yt-1 наклон АЧХ можно эффективно регулировать дополнительным полюсом. Непонятно только зачем это наворачивать, если и простой фильтр Yt = Xt - A*Xt-1 не особо нужен |
Сообщ.
#25
,
|
|
|
Цитата antonsrv8, корень из всего, что внутри И что с этим корнем делать? Из сообщения Коровина ясно как вычислять У зная Х и предыдуший У. (У него есть формулы для А и В) У Вас же для вчисления у нужен коэфициент а. А как его найти - не понятно. Он входит в какой-то корень. Ну и что? Как его можно вычислить, если корень ни к чему не приравнен, а просто висит себе в воздухе? |
Сообщ.
#26
,
|
|
|
Цитата antonsrv8 @ Дополнительных шумов никто и не обещал, а вот уменьшение шума наблюдается за счёт участия всех компонент окна анализа в получении спектра. Хотя судя по вашим предыдущим заявлениям, объяснить вам ничего невозможно Т.е. тем самым вы утверждаете, что если я хочу уменьшить шум в сигнале, то мне достаточно перевести сигнал из временного представления в спектральное и обратно. Звучит очень революционно. У меня только один вопрос - сколько раз я должен проделать эти преобразования, чтобы уменьшить шум на 10дБ? antonsrv8, мне почему-то кажется что прична несколько в другом. При линейной обработке сигнала шумам просто неоткуда взяться. На то она и линейная обработка. Все шумы появляются от нелинейности. В случае цифровой фильтрации источником шума является усечение результата из-за ограничений на разрядность аккумулятора и элементов задержки фильтра. Если говорим об устойчивости фильтра, то нужно сюда добавить разрядность коэффициентов. Фильтры бывают КИХ и БИХ. БИХ фильтры наиболее чувствительны к величине разрядности, но это совершенно пустая фраза, потому как устойчивость фильтра зависит как от его архитектуры так и от его параметров. Т.е. устойчивость понятие частное. При одной и той же архитектуре, при одной и той же разрядности БИХ фильтр может быть устойчивым, малошумящим, а может и нет. Это зависит от характера фильтра. В частности насколько шумит БИХ фильтр зависит от его частоты среза. КИХ фильтры этим не грешат. В данном конкретном случае мы имеем КИХ фильтр, поэтому совет iitta, что коррекция АЧХ в спектральной области якобы меньше шумит, чем во временной, совершенно не поделу и по сути является еще одной религиозной догмой от науки. Даже если предположить, что результат после дифференциатора усекается до 16 бит, мы имеем шум на выходе на уровне половины младшего разряда. Если при этом учесть, что динамический диапазон реального речевого сигнала в самом лучшем случае составляет порядка 50дБ (что нужно еще постараться получить), что есть в свою очередь 8 старших разрядов из 16, то получается шум КИХ фильтра лежит на уровне порядка -50дБ от уровня шумов речевого сигнала. Так с чем же идет пресловутая борьба? Все это было актуально в прошлом веке. Сегодня вычисления с плавающей точкой быстрее по сравнению с целочисленными и поэтому проблем с ограниченной разрядностью порождающей шумы по сути не существует Цитата antonsrv8 @ Непонятно только зачем это наворачивать, если и простой фильтр Yt = Xt - A*Xt-1 не особо нужен Что значит не особо нужен? Кто-то делает CMN, кто-то нет, в любом случае не будет лишним, а речь шла о постоянной составляющей, которая полностью не убирается этим мягким дифференцированием из-за требований к корректирующей АЧХ |
Сообщ.
#27
,
|
|
|
Цитата Анатоль @ И что с этим корнем делать? Вы что, модуль комплексного числа никогда не вычисляли - извлекать его, если хотите амплитудную характеристику. Коэффициент 'а' находится из ваших же требований к АЧХ. Цитата Анатоль @ Из сообщения Коровина ясно как вычислять У зная Х и предыдуший У. (У него есть формулы для А и В) Прошу все таки объяснить - А и В зависят от f? вы сами-то понимаете, что там написано? Цитата KoPoBuH @ Звучит очень революционно. У меня только один вопрос - сколько раз я должен проделать эти преобразования, чтобы уменьшить шум на 10дБ? Какая там революционность - студентам преподают. что же мне - слушать вашу ахинею про разрядности и забыть чему учили? Один раз уже послушал - оказалось полная чушь |
Сообщ.
#28
,
|
|
|
Цитата antonsrv8, А это уже напоминает высокомерное издевательство над неопытным человеком Я о чём? Вот я неопытный человек. Я знаю, что фильтр должен что-то пропускать, а что-то задерживать (ослаблять). И чем Ваш пост помог мне? Чем он не "высокомерное издевательство"? Тем что Вы говорите про какие-то полюса, нули...? Если уж Вы критикуете кого-то за "высокомерное издевательство над неопытным человеком", то хотелось бы ожидать от Вас снисхождения к объекту Вашей заботы и понятного объяснения. |
Сообщ.
#29
,
|
|
|
Цитата Анатоль @ И чем Ваш пост помог мне? Чем он не "высокомерное издевательство"? я дал формулы АЧХ как функции частоты f. Постройте и увидите, что это фильтр, усиливающий высокие.Если А=1, то это просто 2*sin(PI*f/F), 0<f<F/2. А теперь постройте АЧХ по этим формулам: Цитата KoPoBuH @ Yt = A*(Xt - Xt-1) - B*Yt-1 A = y/(1+y) B = (1-y)/(1+y) y = cos(w)/sin(w) w = PI*f/fc ваще не понятно - А и В - это коэффициенты фильтра или функции частоты? Когда же объясните - я уже 3 раза прошу. Если бы А и В были константы, то всё понятно, только А бестолково усиливает, надо: Yt = Xt - А*Xt-1 - B*Yt-1 Про полюса, раз не знаете: Z преобразование от этого фильтра будет: Y = X - AX/Z - BY/Z, отсюда АЧХ в Z представлении: H(z) = Y/X = (1-A/z)/(1+B/z), то есть фильтр имеет ноль в z=A и полюс в z=-B. Оба действительные. Если А около 1, то будут давиться низкие частоты, около -1 - высокие (понятно, фильтр Yt = Xt + Xt-1 зануляет частоты около Найквиста). Если В стремится к 1, то будет пик на частоте Найквиста (без нуля фильтр будет Yt = Xt - Yt-1 - неустойчивый фильтр, усиливающий высокие) Ну, выложил все как на духу. Может теперь все таки объясните мне, что вы поняли в формулах Коровина - он не снисходит. Может iitta выскажется - он тоже заваривал эту кашу, в том числе про фильтрацию в частотной области |
Сообщ.
#30
,
|
|
|
Любой цифровой фильтр имеет вид Yt = A0Xt + A1Xt-1 + ... + B1Yt-1 + B2Yt-2 + ...
Aj и Bj некие костанты, вычисляются один раз исходя из требований частоты среза фильтра f - частота среза, fc - тактовая частота |
Сообщ.
#31
,
|
|
|
Цитата -unGod- @ Внес небольшие изменения в алгоритм: Массив частот FHZ раньше был до 12000, а теперь до 150 (поскольку 150 отсчетов в БПФ/2). Кол-во элеметов сделал 20. Частоты в Герцах. FHZ = [7,15,22,30,37,45,52,60,67,75,82,90,97,105,112,120,127,135,142,150]; Результат: Значительное улучшение распознавания приблизительно на 20..30%. У меня теперь слово "семь" распознает на 90% =) Также хорошо распознаются длинные команды: "наушники", "микрофон" Кто-нибудь может пояснить, я если честно не понял, это как так? Товарищь вот берёт массив FHZ = [7,15,22,30,37,45,52,60,67,75,82,90,97,105,112,120,127,135,142,150]; и усредняет по нему, но что это за массив частот, что это такое вообще? Ведь как я понял усредняют по массиву частот вплоть до частоты в половину частоты дискретизации, ведь надо усреднять по массиву частот, который corresponds to the first 24 critical bands of hearing? Разве можно усреднять по другому массиву, а не по 20, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300, 6400, 7700, 9500, 12000, 15500. Подскажите, пожалуйста? Или можно усреднять по любому массиву, в котором элементы изменяются по логорифму??? |
Сообщ.
#32
,
|
|
|
Цитата mjpronin, Или можно усреднять по любому массиву, в котором элементы изменяются по логорифму??? Вот именно. Причём и "усреднять" можно по разному. Например можно взять максимальное значение в каждой критической полосе. |
Сообщ.
#33
,
|
|
|
Поддерживаю Анатолия. Я проводил эксперимент. Брал звук делал БПФ патом выше указанные полосы- просто усреднял, усреднял по треугольной функции , брал просто максимумы , далее делал обратное преобразование и слушал какой вариант лучше. Мене показалось, что брать просто максимумы лучше, разборчивость речи была выше .
|
Сообщ.
#34
,
|
|
|
Цитата Fs = 12000 / 300; for j = 2:23 kj = round(FHZ(j) / Fs); kl = round(FHZ(j - 1) / Fs); kr = round(FHZ(j + 1) / Fs); l = kj - kl; r = kr - kj; Aj = 0; for i = 1:l mi = i / l; Aj = Aj + s_log(kl + i) * mi; end for i = 1:r - 1 mi = i / r; Aj = Aj + s_log(kr - i) * mi; end A(j) = Aj / (l + r - 1); end Что значит Цитата ?, т.е для каждого FHZ(j) складывать только наибольшее Aj.взять максимальное значение в каждой критической полосе Или Вы имеете в виду усреднять по массиву FHZ[] в котором брать элементы не граничные частоты (т.е. 100-200-300-400-510-630), а центральные (т.е. 50-150-250-350-450-570) Вот например при частоте дискретизации 22050 и при FFT-256точек (полученных из 512 точек сигнала) я использую реализацию предложенную Анатолем в предыдущих постах и темах т.е. то что в начале моего сообщения Цитата Fs = 11025 / 256; FHZ[22] = {20, 100, 200, 300, 400, 510, 630, 770, 920, 1080, 1270, 1480, 1720, 2000, 2320, 2700, 3150, 3700, 4400, 5300,6400,7700,9500}; //вплоть до 12000(не включая т.к. 11050 < 12000) Так каким образом мне улучшить качество распознования? Другой FHZ взять или Aj только максимальные складывать. |
Сообщ.
#35
,
|
|
|
Цитата Подскажите, пожалуйста? Или можно усреднять по любому массиву, в котором элементы изменяются по логорифму??? Обьясняю: 1) Берете общее кол-во отсчетов спектра. У меня это 300, но я взял 150, так как вторая половина симетрична. 2) Выбераете для себя кол-во СПЕКТРальных коефициентов (можете брать 20, как у меня). 3) Далее диапазон 150 разбиваете на 20 частей, тоесть 150/20=7.5. Чтобы небало дробной части я сделал так: FHZ = [7,15,22,30,37,45,52,60,67,75,82,90,97,105,112,120,127,135,142,150]; 4) Это частоты в Герцах. Я их перевел в "МЕЛы". По принципу: for i = 1:SPECT_KOEF_COL mel(i) = 1127 * log(1 + FHZ(i) / 700); end 5) В результате получил массив mel, который потом использовал сдесь: Fs = max(mel) / (N / 2); for j = 2:SPECT_KOEF_COL - 1 kj = round(mel(j) / Fs); kl = round(mel(j - 1) / Fs); kr = round(mel(j + 1) / Fs); l = kj - kl; r = kr - kj; Aj = 0; for i = 1:l mi = i / l; Aj = Aj + s(kl + i) * mi; end for i = 1:r - 1 mi = i / r; Aj = Aj + s(kr - i) * mi; end A(j) = Aj / (l + r - 1); end SPECT_KOEF_COL - кол-во СПЕКТРальных коеф. N - кол-во отсчетов в фурье (в данном случае = 300) Эта часть кода нужна для усреднения. Подробнее рассказать немогу так как сам неочень прошарен. 6) После усреднения нужно сделать логарифм. 7) И множете на COS-преобразование. |
Сообщ.
#36
,
|
|
|
Цитата antonsrv8 @ Может iitta выскажется - он тоже заваривал эту кашу, в том числе про фильтрацию в частотной области Нет уж, разбирайтесь сами. У человека корень висит в воздухе, а вы ему про нули и полюса. После фразы Цитата Анатоль @ И чем Ваш пост помог мне? Чем он не "высокомерное издевательство"? Тем что Вы говорите про какие-то полюса, нули...? могли бы догадаться, что здесь не до Z-преобразования. Вы бы ещё про интегрирование по вычетам рассказали. Человек считает, что что-то понял, ну и оставьте его в покое. Про фильтр (Yt = A*(Xt - Xt-1) - B*Yt-1) всё понятно, естественно, в вашей интерпретации. Коэффициент А не нужен. Делаем замену X'=AX и возвращаемя к нашим баранам. Полюс может позволить приблизить АЧХ к непрерывному случаю – линейный рост с частотой (на ограниченном участке) вместо sin(PI*f/F), который обеспечивает 6дб на октаву только с точностью первого члена разложения Тейлора (sin(PI*f/F)~PI*f/F), то есть на низких частотах. Все эти красоты довольно бесполезны и с вычитанием среднего кепстра вообще теряют смысл, учитывая, что согласно кривой равной громкости значение гармоник выше 4 кГц падает, простой фильтр Yt = Xt - АXt-1 может оказаться лучше даже для алгоритмов, в которых амплитуда гармоник имеет значение. Про фильтрацию в частотной области - я вообще не понимаю, о чём здесь спорить. Я прочитал об этом несколько лет назад в не помню какой статье (и даже не использовал – по статье выигрыш в несильных шумах невелик), вам рассказали на лекции. Это не предмет для спора – вам что, хотят доказать, что вы этого не слышали? В любом случае сведениям из приличной статьи я доверяю, а за мнение Коровина гроша ломаного не дам. Вы же не будете тратить время на то, чтобы проводить эксперименты или искать статью, чтобы что-то ему доказать? (Правильно – бесполезно). А без аргументов всё превращается в обычный бессмысленный спор: «я прав» - «нет я», дополненный высосанными из пальца глупостями, вроде особой простоты русского языка для распознавания. Займитесь лучше якобианами и VTLN-ами, не втягивайтесь в мелочные споры по пустякам – вы же подняли интересный вопрос. Мне очень понравилась та статья, на которую я ссылался: Sankaran Panchapagesan, Abeer Alwan, «Frequency Warping for VTLN and Speaker Adaptation by Linear Transformation of Standard MFCC», 2008. Преобразование MFCC коэффициентов сделано корректно, объяснены нелинейности и допущения + много ссылок. Мне кажется, что для русского языка метод VTLN должен быть особенно эффективен из-за рекордного разброса формант мужских и женских голосов. |
Сообщ.
#37
,
|
|
|
-unGod-
Спасибо, попробовал. Если честно получается примерно тот же результат, что и у меня раньше. Я делал так же, единственно только за исключением: использоваль другой массив FHZ Может быть кто-нибудь подскажет, а в чем физический смысл усреднения (например) до частоты 150Hz, если (например) FFT отражает сигнал вплоть до 11025Hz.(при частоте дискр. 22050Hz)? Цитата Анатоль @ Вот именно. Причём и "усреднять" можно по разному. Например можно взять максимальное значение в каждой критической полосе. Вы имеете ввиду для каждой полосы взять только наибольшее Aj? |
Сообщ.
#38
,
|
|
|
mjpronin, усреднение идет не до частоты 150 Гц, а до 150 отсчёта в преобразовании Фурье.
Этот отсчёт соответсвует частоте 11 кГц в теории, то есть максимальной для данной частоты дискретизации. На практике у -unGod- может быть все не так радужно. |
Сообщ.
#39
,
|
|
|
Цитата mjpronin, Вы имеете ввиду для каждой полосы взять только наибольшее Aj? Я не следил, что такое у Вас Aj. Пусть у Вас есть 128 (например) значений спектра (после БПФ). Вы разбиваете весь частотный диапазон на 20 (например) критических полос. В каждой полосе будет несколько значений спектра (чем шире полоса - тем больше). Из них берёте максимальное. |
Сообщ.
#40
,
|
|
|
Цитата Анатоль @ Я не следил, что такое у Вас Aj. Пусть у Вас есть 128 (например) значений спектра (после БПФ). Вы разбиваете весь частотный диапазон на 20 (например) критических полос. В каждой полосе будет несколько значений спектра (чем шире полоса - тем больше). Из них берёте максимальное. 1.Беру максимольное после применения триугольного фильтра, или в этом случаи можно обойтись вообще без применения триугольного фильтра. 2. Обязательно ли разбивать на критические полосы, которые имеют строгое соответствие шкале Барк 20, 100, 200, 300, 400, 510..... или можно отойти от этих граничных (рекомендованных) значений. |
Сообщ.
#41
,
|
|
|
Цитата mjpronin, или в этом случаи можно обойтись вообще без применения триугольного фильтра. Именно. Цитата mjpronin, Обязательно ли разбивать на критические полосы, которые имеют строгое соответствие шкале Барк 20, 100, 200, 300, 400, 510..... или можно отойти от этих граничных (рекомендованных) значений На критические полосы нужно разбивать. Критические полосы характеризуются не границами, а шириной. Границы и количество критических полос, которые надо брать ... здесь возможен нек. произвол. Но желательно, чтоб они перекрывали телефоннй диапазон (300-3000гц.) А лучше 150-5500гц. |
Сообщ.
#42
,
|
|
|
Цитата -unGod- @ 2 Обрезаю лишнее (шум) остается приблизительно 1/3 сигнала 3 Делю их на фреймы (кадры) по 20мс с перекрытием в 2/3 4 Сравнение с помощью DTW: D(x,y) = sqrt(sum( (x[i] - y[i])^2 ) ); x - входной вектор y - эталонный вектор словаря после вырезания шума длинна сигналов ведь всех разной будет, как это учесть? привести к общему виду? или это ненужно делать? и по 4 дальше в теме было написано что DTW неполностью реализован, как вы его изменили? |
Сообщ.
#43
,
|
|
|
Father, метод DTW я взял из Википедии, там хорошо расписано и код прилагается. То что я писал в самом первом посте про DTW - шопопало.
В конечном итоге сравнение я меня происходит следующим образом: 1 Получив матрицу Nх12 (N - кол-во фреймов). Получается для каждого фрейма по 12 КЕПСТРальных коефициентов. 2 Беру эту матрицу и сравниваю с эталонными (заранее сохраненными в файле например). 3 Сравнение посходит построчно. 1й с 1м, 2й со 2м, 3й с 3м и т д. Этот шаг какраз и делает та функция с Википедии. Например у нас есть входящий неизвестный фрейм (строчку матрицы) и 10 эталонных. Задача найти более подходящий. Другими словами, при сравнении с которым DTW вернет минимальное число. 4 Анализирую все N типов, и тот который встретился наиболее чаще и будет ответом. В итоге конечно никогда неполучится так что массивы будут всегда одного размера. У себя я ставил проверки. Если вдруг неизвесная команда больше эталонной, уменьшал вероятность. Незнаю как это обьяснить. Вобщем чем больше команда превосходила эталон по длине - тем меньше она на него была похожа. |
Сообщ.
#44
,
|
|
|
Народ, подскажите.
Обратил внимание на следкющую особенность, если так можно сказать. Вродебы при усреднении как по шкале барк так и по шкале мел исходят из одних и тех же соображений, но почему получается так, что: 1. При усреднении по барк ширина полос усредения в зависимости от частоты становится шире 2. При усреднении по мел наоборот - т.е. с увеличением частоты ширина полос уменьшается. Так какому ходу мысли надо следовать, ведь методы приводят к диаметрально противоположным выводам. Я так понимаю, с увеличением частоты чувствительность падает, можно усреднять грубее - по более широкой полосе, тогда из каких рассуждении результаты шкалы мел. |
Сообщ.
#45
,
|
|
|
Цитата mjpronin, 2. При усреднении по мел наоборот - т.е. с увеличением частоты ширина полос уменьшается. Увеличивается. |
Сообщ.
#46
,
|
|
|
Кто-нибудь обьясните пожалуйста для чего выполняется логарифмирование и зачем нужны кепстральные коэффициенты??почему нельзя также посчитать расстояние между спектральными???
|
Сообщ.
#47
,
|
|
|
Человек воспринимает громкость сигнала не пропорционально энергии, а пропорционально её логарифму.
Кепстральных коэфициентов меньше чем спектральных, они независымы и стойки к изменению амплитуды сигнала. |
Сообщ.
#48
,
|
|
|
Спасибо.
|
Сообщ.
#49
,
|
|
|
Подскажите,каким образом принимается решение о том что слово распознано,какие условия должны выполняться.И ещё пишут что,там 80 %,там 90 % распознования,что имеется ввиду??(10 раз сказал слово ->9 раз выполнились условия=90%? или например 10 раз сказал слово ->10 раз разница = 0.1 при максимальной разнице (например=1) =90%?? дайте ссылку на подробное описание алгоритма, а то я что то пока плаваю.
|
Сообщ.
#51
,
|
|
|
Цитата -unGod- @ 2 Обрезаю лишнее (шум) остается приблизительно 1/3 сигнала Как ты обрезаешь лишнее(шум)? Добавлено Цитата -unGod- @ 3.2 Умножаю фрейм на окно Хемминга. Формула: f(i) = y(i) * w(i), y(i) - исходный сигнал, w(i) - оконная функция: w(n) = 0.54 - 0.46 * cos(2 * pi * (n - 1) / (N - 1)); (n = 0..N) N - кол-во отсчетов оконной функции. Оно равно длине фрейма. -unGod-, Длина фрейма берется в байтах? т.е. в данном случае по 480 байт? |
Сообщ.
#52
,
|
|
|
Цитата Как ты обрезаешь лишнее(шум)? Звуковой файл (2 сек) с записанной командой содержит 2/3 тишины, ее я и обрезаю. Как это происходит: - подсчет мощности шума первого фрейма (будет использоватся как базовый) - подсчет мощности каждого след. фрейма, и откидывание его, до тех пор, пока мощность не станет как минимум раз в 20 выше, чем в базовом (это и будет началом команды) аналогично и для конца Цитата Длина фрейма берется в байтах? т.е. в данном случае по 480 байт? Длина фрейма берется в отсчетах. Оконная функция должна быть такойже длинны как и фрейм. У меня длинна фрейма была 240 отсчетов. |
Сообщ.
#53
,
|
|
|
-unGod- Вы не могли бы подсказать, как у Вас реализована порезка сигнала на фреймы? А то уже ищу, ищу, и понять не могу, как же это закодить. Хоть в общих чертах, что применяете.
|
Сообщ.
#54
,
|
|
|
Цитата KarpovDeniska @ Подскажите,каким образом принимается решение о том что слово распознано,какие условия должны выполняться.И ещё пишут что,там 80 %,там 90 % распознования,что имеется ввиду??(10 раз сказал слово ->9 раз выполнились условия=90%? или например 10 раз сказал слово ->10 раз разница = 0.1 при максимальной разнице (например=1) =90%?? дайте ссылку на подробное описание алгоритма, а то я что то пока плаваю. Приветствую всех!!! Меня интересует, тот же вопрос, что и в цитате, но указанная ссылка которую дал уважаемый MedEx, не робит. У кого есть, по данному вопросу инфа дайти плиз ссылку или может, кто обьеснит? Может уважаемый MedEx, даст еще ссылку рабочую? Заранее всем спасибо!!!! |
Сообщ.
#55
,
|
|
|
Если речь от DTW то первая ссылка в google
https://en.wikipedia.org/wiki/Dynamic_time_warping Критерий задаёте вы сами |
Сообщ.
#56
,
|
|
|
Я не пойму, как считается процент распознаваемого слова. Например, мы сказали слово один, нашли коэффециенты линейного предсказания или мел коэффициенты, сравнили с акустическими моделями построенные с помощью GMM, разных слов с помощью мин. дистанции Манахонолобиса или других подобных,если апроксимировали тремя гауссианоми, то в указанные переменные у нас сохраняются вероятностные значения совпадений дискриптора( коэффициентов линейного предсказания) слова(один) с имеющимися акустическими моделями, по максимальному значению принимается решение о произнесенном слове, если 80-90 процентов, то это слово значит принадлежит этой акустической модели, а эта акустическая модель слова (один). Я не пойму, что делать с значениями которые мы получили после вероятностного сравнения с акустическими моделями, если апроксимировали тремя гауссианами, то полученные значения разделяются на три гауссиана и получаем результаты совпаденией в каждый гауссиан, т.е в трех гауссианов, а если апроксимировали 2 гауссианами, то получаем результаты совпадений для 2 гауссианов. Чтобы получит общее число необходимо сложить, что ли все полученные значения совподений в разных гауссианов. Например в первом гауссиане мы получили 0,2, во втором 0,1, в третьем 0,6. То в результате мы получим вероятность 0,9 или не правильно? И как считают процент совподения? Например указывают, что слово один распознано с 90%, а слово два с 60%, это значит что ли, что слво один имеет вероятносное совпадение с акустической моделью равной 0,9, а слово два 0,6 и просто умножаем на 100% и получим процент распознавания 90% и 60%. Правильно ли, я понял? Примеры с опраксимацией 2 и тремя Гауссианами в приложении.
Прикреплённый файл2_Гауссиана.png (49,8 Кбайт, скачиваний: 441) Прикреплённый файл3Гауссиана.png (51,04 Кбайт, скачиваний: 395) |
Сообщ.
#57
,
|
|
|
сравниваете с разными моделями максимально охватывающие рапознаваниемые данные
где наибольшее совпадение с моделью - той модели и принадлежит распознаваемый кусок данных если у вас есть несколько критериев сравнения - то согласно теории вероятности вы перемножате между собой все критерии перед сравнением p.s. что бы критерий вероятности 0.0000089062 представить ввиде например 78% вам необходима точка отчёта которую вы можете получить обработав статистику распознавания вашими моделями |
Сообщ.
#58
,
|
|
|
Блин че, я туповат, уже месяца четыре пытаюсь найти ответ на этот вопрос и не могу. Метод критерия сравнения у меня один, это понятно, что если максимальное значение по мойму может принять 1(по теории вероятности) то это слово пренадлижит этой вероятности. Я не пойму, как считается процент достоверности распозноваемого слова, например после сравнения у меня получилось значение 0,86, что это означает, какой процент достоверно распознан?
С Уважением.М! |
Сообщ.
#59
,
|
|
|
если:
Цитата максимальное значение вероятности - 1,0 и Цитата после сравнения у меня получилось значение вероятности - 0,86 то получается речь идёт о схожести 86% =) Цитата не пойму, как считается процент распознаваемого слова я на самом деле не особо разбирался гаусянами, возможно такой вариант вам подойдёт: если у вас есть несколько моделей/классов - получается сумма верояностей этих классов 100% например для 5-ти классов получаеся N*(p1+p2+p3+p4+p5)=1.0, где N - некий коэфициент нормализации который можно посчитать 1.0/sum(P) теперь что бы привести вероятность P к нормальному виду можно уможить её на N |
Сообщ.
#60
,
|
|
|
Цитата zamir @ если: Цитата максимальное значение вероятности - 1,0 и Цитата после сравнения у меня получилось значение вероятности - 0,86 то получается речь идёт о схожести 86% =) Цитата не пойму, как считается процент распознаваемого слова я на самом деле не особо разбирался гаусянами, возможно такой вариант вам подойдёт: если у вас есть несколько моделей/классов - получается сумма верояностей этих классов 100% например для 5-ти классов получаеся N*(p1+p2+p3+p4+p5)=1.0, где N - некий коэфициент нормализации который можно посчитать 1.0/sum(P) теперь что бы привести вероятность P к нормальному виду можно уможить её на N БОЛЬШОЕ СПАСИБО zamir! Я так и догадывался, что все так считают, но в литературе сколько искал, так и нечего не находил. Максимально, что находил, это пример в Матлабе, какие функции используют для сравнения и все. У меня еще куча вопросов, что бы разьяснить кашу в моей голове. Я не пойму, есть у меня например акустические модели произнесенных цифр 1,2,4,6, как создается файл (так называемый словарь) с этими акустичечкими моделями? С Уважение.М! |
Сообщ.
#61
,
|
|
|
Пожалуйста =)
Цитата есть у меня например акустические модели произнесенных цифр 1,2,4,6, как создается файл (так называемый словарь) с этими акустичечкими моделями? формат файла с моделями может быть любой. главное что бы информации было достаточно для восстановления модели. зачастую в готовых библиотеках есть функции сохранения моделей и восстановления моделей. по matlab у меня нет того опыта, который позволил бы ответить на ваш вопрос. |
Сообщ.
#62
,
|
|
|
Я думал,что мы построили например акустическую модель GMM и сохраняем в какойто общий фаил все модели. А тут, информация для востановления, про это я не че не слышал, может есть литература где про это поподробней можно прочесть?
С Уважением.М! |
Сообщ.
#63
,
|
|
|
Приветствую всех! Что, не кто не поделится литературой?
с Уважением.М! |