Оглавление.

Введение. Общие вопросы компьютерного распознавания и порождения речи.

1. Программирование звука в Windows.

2. Основы цифровой обработки звуковых сигналов.

3. Определение параметров речевого сигнала.

4. Алгоритмы распознавания.

5. Использование Microsoft Speech API 5.1 для синтеза и распознавания речи.

6. Использование Microsoft Speech API 4.0 для синтеза речи.

Ссылки.

Об авторе.

Компьютерное распознавание и порождение речи

Глава 2. Основы цифровой обработки звуковых сигналов.

Назад В начало главы Дальше

2.5. Цифровая фильтрация.

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

Различают фильтры нижних частот, фильтры верхних частот, полосовые фильтры и полосо-заграждающие фильтры ( также называемые режекторными или фильтрами-пробками).

Фильтры нижних частот пропускают составляющие сигналов с частотой ниже некоторого значения, называемого частотой останова, и задерживает составляющий с частотой выше этого значения.

Фильтры верхних частот пропускают составляющие с частотой выше частоты останова значения и задерживают составляющие с частотой ниже частоты останова.

Полосовые и полосо-заграждающие фильтры соответственно пропускают или задерживают составляющие сигнала, находящиеся в некотором интервале (полосе) частот.

Итак, линейная цифровой фильтр - это некая линейная система, которая поэтому может характеризоваться, во-первых, таким понятием как импульсная характеристика, которая применительно к фильтрам также часто называется ядром фильтра. Отфильтрованный сигнал, таким образом, может быть получен сверткой исходного сигнала с ядром фильтра.

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

Важными характеристиками фильтра являются реакция на скачок и частотная характеристика. Так же как импульсная характеристика – выход системы(фильтра) при подаче на ее вход единичного импульса, реакция на скачок – это выход системы (фильтра) при подаче на ее вход ступенчатой функции с единичной амплитудой, то есть такой функции, для которой все значения до нулевого отсчета равны нулю, а все значения, начиная с нулевого отсчета, равны единице. Частотной характеристикой фильтра называют функцию, полученную преобразованием Фурье из импульсной характеристики.

Качество фильтра характеризуют следующие показатели:

1) время нарастания – определяется по реакции на скачок посредством подсчета числа отсчетов, находящихся на интервале, в котором амплитуда увеличивается с 0.1 до 0.9.

2) отсутствие перерегулирования – то есть явления, при котором сигнал в реакции на скачок принимает значения ниже 0 или выше 1.

3) ширина полосы останова – то есть участка частотной характеристики, на котором значение амплитуды вырастает (для фильтра верхних частот) или убывает (для фильтра нижних частот) на 0.707 своего значения (то есть на 3 дБ). Хороший фильтр характеризуется узкой полосой останова.

4) отсутствие неравномерности полосы пропускания (неравномерности пульсации, ряби).

Чтобы разрабатывать фильтры верхних частот, полосовые или режекторные фильтры, необходимо уметь

1) разрабатывать фильтры нижних частот.

2) уметь из фильтров нижних частот получать фильтры верхних частот, а из тех и других – полосовые и режекторные фильтры.

О том как разработать цифровой фильтр нижних частот речь пойдет ниже. Сейчас же внесем пояснения по второму пункту.

Существуют два способа преобразования фильтра нижних частот в фильтр верхних частот с той же частотой останова.

Первый способ, так называемая спектральная инверсия.

Предположим входной сигнал x[n] разлагается на высокочастотный сигнал x1[n] и низкочастотный x2[n]:

x[n]= x1[n]+ x2[n]

Пусть для получения низкочастотного сигнала использовался фильтр с ядром h2[n], то есть

x[n]* h2[n]= x2[n]

Мы знаем также следующее свойство свертки:

x[n]* δ[n]= x[n]

Тогда

х1[n]= x[n]- x2[n]= x[n]* δ[n]- x[n]* h2[n]= x[n]* (δ[n]- h2[n])

То есть ядро фильтра высоких частот

h1[n]= δ[n]- h2[n]

Таким образом, метод спектральной инверсии заключается в получении ядра фильтра высоких частот из ядра фильтра низких частот с той же частотой останова путем прибавления к дельта-функции инвертированного (взятого со знаком минус) ядра низкочастотного фильтра.

Второй способ получения ядра высокочастотного фильтра из ядра низкочастотного называется спектральным реверсированием. Этот метод состоит в том, что в ядре фильтра низкой частоты амплитуда каждого второго отсчета умножается на (-1). Результат и будет ядром фильтра высокой частоты. Это явление объясняется тем, что умножение каждой второй амплитуды на (-1) эквивалентно умножению ядра фильтра синусоидой с частотой 0.5. При этом частота останова f1 будет равна (0.5-f2), где f2 –частота останова для исходного фильтра нижних частот.


! Здесь и далее значения частот между 0 и 1 обозначают частоту равную доле частоты дискретизации (под частотой дискретизации понимаем количество отсчетов в единицу времени). Например, при частоте дискретизации 16000 отсчетов в секунду, частота 0.5 означает 8000 отсчетов в секунду. Для частотного домена полученного преобразованием Фурье из домена времени все частоты будут лежать в интервале между 0(постоянный сигнал) и 0.5(половина частоты дискретизации). Поэтому для записи звукового, в частности речевого сигнала, частота дискретизации должна как минимум в два раза превышать максимальную возможную частоту речевого сигнала.
Методика получения полосовых фильтров следующая. Пусть требуется получить фильтр пропускающий составляющие сигнала с частотами f1<=f<=f2. Сначала получаем ядро фильтра h2 низких частот с частотой останова f2 и ядро фильтра h1 высоких частот c частотой останова f1. Ядро h полосового фильтра получается сверткой ядра h2 и h1:

h[n]= h2[n]*h1[n]

Для полосо-заградительных фильтров методика похожая. Пусть нам, наоборот, требуется подавить составляющие сигнала в частотах f1<=f<=f2, h2- ядро фильтра низких, а h1 - высоких частот. Тогда ядро режекторного фильтра получают сложением ядер h2 и h1:

h[n]= h2[n]+h1[n]

Существуют четыре основных вида фильтров: фильтры скользящего среднего, оконные sinc-фильтры и рекурсивные фильтры однополюсные и Чебышева. В таблице приведены сравнительные характеристики этих фильтров.

Вид фильтра Ширина полосы останова Неравномерность полосы пропусканияСкоростьСложность
Скользящего среднего Широкая Полоса равномерная Высокая Низкая
Оконные sinc-фильтры Узкая Полоса неравномерная Средняя Средняя
Однополюсные рекурсивные Широкая Полоса равномерная Высокая Низкая
Рекурсивные Чебышева Средняя Полоса неравномерная Средняя Средняя

Вообще говоря, фильтры скользящего среднего и однополюсные рекурсивные применяются, главным образом для устранения искажения в сигнале, их сглаживания. Фильтры же оконные sinc и Чебышева применяются для выделения составляющих сигнала с определенными частотами. Причем, если раньше имело смысл иногда жертвовать качеством фильтра Чебышева для его более высокой по сравнению с sinc-фильтром скорости работы, то теперь, когдо вычислительные мощности значительно выросли, необходимость фильтров Чебышева для наших задач можно ставить под сомнение. Во всяком подробно мы его рассматривать не будем.

Фильтр скользящего среднего работает усреднением ряда точек входного сигнала:
M-1(M-1)/2
y[n]=(1/M)x[n+i] или y[n]=(1/M)x[n+i]
i=0i=-(M-1)/2

где M- число точек в среднем. Частотные характеристики фильтра скользящего среднего просто ужасные и он используется только для сглаживания сигналов.

Как раз sinc-фильтры являются идеальными в смысле частотной характеристики.

Если взять частотную характеристику со стопроцентным завалом, то есть ширина полосы останова которой равна нулю, затем взять от нее обратное преобразование Фурье, то мы получим ядро идеального фильтра нижних частот. Это будет кривая функции называемой sinc-функцией и равной в общем случае отношению sin(x)/x. В нашем случае ядро идеального фильтра нижних частот с частотой останова f имеет следующий вид:

h[n]= sin(2πfn)/(πn)

К сожалению, это идеальное ядро имеет бесконечную длину, поэтому нам придется использовать некоторые приближенные функции, дающие ядро конечной длины. Для начала «обрежем» sinc-функцию (которая симметрична вокруг точки с максимальной амплитудой) с обеих сторон на оси на одинаковом расстоянии от точки c максимальной амплитудой. Значения справа и слева от оставшегося куска ядра приравняем нулю. Если пропустить сигнал через получившийся фильтр, мы обнаружим сильную рябь в полосе пропускания и плохое ослабление вне этой полосы. Чтобы избавиться от этого, полученное ядро умножают на некую «оконную» функцию, которая приводит к сглаживанию частотной характеристики. В качестве «оконной» функции используют так называемое окно Блэкмана или окно Хэмминга. Окно Блэкмана имеет формулу

z[n]=0.42-0.5cos(2πn/(M-1))+0.8cos(4πn/(M-1)),

где M – число точек ядра фильтра. Окно Хэмминга имеет формулу

z[n]=0.54-0.46cos(2πn/(M-1)).

Значение M на практике вычисляется как округленный до целого результат деления 4 на желаемую ширину полосы задержки (значение между 0 и 0.5).
Приводим функцию на языке Си для функции вычисления фильтра с применением окна Блэкмана и фильтрации входящего сигнала.


// Применение sinc-фильтра нижних частот. Возвращает фильтрованный сигнал
// nF – частота фильтрации, значение из промежутка от 0 до 0.5
// N – число элементов массива исходного сигнала
// x – массив значений исходного сигнала
// BW – ширина промежуточной полосы, значение из промежутка от 0 до 0.5
double* FilterLF(double nF, int N, double *x, double BW)
{
int M=4/BW-fmod(4,BW);
double* Kernel=(double*)malloc(M*sizeof(double));

if (fmod(M,2)>0)
{
M++;
}
for(int i=0;i {
if((i-M/2)!=0)
{
Kernel[i]=sin(2*pi*nF*(i-M/2))*(0.42-0.5*cos(2*pi*i/M)+0.08*cos(4*pi/M))/(i-M/2);
}
else
{
Kernel[i]=2*pi*nF*(0.42-0.5*cos(2*pi*i/M)+0.08*cos(4*pi/M));
}
}
double dSum;
for(i=0;i {
dSum+=Kernel[i];
}
for(i=0;i {
Kernel[i]/=dSum;
}
return(Convolution(x,N,Kernel,M));
}

Функция для окна Хэмминга строится по аналогии.

Теперь несколько слов о рекурсивных фильтрах. Механизм рекурсивной фильтрации не требует построения ядра фильтра с тем, чтобы потом свертывать с ним исходный сигнал.
В данном случае используется некоторое выражение, которое позволяет вычислить значение амплитуды любого отсчета фильтрованного сигнала по значениям амплитуд отдельных отсчетов в исходном сигнале и значениям амплитуд отдельных уже вычисленных отсчетов фильтрованного сигнала. То есть решением обычно ищется в виде:

y[n]=a0x[n]+ a1x[n-1]+ a2x[n-2]+…+ b1y[n-1]+ b2y[n-2]+…

На практике полином ограничивают лишь несколькими членами. В частности для однополюсного рекурсивного фильтра верхних частот выражение будет иметь вид:

y[n]=a0x[n]+ a1x[n-1]+ b1y[n-1]

Вводится понятие количества затухания между отсчетами

z=exp{-1/d},

где d – число отсчетов, которое нужно фильтру нижних частот, чтобы затухнуть до 0.368 минимального значения амплитуды.
Количество затухания может быть получено из частоты останова f ( между 0 и 0.5) по формуле

z=exp{-2πf}

Тогда коэффициенты для рекурсивного фильтра нижних частот можно получить по формулам:

a0=1-z
a1=0
b1=z

Kоэффициенты для рекурсивного фильтра верхних частот можно получить по формулам:

a0=(1-z)/2
a1=-(1-z)/2
b1=z

Для полосовых и режекторных фильтров вводят вспомогательные переменные:

R=1-3B
K=(1-2Rcos(2πf)+R2)/(2-2cos(2πf)),

где B – ширина полосы пропускания (задержки) фильтра, f – на сей раз частота середины полосы пропускания( задержки) – значение между 0 и 0.5.

Для полосовых рекурсивных фильтров пользуются формулами

a0=1-K
a1=2(K-R)cos(2πf)
a2=R2-K
b1=2Rcos(2πf)
b2=-R2

Для режекторного фильтра формулы примут вид:

a0=K
a1=-2Kcos(2πf)
a2=K
b1=2Rcos(2πf)
b2=-R2


Распознавание речи. Обработка текстов на естественном языке.
Hosted by uCoz